เมื่อต้องการหา ID ที่มีในตารางแรก แต่ ไม่มี ในตารางที่สอง สามารถใช้ NOT IN ร่วมกับ subquery ได้
รูปแบบคำสั่ง
SELECT t1.id_column
FROM table1 t1
WHERE t1.id_column NOT IN (SELECT t2.id_column FROM table2 t2);
ตัวอย่างการใช้งาน
1. สร้างตารางแรก (First_Table) - มี ID 1,2,3,4
CREATE TABLE First_Table (Id INT);
INSERT INTO First_Table VALUES (1), (2), (3), (4);
2. สร้างตารางที่สอง (Second_Table) - มี ID 2,4
CREATE TABLE Second_Table (Id INT);
INSERT INTO Second_Table VALUES (2), (4);
3. หา ID ที่อยู่ใน First_Table แต่ไม่อยู่ใน Second_Table
SELECT First_Table.Id
FROM First_Table
WHERE First_Table.Id NOT IN (SELECT Second_Table.Id FROM Second_Table);
ผลลัพธ์:
+------+
| Id |
+------+
| 1 |
| 3 |
+------+
ID 1 และ 3 อยู่ในตารางแรก แต่ไม่มีในตารางที่สอง
วิธีทางเลือก: LEFT JOIN ... WHERE IS NULL
SELECT t1.Id
FROM First_Table t1
LEFT JOIN Second_Table t2 ON t1.Id = t2.Id
WHERE t2.Id IS NULL;
วิธีนี้มัก เร็วกว่า สำหรับข้อมูล量大 เพราะใช้ index ได้ดีกว่า NOT IN
วิธีทางเลือก: NOT EXISTS (MySQL 8.0+ แนะนำ)
SELECT t1.Id
FROM First_Table t1
WHERE NOT EXISTS (SELECT 1 FROM Second_Table t2 WHERE t2.Id = t1.Id);
NOT EXISTS จัดการค่า NULL ได้ถูกต้องกว่า NOT IN (หาก subquery คืนค่า NULL, NOT IN จะคืน empty set)
เปรียบเทียบประสิทธิภาพ
| วิธี | ประสิทธิภาพ | จัดการ NULL | ความเข้ากันได้ |
|---|---|---|---|
| NOT IN | ปานกลาง | มีปัญหากับ NULL | ทุกเวอร์ชัน |
| LEFT JOIN ... IS NULL | ดี | ดี | ทุกเวอร์ชัน |
| NOT EXISTS | ดีมาก | ดีที่สุด | MySQL 5.7+ |
ขยาย: หาความแตกต่าง 2 ทิศทาง (Symmetric Difference)
-- ID ใน t1 ไม่อยู่ใน t2
SELECT t1.Id FROM First_Table t1
LEFT JOIN Second_Table t2 ON t1.Id = t2.Id WHERE t2.Id IS NULL
UNION
-- ID ใน t2 ไม่อยู่ใน t1
SELECT t2.Id FROM Second_Table t2
LEFT JOIN First_Table t1 ON t2.Id = t1.Id WHERE t1.Id IS NULL;
คืนค่า ID ที่อยู่ในตารางใดตารางหนึ่ง แต่ไม่ใช่ทั้งคู่