สร้างตารางและข้อมูลตัวอย่าง
mysql> create table DemoTable1991 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20) );
mysql> insert into DemoTable1991(StudentName) values('Chris');
mysql> insert into DemoTable1991(StudentName) values('Bob');
mysql> insert into DemoTable1991(StudentName) values('David');
mysql> insert into DemoTable1991(StudentName) values('Sam');
mysql> insert into DemoTable1991(StudentName) values('Mike');
ข้อมูลทั้งหมด
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Chris | | 2 | Bob | | 3 | David | | 4 | Sam | | 5 | Mike | +-----------+-------------+
Query ใช้ NOT IN
mysql> select * from DemoTable1991 where StudentName NOT IN('Bob','Sam','Mike');
ผลลัพธ์
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Chris | | 3 | David | +-----------+-------------+
ข้อควรระวังกับ NOT IN และ NULL
หากคอลัมน์หรือรายการใน NOT IN มีค่า NULL ผลลัพธ์จะเป็นชุดว่าง (Empty Set) เพราะ NULL NOT IN (...) คืนค่า UNKNOWN:
-- ถ้ามี NULL ในคอลัมน์ SELECT * FROM table WHERE col NOT IN (1, 2, NULL); -- คืน 0 แถวเสมอ!
วิธีแก้: ใช้ NOT EXISTS หรือ LEFT JOIN
-- NOT EXISTS (ปลอดภัยกับ NULL) SELECT * FROM DemoTable1991 t1 WHERE NOT EXISTS (SELECT 1 FROM (SELECT 'Bob' AS n UNION SELECT 'Sam' UNION SELECT 'Mike') t2 WHERE t2.n = t1.StudentName); -- หรือ LEFT JOIN SELECT t1.* FROM DemoTable1991 t1 LEFT JOIN (SELECT 'Bob' AS n UNION SELECT 'Sam' UNION SELECT 'Mike') t2 ON t2.n = t1.StudentName WHERE t2.n IS NULL;
แนวทางปฏิบัติที่ดี
- หลีกเลี่ยง NOT IN กับ Subquery ที่อาจคืนค่า NULL
- ใช้ NOT EXISTS แทน เพราะจัดการ NULL ได้ถูกต้อง และมักมีประสิทธิภาพดีกว่า
- หากรายการคงที่ (Hard-coded) และแน่ใจว่าไม่มี NULL ใช้ NOT IN ได้ไม่เป็นไร