語法
WHERE column NOT IN (value1, value2, ...)
範例
-- 查詢 id 不在 1,2,3,4,8 的記錄
SELECT * FROM table WHERE id NOT IN (1,2,3,4,8);
-- 子查詢形式
SELECT * FROM orders
WHERE customer_id NOT IN (SELECT id FROM customers WHERE status = 'banned');
注意事項
- NULL 值陷阱:若列表包含
NULL,整個 NOT IN 永遠回傳 false/unknown。
解決:WHERE id NOT IN (SELECT id FROM ... WHERE id IS NOT NULL) 或改用 NOT EXISTS。
- 效能:大列表或子查詢時,
NOT EXISTS / LEFT JOIN ... WHERE right.id IS NULL 通常優於 NOT IN。
- 資料型別:列表值型別需與欄位一致,隱式轉換可能導致索引失效。
最佳實踐對照
| 場景 | 推薦寫法 |
| 小型常數列表 | NOT IN (1,2,3) |
| 大型列表/子查詢 | NOT EXISTS (SELECT 1 FROM ... WHERE ...) |
| 可為 NULL 欄位 | NOT EXISTS 或 LEFT JOIN ... IS NULL |