IN 運算子
IN 運算子用來判斷欄位值是否在指定的值集合中,是多個 OR 條件的簡化寫法。
語法
SELECT column1, column2, ...
FROM table_name
WHERE column_name IN (value1, value2, value3, ...);
基本用法
假設有一個 customers 資料表:
| id | name | city |
|---|---|---|
| 1 | 張一 | 台北 |
| 2 | 王二 | 高雄 |
| 3 | 李三 | 台中 |
| 4 | 陳四 | 台南 |
查詢住在台北或高雄的客戶:
SELECT * FROM customers
WHERE city IN ('台北', '高雄');
結果:
| id | name | city |
|---|---|---|
| 1 | 張一 | 台北 |
| 2 | 王二 | 高雄 |
這等同於:
SELECT * FROM customers
WHERE city = '台北' OR city = '高雄';
NOT IN
NOT IN 用來排除在集合中的值:
SELECT * FROM customers
WHERE city NOT IN ('台北', '高雄');
結果:
| id | name | city |
|---|---|---|
| 3 | 李三 | 台中 |
| 4 | 陳四 | 台南 |
搭配子查詢
IN 常與子查詢搭配使用:
-- 查詢有下過訂單的客戶
SELECT * FROM customers
WHERE id IN (SELECT customer_id FROM orders);
-- 查詢沒有下過訂單的客戶
SELECT * FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);
注意事項
NULL 值的處理
如果 IN 的集合中包含 NULL,或是子查詢結果中有 NULL,NOT IN 可能不會如預期運作:
-- 假設 orders 中 customer_id 有 NULL 值
-- 這可能不會返回任何結果!
SELECT * FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);
建議使用 NOT EXISTS 替代:
SELECT * FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.customer_id = c.id
);