ใช้ NOT IN หรือ NOT EXISTS เพื่อเลือกข้อมูลจากตารางหนึ่งที่ไม่มีในอีกตารางหนึ่ง
สร้างตาราง A และ B
mysql> CREATE TABLE A (Value INT); mysql> CREATE TABLE B (Value2 INT);
เพิ่มข้อมูลตาราง A (5 แถว)
mysql> INSERT INTO A VALUES (10), (20), (30), (50), (80);
เพิ่มข้อมูลตาราง B (2 แถว)
mysql> INSERT INTO B VALUES (20), (50);
แสดงข้อมูลตาราง A
mysql> SELECT * FROM A;
+-------+ | Value | +-------+ | 10 | | 20 | | 30 | | 50 | | 80 | +-------+
แสดงข้อมูลตาราง B
mysql> SELECT * FROM B;
+--------+ | Value2 | +--------+ | 20 | | 50 | +--------+
Query: ค่าใน A ที่ไม่อยู่ใน B (NOT IN)
mysql> SELECT * FROM A WHERE Value NOT IN (SELECT Value2 FROM B);
ผลลัพธ์ (10, 30, 80):
+-------+ | Value | +-------+ | 10 | | 30 | | 80 | +-------+
วิธีอื่น: NOT EXISTS (แนะนำสำหรับ subquery ที่ซับซ้อน)
SELECT * FROM A a WHERE NOT EXISTS (SELECT 1 FROM B b WHERE b.Value2 = a.Value);
LEFT JOIN ... WHERE IS NULL (ประสิทธิภาพดีในบางกรณี)
SELECT a.* FROM A a LEFT JOIN B b ON a.Value = b.Value2 WHERE b.Value2 IS NULL;
เปรียบเทียบ NOT IN vs NOT EXISTS
| คุณสมบัติ | NOT IN | NOT EXISTS |
|---|---|---|
| NULL ใน subquery | คืนค่าว่างทั้งหมด (dangerous!) | ทำงานถูกต้อง |
| ประสิทธิภาพ | ดีกว่า subquery เรียบง่าย | ดีกว่า subquery ซับซ้อน |
| ความอ่านง่าย | ง่าย เข้าใจง่าย | ค่อนข้างซับซ้อน |
⚠️ คำเตือนสำคัญ: NOT IN กับ NULL
-- ถ้า B มี NULL INSERT INTO B VALUES (NULL); SELECT * FROM A WHERE Value NOT IN (SELECT Value2 FROM B); -- ผลลัพธ์: 0 rows!
เพราะ Value NOT IN (20, 50, NULL) ประเมินเป็น UNKNOWN ทุกแถว
แนวทางปลอดภัย
- ใช้
NOT EXISTSแทน (ปลอดภัยต่อ NULL) - หรือกรอง NULL:
WHERE Value NOT IN (SELECT Value2 FROM B WHERE Value2 IS NOT NULL)