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

MySQL: เปรียบเทียบ 2 ตารางหา ID ที่หายไปด้วย NOT IN และ Subquery

เมื่อต้องการหา 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 ที่อยู่ในตารางใดตารางหนึ่ง แต่ไม่ใช่ทั้งคู่