在處理數據時,有時我們需要將來自不同表或同一表的不同查詢結果合并在一起。例如:
- 合并兩個部門的員工名單;
- 將多個地區的銷售數據匯總;
- 顯示某段時間內所有新增和修改的記錄。
這時候,我們就需要用到 SQL 中非常強大的兩個關鍵字 —— UNION
和 UNION ALL
!
它們可以幫助我們輕松地將多個查詢結果集合并為一個結果集,但兩者之間有一些關鍵的區別需要注意。
一、什么是 UNION 和 UNION ALL?
UNION
:用于合并兩個或多個?SELECT
?語句的結果集,并自動去除重復行。UNION ALL
:也用于合并兩個或多個?SELECT
?語句的結果集,但它不會去除重復行。
你可以把它們理解為:“將不同的查詢結果合并成一個大集合”。
二、基本語法
SELECT column1, column2, ...
FROM table1
UNION [ALL]
SELECT column1, column2, ...
FROM table2;
- 必須保證每個?
SELECT
?語句中的列數相同,且對應列的數據類型兼容。 UNION
?默認會去除重復行,而?UNION ALL
?則保留所有行。
三、示例講解
假設我們有兩個表:employees_north
和 employees_south
,分別存儲了北部和南部地區員工的信息。
表:employees_north
id | name |
---|---|
1 | 張三 |
2 | 李四 |
表:employees_south
id | name |
---|---|
3 | 王五 |
4 | 李四 |
示例1:使用 UNION 合并兩個表的數據(去重)
SELECT name FROM employees_north
UNION
SELECT name FROM employees_south;
結果:
name |
---|
張三 |
李四 |
王五 |
?這里使用 UNION
自動去除了重復的名字“李四”。
?示例2:使用 UNION ALL 保留所有數據(含重復)
SELECT name FROM employees_north
UNION ALL
SELECT name FROM employees_south;
結果:
name |
---|
張三 |
李四 |
王五 |
李四 |
?這里使用 UNION ALL
保留了所有的記錄,包括重復的名字“李四”。
?示例3:結合 WHERE 和 ORDER BY 使用
-- 查找名字以“張”開頭的所有員工,并按名字排序
(SELECT name FROM employees_north WHERE name LIKE '張%')
UNION
(SELECT name FROM employees_south WHERE name LIKE '張%')
ORDER BY name;
結果:
name |
---|
張三 |
先篩選出符合條件的記錄,再進行合并并排序。
?示例4:多列合并(注意列數和順序一致性)
假設我們有兩張表 orders_2024
和 orders_2025
,結構如下:
表:orders_2024
order_id | product | amount |
---|---|---|
1 | 手機 | 2999 |
2 | 耳機 | 499 |
表:orders_2025
order_id | product | amount |
---|---|---|
3 | 鼠標 | 199 |
4 | 鍵盤 | 399 |
SELECT * FROM orders_2024
UNION ALL
SELECT * FROM orders_2025;
結果:
order_id | product | amount |
---|---|---|
1 | 手機 | 2999 |
2 | 耳機 | 499 |
3 | 鼠標 | 199 |
4 | 鍵盤 | 399 |
?注意:UNION
或 UNION ALL
合并時,必須確保每個 SELECT
語句返回的列數一致,并且對應的列類型兼容。
注意
對比項 | UNION | UNION ALL |
---|---|---|
是否去重 | 是 | 否 |
性能 | 較慢(需要額外的去重操作) | 更快 |
使用場景 | 當你需要唯一值時 | 當你不介意重復值時 |
?? 注意:使用
UNION
時,數據庫需要對結果集進行排序和去重,這可能會消耗更多資源。如果不需要去重,建議優先使用UNION ALL
提高性能。
四、總結對比表
場景 | SQL 示例 |
---|---|
合并兩表數據(去重) | SELECT name FROM table1 UNION SELECT name FROM table2; |
合并兩表數據(含重復) | SELECT name FROM table1 UNION ALL SELECT name FROM table2; |
多列合并 | SELECT col1, col2 FROM table1 UNION ALL SELECT col1, col2 FROM table2; |
結合篩選條件 | (SELECT name FROM table1 WHERE condition) UNION (SELECT name FROM table2 WHERE condition) |