掌握子查詢操作符的語義差異與適用場景,是編寫高效 SQL 的關鍵。本文系統講解六大操作符的邏輯等價關係、執行機制及最佳實踐。
ANY 和 SOME 完全等價,表示「大於子查詢返回集合中的任意一個值」:
SELECT * FROM t1 WHERE col > ANY (SELECT col FROM t2);
-- 等價於
SELECT * FROM t1 WHERE col > val1 OR col > val2 OR col > val3 ...
適用場景:需滿足「只要超過最小值」等鬆散條件時。
ALL 要求主查詢值同時滿足子查詢結果集中所有值的比較:
SELECT * FROM t1 WHERE col > ALL (SELECT col FROM t2);
-- 等價於
SELECT * FROM t1 WHERE col > val1 AND col > val2 AND col > val3 ...
典型用法:查找「大於最大值」的記錄,即 > ALL 等價於 > (SELECT MAX(col) FROM t2)。
IN 是 = ANY 的別名,用於檢查值是否存在於列表或子查詢結果中:
SELECT id, name FROM a WHERE id IN (SELECT aid FROM b);
SELECT id, name FROM a WHERE id NOT IN (SELECT aid FROM b);
注意:子查詢返回 NULL 會導致 NOT IN 整體判定為 FALSE,建議改用 NOT EXISTS。
核心機制:將主查詢每行數據代入子查詢作為條件驗證,根據 TRUE/FALSE 決定是否保留。
SELECT * FROM employee
WHERE EXISTS (SELECT 1 FROM department WHERE d_id = 1003 AND dept_name = employee.dept);
關鍵特性:
SELECT 列表可寫 *、1 或任意常量,優化器會忽略AND/OR 組合使用:WHERE age > 24 AND EXISTS (...)| 操作符 | 去重 | 性能 | 適用場景 |
|---|---|---|---|
| UNION | 是 | 較低(需排序去重) | 業務要求唯一結果集 |
| UNION ALL | 否 | 高(直接拼接) | 明確無重複或允許重複 |
SELECT d_id FROM employee UNION SELECT d_id FROM department; -- 去重
SELECT d_id FROM employee UNION ALL SELECT d_id FROM department; -- 保留所有
前提條件:所有 SELECT 列數、類型、順序必須一致;第一條查詢的列名將作為結果集列名。
EXISTSINALL/ANYUNION ALL(優先)或 UNION