SQL UNION:合併多個查詢結果的技巧

更新日期: 2025 年 3 月 4 日

在 SQL 查詢中,我們有時會需要將 多個查詢結果合併 為一個統一的結果集。例如:

  • 你希望查詢兩個不同的表,並將結果合併顯示 📊
  • 你需要從同一張表中查詢不同條件的結果,並整合成一個結果集 🏷️
  • 你想合併來自不同數據來源的數據 🔗

在這些情境中,SQL 提供了一個強大的工具:UNION

它允許我們將多個 SELECT 查詢的結果合併,形成一個統一的結果集,並且自動去除重複的記錄

本篇文章將詳細介紹 SQL UNION 的基本語法、使用條件、變體 UNION ALL 的差異,以及應用場景,讓你能夠靈活運用這個 SQL 技巧!🚀


UNION 的基本語法

UNION 用來合併多個 SELECT 查詢的結果,但要求所有的 SELECT 查詢:

  1. 必須有相同的欄位數量
  2. 對應的欄位數據類型必須相同

基本語法

SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;

📌 注意

  • UNION自動去除重複的記錄
  • 若要保留所有記錄(包括重複的),應該使用 UNION ALL

UNION 的基本應用

合併兩個表的查詢結果

假設我們有兩張表:

Customers_USA(美國客戶)

CustomerIDNameCountry
1AliceUSA
2BobUSA
3CharlieUSA

Customers_EU(歐洲客戶)

CustomerIDNameCountry
4DavidUK
5EmmaGermany
6AliceUSA

我們希望將這兩張表的客戶合併成一個清單:

SELECT CustomerID, Name, Country FROM Customers_USA
UNION
SELECT CustomerID, Name, Country FROM Customers_EU;

🔹 結果(去除重複值):

CustomerIDNameCountry
1AliceUSA
2BobUSA
3CharlieUSA
4DavidUK
5EmmaGermany
6AliceUSA

📌 解釋

  • AliceCustomers_USACustomers_EU 都有,但 UNION 自動去除了重複記錄

UNION ALL:保留重複記錄

如果我們希望保留所有記錄,包括重複的數據,可以使用 UNION ALL

SELECT CustomerID, Name, Country FROM Customers_USA
UNION ALL
SELECT CustomerID, Name, Country FROM Customers_EU;

🔹 結果(包含重複值):

CustomerIDNameCountry
1AliceUSA
2BobUSA
3CharlieUSA
4DavidUK
5EmmaGermany
6AliceUSA

📌 解釋

  • UNION ALL 不會去重,會完整合併所有的查詢結果
  • AliceCustomers_USACustomers_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 BYUNION 查詢中的使用

如果我們希望合併後的結果按照特定欄位排序:

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 的區別

許多初學者會混淆 UNIONJOIN,這兩者的作用不同:

特性UNIONJOIN
作用合併相同結構的數據將兩個表關聯在一起
欄位要求SELECT 查詢的欄位數量與類型必須相同透過關聯欄位(如 id)來連結不同表
是否去重UNION 會去重,UNION ALL 不會JOIN 會根據匹配條件決定返回的結果

結語

SQL 的 UNION 是一個強大的工具,能夠幫助我們將多個 SELECT 查詢的結果合併成一個結果集:

  • UNION自動去除重複記錄
  • UNION ALL保留所有記錄(包括重複的)
  • 必須確保 SELECT 查詢的欄位數量相同,數據類型一致
  • ORDER BY 只能放在最後,用來對合併後的結果進行排序。

透過這些技巧,你可以更靈活地管理 SQL 查詢,整合不同數據來源,讓你的查詢結果更清晰、更有價值!🚀

Similar Posts