SQL - UNION 運算子



SQL UNION 運算子

SQL UNION 運算子用於組合來自多個表的資料,同時消除重複行(如有)。

要在多個表上使用 UNION 運算子,所有這些表都必須是聯合相容的。當且僅當它們滿足以下條件時,才被稱為聯合相容:

  • 選擇具有相同資料型別的相同列數。
  • 這些列的順序也必須相同。
  • 它們不需要具有相同的行數。

滿足這些條件後,UNION 運算子將來自多個表的行作為結果表返回,該結果表不包含這些表中的所有重複值。

最終結果集中的列名將基於第一個 SELECT 語句中選擇的列名。如果要在最終結果集中為列使用不同的名稱,可以在 SELECT 語句中使用別名。

語法

UNION 運算子的基本語法如下:

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition];

此處,給定條件可以是基於您需求的任何給定表示式。

單個欄位上的 UNION

如果要使用 UNION 組合單個欄位上兩個或多個 SELECT 語句的結果集,可以簡單地在每個查詢的 SELECT 語句中包含該欄位。UNION 運算子將自動刪除最終結果集中的任何重複值。

在單個欄位上使用 UNION 時,結果集中的列名將由第一個 SELECT 語句中的列名確定。因此,可能需要在 SELECT 語句中使用別名,以確保列名對最終結果集有意義。

示例

假設我們使用 CREATE TABLE 語句在 MySQL 資料庫中建立了一個名為 CUSTOMERS 的表,如下所示:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);

以下查詢使用 INSERT 語句將值插入此表:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

CUSTOMERS 表如下所示:

ID 姓名 年齡 地址 薪水
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

現在,使用 CREATE TABLE 語句建立第二個表 ORDERS,如下所示:

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE DATETIME NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT INT NOT NULL,      
   PRIMARY KEY (OID)
);

以下查詢使用 INSERT 語句將值插入此表:

INSERT INTO ORDERS VALUES
(102, '2009-10-08 00:00:00', 3, 3000),
(100, '2009-10-08 00:00:00', 3, 1500),
(101, '2009-11-20 00:00:00', 2, 1560),
(103, '2008-05-20 00:00:00', 4, 2060);

ORDERS 表如下所示:

OID 日期 客戶ID 金額
102 2009-10-08 00:00:00 3 3000.00
100 2009-10-08 00:00:00 3 1500.00
101 2009-11-20 00:00:00 2 1560.00
103 2008-05-20 00:00:00 4 2060.00

使用以下查詢,讓我們組合來自 CUSTOMERS 和 ORDERS 表的 SALARY 和 AMOUNT 列(因為這些列具有相似的資料型別):

SELECT SALARY FROM CUSTOMERS UNION SELECT AMOUNT FROM ORDERS;

輸出

以上查詢的輸出如下:

薪水
2000.00
1500.00
6500.00
8500.00
4500.00
10000.00
3000.00
1560.00
2060.00

多個欄位上的 UNION

當我們在多個欄位上使用 UNION 時,每個 SELECT 語句中的欄位數量和順序必須匹配。此外,每個 SELECT 語句中欄位的資料型別必須相容才能使 UNION 正確工作。如果資料型別不相容,則可能需要使用轉換函式(如 CAST 或 CONVERT)來確保資料型別匹配。

示例

由於 CUSTOMERS 和 ORDERS 表本身並不相容聯合,讓我們首先使用左連線和右連線將這兩個表連線到一個更大的表中。檢索到的連線表將具有相同數量的列和相同的資料型別,從而成為聯合相容的。現在,這些表使用以下所示的 UNION 查詢組合:

SELECT  ID, NAME, AMOUNT, DATE FROM CUSTOMERS
LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
UNION
SELECT  ID, NAME, AMOUNT, DATE FROM CUSTOMERS
RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

輸出

這將產生以下結果:

ID 姓名 金額 日期
1 Ramesh NULL NULL
2 Khilan 1560 2009-11-20 00:00:00
3 Kaushik 3000 2009-10-08 00:00:00
3 Kaushik 1500 2009-10-08 00:00:00
4 Chaitali 2060 2008-05-20 00:00:00
5 Hardik NULL NULL
6 Komal NULL NULL
7 Muffy NULL NULL

帶有 WHERE 子句的 UNION

我們可以將 WHERE 子句與 UNION 運算子一起使用,以在組合之前篩選每個 SELECT 語句的結果。

語法

以下是將 WHERE 子句與 UNION 運算子一起使用的語法:

SELECT column1, column2, column3
FROM table1
WHERE column1 = 'value1'
UNION
SELECT column1, column2, column3
FROM table2
WHERE column1 = 'value2';

示例

在以下查詢中,我們分別從“CUSTOMERS”和“ORDERS”表中檢索 ID 大於 5 和 2 的客戶的 ID:

SELECT ID, SALARY FROM CUSTOMERS WHERE ID > 5
UNION
SELECT CUSTOMER_ID, AMOUNT FROM ORDERS WHERE CUSTOMER_ID > 2;

輸出

以下是產生的結果:

ID 薪水
6 4500.00
7 10000.00
3 3000.00
3 1500.00
4 2060.00

帶有 ORDER BY 子句的 UNION

當我們將 ORDER BY 子句與 UNION 一起使用時,它會組合所有 SELECT 語句的排序結果集,併產生單個排序結果集。

示例

在這裡,我們分別從“CUSTOMERS”和“ORDERS”表中檢索 ID 大於 5 和 2 的客戶的 ID,按其薪水從低到高排序:

SELECT ID, SALARY FROM CUSTOMERS WHERE ID > 5
UNION
SELECT CUSTOMER_ID, AMOUNT FROM ORDERS WHERE CUSTOMER_ID > 2
ORDER BY SALARY;

輸出

以下是以上查詢的輸出:

ID 薪水
3 1500.00
4 2060.00
3 3000.00
6 4500.00
7 10000.00
UNION 語句中的 ORDER BY 子句適用於整個結果集,而不僅僅是最後一個 SELECT 語句。

帶有別名的 UNION

我們可以在 UNION 運算子的 SELECT 語句中使用別名來為表或列賦予臨時名稱,這在處理具有相似名稱的多個表或列時非常有用。

使用帶有別名的 UNION 時,需要注意的是,列別名由第一個 SELECT 語句確定。因此,如果要在不同的 SELECT 語句中為同一列使用不同的別名,則需要在所有 SELECT 語句中使用列別名,以確保最終結果集中列名的前後一致性。

語法

以下是使用帶有別名的 Union 的語法:

SELECT column1 AS alias1, column2 AS alias2
FROM table1
UNION
SELECT column3 AS alias1, column4 AS alias2
FROM table2;

示例

以下查詢檢索兩個表中的所有 ID,以及每個 ID 是客戶還是他們所下訂單的指示:

SELECT ID, 'customer' AS type FROM CUSTOMERS
UNION
SELECT OID, 'order' AS type FROM ORDERS;

輸出

以下是產生的輸出:

ID 型別
1 客戶
2 客戶
3 客戶
4 客戶
5 客戶
6 客戶
7 客戶
100 訂單
101 訂單
102 訂單
103 訂單

還有其他兩個運算子類似於 UNION 運算子。

  • SQL INTERSECT 運算子 - 它用於組合兩個 SELECT 語句,但僅返回第一個 SELECT 語句中與第二個 SELECT 語句中的行相同的行。

  • SQL EXCEPT 運算子 - 它組合兩個 SELECT 語句,並返回第一個 SELECT 語句中第二個 SELECT 語句未返回的行。

廣告