Tìm bản ghi ở bảng A không có trong bảng B với LEFT JOIN
Sử dụng LEFT JOIN kết hợp điều kiện WHERE tableB.column IS NULL để lấy các hàng chỉ tồn tại ở bảng A.
Cú pháp
SELECT tableA.* FROM tableA LEFT JOIN tableB ON tableA.column = tableB.column WHERE tableB.column IS NULL;
Ví dụ: Tìm giá trị chỉ có ở table_A
Tạo table_A:
mysql> CREATE TABLE table_A (Value INT); mysql> INSERT INTO table_A VALUES (10), (15), (35), (45);
Tạo table_B:
mysql> CREATE TABLE table_B (Value INT); mysql> INSERT INTO table_B VALUES (10), (20), (35), (60);
Dữ liệu:
table_A: 10, 15, 35, 45 table_B: 10, 20, 35, 60
LEFT JOIN tìm giá trị chỉ ở A:
mysql> SELECT table_A.* FROM table_A LEFT JOIN table_B ON table_A.Value = table_B.Value WHERE table_B.Value IS NULL;
Kết quả (15, 45 chỉ có ở A):
+-------+ | Value | +-------+ | 15 | | 45 | +-------+
Giải thích logic
- LEFT JOIN giữ tất cả hàng table_A
- Hàng khớp → cột table_B có giá trị
- Hàng không khớp → cột table_B là NULL
WHERE table_B.Value IS NULLlọc lấy hàng chỉ ở A
Các phương pháp khác
| Phương pháp | Cú pháp | Hiệu năng |
|---|---|---|
| LEFT JOIN + IS NULL | Như trên | Tốt, dùng index |
| NOT IN | WHERE a.col NOT IN (SELECT col FROM b) | Chậm với NULL, subquery |
| NOT EXISTS | WHERE NOT EXISTS (SELECT 1 FROM b WHERE b.col = a.col) | Tốt, optimizer thông minh |
| EXCEPT (MySQL 8.0+) | SELECT * FROM a EXCEPT SELECT * FROM b | Đọc dễ, chuẩn SQL |
Lưu ý
- Cột JOIN nên có index trên cả 2 bảng
- Khi cột cho phép NULL, NOT IN có thể sai → dùng NOT EXISTS hoặc LEFT JOIN
- SELECT tableA.* tránh trùng cột khi SELECT *