Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: SELECT ข้อมูลที่ค่าไม่อยู่ในรายการที่กำหนดด้วย NOT IN

สร้างตารางและข้อมูลตัวอย่าง

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 ได้ไม่เป็นไร