IN 是集合運算子:a IN {set},左邊為標量,右邊為同型別集合(子查詢必須單欄)。EXISTS 是存在量化:EXISTS (subquery),子查詢有結果行即為真。
SELECT * FROM A WHERE EXISTS (SELECT * FROM B WHERE B.id = A.id)
-- 等價於
SELECT * FROM A WHERE id IN (SELECT id FROM B)
NOT EXISTS 可使用連接演算法(Anti-Semi Join),NOT IN 因需處理 NULL 語義(NULL NOT IN (...) 永遠為 UNKNOWN),優化器難轉換為連接,通常退化為篩選。IN 更易利用連接演算法(Semi Join),EXISTS 相關子查詢可能逐行求值(視優化器版本)。EXISTS 更優(可早期終止)。IN 更優(可哈希/合併連接)。EXISTS P ≡ P ≠ ∅(集合非空)。s IN P ≡ ∃ p ∈ P : s = p(標量屬於集合)。最佳實踐: 存在性判斷首選 EXISTS(語義清晰、抗 NULL 干擾);集合成員資格檢查用 IN;NOT EXISTS 絕對優於 NOT IN。實測執行計劃為準,勿迷信經驗法則。