SQL UNION:合併多個查詢結果的技巧
更新日期: 2025 年 3 月 4 日
在 SQL 查詢中,我們有時會需要將 多個查詢結果合併 為一個統一的結果集。例如:
- 你希望查詢兩個不同的表,並將結果合併顯示 📊
- 你需要從同一張表中查詢不同條件的結果,並整合成一個結果集 🏷️
- 你想合併來自不同數據來源的數據 🔗
在這些情境中,SQL 提供了一個強大的工具:UNION
。
它允許我們將多個 SELECT
查詢的結果合併,形成一個統一的結果集,並且自動去除重複的記錄。
本篇文章將詳細介紹 SQL UNION
的基本語法、使用條件、變體 UNION ALL
的差異,以及應用場景,讓你能夠靈活運用這個 SQL 技巧!🚀
UNION
的基本語法
UNION
用來合併多個 SELECT
查詢的結果,但要求所有的 SELECT
查詢:
- 必須有相同的欄位數量
- 對應的欄位數據類型必須相同
基本語法
SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;
📌 注意:
UNION
會自動去除重複的記錄。- 若要保留所有記錄(包括重複的),應該使用
UNION ALL
。
UNION
的基本應用
合併兩個表的查詢結果
假設我們有兩張表:
Customers_USA
(美國客戶)
CustomerID | Name | Country |
---|---|---|
1 | Alice | USA |
2 | Bob | USA |
3 | Charlie | USA |
Customers_EU
(歐洲客戶)
CustomerID | Name | Country |
---|---|---|
4 | David | UK |
5 | Emma | Germany |
6 | Alice | USA |
我們希望將這兩張表的客戶合併成一個清單:
SELECT CustomerID, Name, Country FROM Customers_USA
UNION
SELECT CustomerID, Name, Country FROM Customers_EU;
🔹 結果(去除重複值):
CustomerID | Name | Country |
---|---|---|
1 | Alice | USA |
2 | Bob | USA |
3 | Charlie | USA |
4 | David | UK |
5 | Emma | Germany |
6 | Alice | USA |
📌 解釋
Alice
在Customers_USA
和Customers_EU
都有,但UNION
自動去除了重複記錄。
UNION ALL
:保留重複記錄
如果我們希望保留所有記錄,包括重複的數據,可以使用 UNION ALL
:
SELECT CustomerID, Name, Country FROM Customers_USA
UNION ALL
SELECT CustomerID, Name, Country FROM Customers_EU;
🔹 結果(包含重複值):
CustomerID | Name | Country |
---|---|---|
1 | Alice | USA |
2 | Bob | USA |
3 | Charlie | USA |
4 | David | UK |
5 | Emma | Germany |
6 | Alice | USA |
📌 解釋
UNION ALL
不會去重,會完整合併所有的查詢結果。Alice
在Customers_USA
和Customers_EU
各出現一次,UNION ALL
保留兩筆記錄。
UNION
的條件與限制
SELECT
查詢的欄位數量必須相同
錯誤範例:
SELECT CustomerID, Name FROM Customers_USA
UNION
SELECT CustomerID, Name, Country FROM Customers_EU; -- 錯誤!不同行數
📌 解決方案:確保 SELECT
查詢返回的欄位數量相同。
欄位的數據類型必須相同
錯誤範例:
SELECT Name, Age FROM Customers_USA -- Age 是數字
UNION
SELECT Name, Birthdate FROM Customers_EU; -- Birthdate 是日期,類型不匹配
📌 解決方案:確保欄位的數據類型一致,或使用 CAST()
轉換數據類型:
SELECT Name, CAST(Age AS VARCHAR) FROM Customers_USA
UNION
SELECT Name, CAST(Birthdate AS VARCHAR) FROM Customers_EU;
ORDER BY
在 UNION
查詢中的使用
如果我們希望合併後的結果按照特定欄位排序:
SELECT CustomerID, Name, Country FROM Customers_USA
UNION
SELECT CustomerID, Name, Country FROM Customers_EU
ORDER BY Name ASC;
📌 注意
ORDER BY
只能出現在最後一個SELECT
查詢的外部,不能放在每個SELECT
裡面。
UNION
的應用場景
應用場景 | 解決方案 |
---|---|
合併多個表的相同數據 | 使用 UNION |
合併同一張表的不同條件數據 | 使用 UNION |
保留所有數據,包括重複數據 | 使用 UNION ALL |
合併不同來源的數據 | 使用 UNION |
UNION
vs JOIN
的區別
許多初學者會混淆 UNION
和 JOIN
,這兩者的作用不同:
特性 | UNION | JOIN |
---|---|---|
作用 | 合併相同結構的數據 | 將兩個表關聯在一起 |
欄位要求 | SELECT 查詢的欄位數量與類型必須相同 | 透過關聯欄位(如 id)來連結不同表 |
是否去重 | UNION 會去重,UNION ALL 不會 | JOIN 會根據匹配條件決定返回的結果 |
結語
SQL 的 UNION
是一個強大的工具,能夠幫助我們將多個 SELECT
查詢的結果合併成一個結果集:
UNION
會自動去除重複記錄。UNION ALL
會保留所有記錄(包括重複的)。- 必須確保
SELECT
查詢的欄位數量相同,數據類型一致。 ORDER BY
只能放在最後,用來對合併後的結果進行排序。
透過這些技巧,你可以更靈活地管理 SQL 查詢,整合不同數據來源,讓你的查詢結果更清晰、更有價值!🚀