
- SQL 教程
- SQL - 首頁
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 資料庫
- SQL - 語法
- SQL - 資料型別
- SQL - 運算子
- SQL - 表示式
- SQL 資料庫
- SQL - 建立資料庫
- SQL - 刪除資料庫
- SQL - 選擇資料庫
- SQL - 重新命名資料庫
- SQL - 顯示資料庫
- SQL - 備份資料庫
- SQL 表
- SQL - 建立表
- SQL - 顯示錶
- SQL - 重命名錶
- SQL - 截斷表
- SQL - 克隆表
- SQL - 臨時表
- SQL - 修改表
- SQL - 刪除表
- SQL - 刪除表資料
- SQL - 約束
- SQL 查詢
- SQL - INSERT 查詢
- SQL - SELECT 查詢
- SQL - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - UPDATE 查詢
- SQL - DELETE 查詢
- SQL - 排序結果
- SQL 檢視
- SQL - 建立檢視
- SQL - 更新檢視
- SQL - 刪除檢視
- SQL - 重新命名檢視
- SQL 運算子和子句
- SQL - WHERE 子句
- SQL - TOP 子句
- SQL - DISTINCT 子句
- SQL - ORDER BY 子句
- SQL - GROUP BY 子句
- SQL - HAVING 子句
- SQL - AND & OR
- SQL - 布林 (BIT) 運算子
- SQL - LIKE 運算子
- SQL - IN 運算子
- SQL - ANY, ALL 運算子
- SQL - EXISTS 運算子
- SQL - CASE
- SQL - NOT 運算子
- SQL - 不等於
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 運算子
- SQL - UNION 運算子
- SQL - UNION vs UNION ALL
- SQL - INTERSECT 運算子
- SQL - EXCEPT 運算子
- SQL - 別名
- SQL 連線
- SQL - 使用連線
- SQL - 內連線
- SQL - 左連線
- SQL - 右連線
- SQL - 交叉連線
- SQL - 全連線
- SQL - 自連線
- SQL - DELETE 連線
- SQL - UPDATE 連線
- SQL - 左連線 vs 右連線
- SQL - UNION vs 連線
- SQL 金鑰
- SQL - 唯一鍵
- SQL - 主鍵
- SQL - 外部索引鍵
- SQL - 組合鍵
- SQL - 備選鍵
- SQL 索引
- SQL - 索引
- SQL - 建立索引
- SQL - 刪除索引
- SQL - 顯示索引
- SQL - 唯一索引
- SQL - 聚集索引
- SQL - 非聚集索引
- 高階 SQL
- SQL - 萬用字元
- SQL - 註釋
- SQL - 注入
- SQL - 託管
- SQL - MIN & MAX
- SQL - NULL 函式
- SQL - CHECK 約束
- SQL - DEFAULT 約束
- SQL - 儲存過程
- SQL - NULL 值
- SQL - 事務
- SQL - 子查詢
- SQL - 處理重複項
- SQL - 使用序列
- SQL - 自動遞增
- SQL - 日期和時間
- SQL - 遊標
- SQL - 公共表表達式
- SQL - GROUP BY vs ORDER BY
- SQL - IN vs EXISTS
- SQL - 資料庫調優
- SQL 函式參考
- SQL - 日期函式
- SQL - 字串函式
- SQL - 聚合函式
- SQL - 數值函式
- SQL - 文字和影像函式
- SQL - 統計函式
- SQL - 邏輯函式
- SQL - 遊標函式
- SQL - JSON 函式
- SQL - 轉換函式
- SQL - 資料型別函式
- SQL 有用資源
- SQL - 問答
- SQL - 快速指南
- SQL - 有用函式
- SQL - 有用資源
- SQL - 討論
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 語句未返回的行。