Vấn đề
Tìm các Id xuất hiện trong bảng nhưng **không** có bản ghi nào đi kèm FirstName = 'Chris'.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (Id INT, FirstName VARCHAR(100));
mysql> INSERT INTO DemoTable VALUES (100, 'Chris'), (100, 'Robert'), (100, 'Mike'), (100, 'Sam'), (101, 'David'), (101, 'Robert'), (210, 'Chris'), (210, 'Bob'), (210, 'Sam');
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+------+-----------+ | Id | FirstName | +------+-----------+ | 100 | Chris | | 100 | Robert | | 100 | Mike | | 100 | Sam | | 101 | David | | 101 | Robert | | 210 | Chris | | 210 | Bob | | 210 | Sam | +------+-----------+
Truy vấn: Id không có FirstName='Chris'
mysql> SELECT DISTINCT Id FROM DemoTable WHERE Id NOT IN (SELECT Id FROM DemoTable WHERE FirstName = 'Chris');
Kết quả
+------+ | Id | +------+ | 101 | +------+
Giải thích
- Subquery:
SELECT Id FROM DemoTable WHERE FirstName = 'Chris'→ trả về (100, 210). - Main query: Lấy Id không nằm trong (100, 210) → chỉ còn 101.
DISTINCTloại trùng Id trong kết quả.
⚠️ Cảnh báo NOT IN với NULL
Nếu subquery trả về NULL (ví dụ FirstName=NULL cho một Id), NOT IN sẽ không trả về kết quả nào (vì NULL so sánh = UNKNOWN).
An toàn hơn: NOT EXISTS
SELECT DISTINCT Id FROM DemoTable d1
WHERE NOT EXISTS (
SELECT 1 FROM DemoTable d2
WHERE d2.Id = d1.Id AND d2.FirstName = 'Chris'
);
Mở rộng: LEFT JOIN / IS NULL
SELECT DISTINCT d1.Id FROM DemoTable d1 LEFT JOIN (SELECT DISTINCT Id FROM DemoTable WHERE FirstName = 'Chris') d2 ON d1.Id = d2.Id WHERE d2.Id IS NULL;