關係型資料庫的本質是集合運算。善用集合思維撰寫 SQL,不僅效率更高,邏輯也更清晰。
| 運算子 | 結果 | 去重 | 排序/性能影響 |
|---|---|---|---|
UNION | 兩集合合併 | 是 | 需排序去重,較慢 |
UNION ALL | 兩集合合併 | 否 | 無排序,效能最佳 |
MINUS (Oracle) / EXCEPT (ANSI) | 僅存在於第一個查詢 | 是 | 需排序去重 |
INTERSECT | 兩集合交集 | 是 | 需排序去重 |
黃金法則:不關心重複資料時,永遠優先使用
UNION ALL,避免不必要的排序與記憶體消耗。
關係模型只有 TRUE/FALSE,但 SQL 引入 UNKNOWN(三值邏輯):
NULL = NULL → UNKNOWN(非 TRUE)NULL <> NULL → UNKNOWNNULL IS NULL → TRUENULL IS NOT NULL → FALSE-- 錯誤:無法找出 salary 為 NULL 的員工 SELECT * FROM emp WHERE salary = NULL; -- 結果永遠為空 -- 正確 SELECT * FROM emp WHERE salary IS NULL;
-- 若子查詢結果包含 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);
NULLS LAST(升序),NULLS FIRST(降序)。可顯式指定 ORDER BY col NULLS FIRST。SUM, AVG, COUNT(col) 會 自動忽略 NULL;COUNT(*) 計算列數包含 NULL。NOT NULL 約束 + DEFAULT 值。IS NULL/IS NOT NULL 判斷空值,不用 =/!=。UNION ALL,確有去重需求才用 UNION。NOT EXISTS 替代 NOT IN,避免 NULL 陷阱並利用半連接優化。