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

SQL 集合運算與 NULL 處理核心筆記

     編輯:Oracle 教學

SQL 集合運算與 NULL 處理核心筆記

關係型資料庫的本質是集合運算。善用集合思維撰寫 SQL,不僅效率更高,邏輯也更清晰。

一、四大集合運算子

運算子結果去重排序/性能影響
UNION兩集合合併是需排序去重,較慢
UNION ALL兩集合合併否無排序,效能最佳
MINUS (Oracle) / EXCEPT (ANSI)僅存在於第一個查詢是需排序去重
INTERSECT兩集合交集是需排序去重

黃金法則:不關心重複資料時,永遠優先使用 UNION ALL,避免不必要的排序與記憶體消耗。

二、NULL 的三值邏輯陷阱

關係模型只有 TRUE/FALSE,但 SQL 引入 UNKNOWN(三值邏輯):

  • NULL = NULL → UNKNOWN(非 TRUE)
  • NULL <> NULL → UNKNOWN
  • NULL IS NULL → TRUE
  • NULL IS NOT NULL → FALSE

WHERE 子句陷阱

-- 錯誤:無法找出 salary 為 NULL 的員工
SELECT * FROM emp WHERE salary = NULL;   -- 結果永遠為空

-- 正確
SELECT * FROM emp WHERE salary IS NULL;

NOT IN 子查詢陷阱

-- 若子查詢結果包含 NULL,外層查詢將返回 0 筆!
SELECT * FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp);

-- 安全寫法
SELECT * FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp WHERE deptno IS NOT NULL);
-- 或使用 NOT EXISTS(推薦)
SELECT * FROM dept d WHERE NOT EXISTS (SELECT 1 FROM emp e WHERE e.deptno = d.deptno);

三、NULL 在排序與聚合中的行為

  • ORDER BY:預設 NULLS LAST(升序),NULLS FIRST(降序)。可顯式指定 ORDER BY col NULLS FIRST。
  • 聚合函數:SUM, AVG, COUNT(col) 會 自動忽略 NULL;COUNT(*) 計算列數包含 NULL。

四、實戰建議

  1. 欄位設計階段:非必要不 NULL,加 NOT NULL 約束 + DEFAULT 值。
  2. 查詢撰寫:永遠用 IS NULL/IS NOT NULL 判斷空值,不用 =/!=。
  3. 集合運算:預設 UNION ALL,確有去重需求才用 UNION。
  4. 子查詢:優先 NOT EXISTS 替代 NOT IN,避免 NULL 陷阱並利用半連接優化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved