UNION 與 UNION ALL 皆用於合併多個 SELECT 結果集,但去重與排序行為差異巨大,直接影響查詢效能與結果正確性。
| 特性 | UNION | UNION ALL |
|---|---|---|
| 去除重複列 | 是(執行 DISTINCT 排序) | 否(保留所有列) |
| 預設排序 | 是(依第一欄遞增) | 否(維持來源順序) |
| 效能 | 低(需排序、哈希去重) | 高(單純串流合併) |
| 適用場景 | 業務要求唯一結果集 | 明確無重複、或允許重複、ETL 暫存 |
-- TAB1
XiaoWang
XiaoZhang
-- TAB2
XiaoWang
XiaoLi
-- UNION 結果(3 列,已去重、排序)
XiaoLi
XiaoWang
XiaoZhang
-- UNION ALL 結果(4 列,保留重複、不排序)
XiaoWang
XiaoZhang
XiaoWang
XiaoLi
INTERSECT:交集,去重且排序MINUS(Oracle)/ EXCEPT(ANSI/SQL Server):差集,去重且排序SELECT 的欄位名稱將成為結果集欄位名SELECT ... UNION SELECT ... UNION SELECT ...ORDER BY 僅允許出現在最終結果集,且須使用第一個 SELECT 的欄位別名或位置編號ORA-00932,需轉 TO_CHAR 或改用 UNION ALL + 應用層去重UNION ALL**UNION ALL 進暫存表,再 CREATE TABLE AS SELECT DISTINCT ... 並建立索引UNION,導致每次查詢視圖都觸發昂貴排序-- 部門 20 以上 + 部門 30 以下(重複部門 20~30)
SELECT * FROM emp WHERE deptno >= 20
UNION ALL
SELECT * FROM emp WHERE deptno <= 30;
-- 跨表合併,欄位名不同但型別相容
SELECT empno, ename FROM emp
UNION
SELECT deptno, dname FROM dept
ORDER BY 2; -- 依第二欄(ename/dname)排序
掌握集合運算子語義與效能特徵,是撰寫高效 SQL 的基本功。