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

Oracle 集合運算完整指南:UNION、INTERSECT、MINUS 實戰詳解

     編輯:Oracle 教學

集合運算核心概念

集合運算是 SQL 中處理多個查詢結果集的關鍵功能,屬於二元運算子,操作兩個結果集合。Oracle 提供四種標準集合運算子,皆要求參與運算的查詢:

  • 欄位數量相同
  • 對應欄位資料型別相容
  • 順序對應

四大運算子語法與特性對照

查詢語句_1 { UNION | UNION ALL | INTERSECT | MINUS } 查詢語句_2 [...];
運算子中文名稱行為描述去重複效能特性
UNION聯集合併兩查詢結果,移除重複行是需排序比較,較慢
UNION ALL聯集(含重複)合併兩查詢結果,保留所有行否無需排序,最快
INTERSECT交集僅回傳兩查詢皆有的行是需排序比較
MINUS差集回傳第一查詢有、第二查詢無的行是需排序比較

實戰範例:以 DEPT 表示範

假設 DEPT 表有 4 筆資料(DEPTNO 10,20,30,40),第二查詢條件 WHERE deptno=10 僅回傳 1 筆。

1. UNION - 聯集(去重複)

SELECT * FROM dept
UNION
SELECT * FROM dept WHERE deptno = 10;

結果: 4 筆資料。DEPTNO=10 的行在兩查詢中皆出現,UNION 去重複後僅保留一筆。

2. UNION ALL - 聯集(保留重複)

SELECT * FROM dept
UNION ALL
SELECT * FROM dept WHERE deptno = 10;

結果: 5 筆資料。DEPTNO=10 的行出現兩次,UNION ALL 不移除重複。

3. INTERSECT - 交集

SELECT * FROM dept
INTERSECT
SELECT * FROM dept WHERE deptno = 10;

結果: 1 筆資料。僅回傳兩查詢共有的 DEPTNO=10 行。

4. MINUS - 差集

SELECT * FROM dept
MINUS
SELECT * FROM dept WHERE deptno = 10;

結果: 3 筆資料。回傳第一查詢有但第二查詢無的行(DEPTNO 20,30,40)。

進階應用與注意事項

多重集合運算優先順序

Oracle 從左至右依序評估,INTERSECT 優先級高於 UNION/UNION ALL/MINUS。建議使用括號明確分組:

-- 先算交集,再聯集
SELECT * FROM dept WHERE deptno <= 20
UNION
(SELECT * FROM dept WHERE deptno > 10
 INTERSECT
 SELECT * FROM dept WHERE dname LIKE 'S%');

排序控制

集合運算結果預設不保證順序。需在最後加上 ORDER BY(使用欄位位置或別名):

SELECT deptno, dname FROM dept WHERE deptno <= 20
UNION
SELECT deptno, dname FROM dept WHERE deptno > 20
ORDER BY 1;  -- 依第一欄位排序

效能最佳化建議

  1. 優先使用 UNION ALL:若業務允許重複或已知無重複,避免昂貴的排序去重複。
  2. 善用索引:參與集合運算的欄位若有索引,可加速排序比較。
  3. 避免 SELECT *:僅選取必要欄位,減少資料傳輸與比較成本。
  4. 考慮替代方案:EXISTS/NOT EXISTS、JOIN 在某些場景效能優於集合運算。

常見陷阱

  • 資料型別隱性轉換:數字與字串比較可能導致索引失效或結果錯誤,建議顯式 TO_CHAR/TO_NUMBER。
  • NULL 值處理:集合運算視 NULL 為相等(UNION/INTERSECT 會將多個 NULL 視為一個),與一般比較邏輯不同。
  • LOB/CLOB 欄位限制:集合運算不支援 LOB 型別欄位。

總結

集合運算是集合論在 SQL 的直接映射,掌握 UNION/UNION ALL/INTERSECT/MINUS 的差異與適用場景,能寫出簡潔高效的資料整合查詢。實務上記住「能用 UNION ALL 就不用 UNION」,並善用括號控制運算順序,是資料工程師的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved