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

SELECT ข้อมูลจากตาราง A ที่ไม่มีในตาราง B (NOT IN / NOT EXISTS)

ใช้ 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 INNOT 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)