การใช้ NOT IN() เพื่อตัดข้อมูลที่ไม่ต้องการ
ฟังก์ชัน NOT IN(value1, value2, ...) ใช้ในเงื่อนไข WHERE เพื่อ **เลือกเฉพาะแถวที่ค่าของคอลัมน์ไม่อยู่ในรายการที่กำหนด**
Syntax
SELECT * FROM table_name WHERE column_name NOT IN (value1, value2, ...);
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูล:
mysql> CREATE TABLE DemoTable718 (
Id INT,
FirstName VARCHAR(100),
Age INT
);
Query OK, 0 rows affected (0.59 sec)
mysql> INSERT INTO DemoTable718 VALUES
(101, 'Chris', 26),
(102, 'Robert', 24),
(103, 'David', 27),
(104, 'Mike', 28),
(105, 'Sam', 23);
Query OK, 5 rows affected
ข้อมูลทั้งหมด:
mysql> SELECT * FROM DemoTable718;
+------+-----------+------+ | Id | FirstName | Age | +------+-----------+------+ | 101 | Chris | 26 | | 102 | Robert | 24 | | 103 | David | 27 | | 104 | Mike | 28 | | 105 | Sam | 23 | +------+-----------+------+ 5 rows in set (0.00 sec)
ค้นหาข้อมูลที่ Id **ไม่อยู่ใน** ชุด (101, 103, 104):
mysql> SELECT * FROM DemoTable718 WHERE Id NOT IN ('101', '103', '104');
+------+-----------+------+ | Id | FirstName | Age | +------+-----------+------+ | 102 | Robert | 24 | | 105 | Sam | 23 | +------+-----------+------+ 2 rows in set (0.00 sec)
ข้อควรระวังสำคัญ: NULL ใน NOT IN
หากรายการใน NOT IN มีค่า NULL อยู่ **ผลลัพธ์จะว่างเปล่าเสมอ** เพราะ value NOT IN (..., NULL) ประเมินเป็น UNKNOWN
-- ผิด: หาก subquery คืนค่า NULL WHERE id NOT IN (SELECT nullable_col FROM other_table) -- ถูกต้อง: กรอง NULL ออกก่อน WHERE id NOT IN (SELECT nullable_col FROM other_table WHERE nullable_col IS NOT NULL) -- หรือใช้ NOT EXISTS (แนะนำ) WHERE NOT EXISTS (SELECT 1 FROM other_table WHERE other_table.id = main_table.id)
ประสิทธิภาพ
IN()/NOT IN()ใช้ Index ได้ (Index Lookup)- สำหรับรายการเยอะมาก ควรใช้
JOINหรือNOT EXISTSแทน - MySQL จะแปลง
IN (const, const...)เป็น Binary Search อัตโนมัติ