首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL UNION 與 UNION ALL 完整對比:語法、去重邏輯、列名規則與實戰範例

     編輯:關於SqlServer

核心差異一覽

特性UNIONUNION ALL
重複行自動去重(DISTINCT)保留所有行
效能需排序/哈希去重,較慢直接拼接,極快
適用場景業務要求唯一結果集明知無重複/允許重複/追求速度

語法規則(兩者通用)

  1. 每個 SELECT 列數相同。
  2. 對應列數據類型兼容(隱式轉換或顯式 CAST)。
  3. 列順序一致(按位置對齊,非列名)。
  4. 結果集列名 = 第一個 SELECT 的列名/別名。

實戰範例:中美員工合併名單

測試數據

-- Employees_China
E_ID | E_Name
01   | Zhang, Hua
02   | Wang, Wei
03   | Carter, Thomas
04   | Yang, Ming

-- Employees_USA
E_ID | E_Name
01   | Adams, John
02   | Bush, George
03   | Carter, Thomas  -- 重複
04   | Gates, Bill

UNION(去重)

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA;
/* 結果(7 行,Carter, Thomas 僅出現一次)
E_Name
Adams, John
Bush, George
Carter, Thomas
Gates, Bill
Wang, Wei
Yang, Ming
Zhang, Hua
*/

UNION ALL(保留重複)

SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA;
/* 結果(8 行,Carter, Thomas 出現兩次)
E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill
*/

進階技巧

1. 手動控制去重:UNION ALL + DISTINCT

SELECT DISTINCT E_Name FROM (
    SELECT E_Name FROM Employees_China
    UNION ALL
    SELECT E_Name FROM Employees_USA
) AS t;

效能優於直接 UNION(可利用索引/流式聚合)。

2. 加來源標識列

SELECT 'China' AS Source, E_Name FROM Employees_China
UNION ALL
SELECT 'USA'  AS Source, E_Name FROM Employees_USA;

3. 排序:只能在最後加 ORDER BY

SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
ORDER BY E_Name;  -- 整體排序

避坑指南

  • 不要在子查詢中各自加 ORDER BY(無意義且浪費資源)。
  • 列類型不一致時顯式 CAST/CONVERT,避免隱式轉換失敗或精度損失。
  • UNION 對 TEXT/NTEXT/IMAGE 不支援(需轉 VARCHAR(MAX)/VARBINARY(MAX))。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved