Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

MySQL SELECT từ bảng A không tồn tại trong bảng B dùng JOIN?

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 NULL lọc lấy hàng chỉ ở A

Các phương pháp khác

Phương phápCú phápHiệu năng
LEFT JOIN + IS NULLNhư trênTốt, dùng index
NOT INWHERE a.col NOT IN (SELECT col FROM b)Chậm với NULL, subquery
NOT EXISTSWHERE 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 *