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 查詢,整合不同數據來源,讓你的查詢結果更清晰、更有價值!🚀
