- IN so giá trị với một danh sách hoặc kết quả subquery:
x IN (SELECT ...). Hợp khi danh sách nhỏ, giá trị cụ thể. - EXISTS kiểm tra "có tồn tại ít nhất một dòng khớp không" và dừng ngay khi tìm thấy (short-circuit). Hợp với subquery tương quan (correlated), nối theo điều kiện với truy vấn ngoài.
- NOT EXISTS kiểm tra "không có dòng nào khớp".
Bẫy NULL quan trọng: NOT IN với một subquery có chứa NULL sẽ trả về rỗng/sai ngoài ý muốn, vì phép so sánh với NULL cho kết quả UNKNOWN (logic ba giá trị). NOT EXISTS không dính bẫy này, nên thường an toàn hơn khi loại trừ.
sql
SELECT c.id FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.customer_id = c.id
);Trình tối ưu hiện đại thường tạo cùng một plan cho EXISTS và IN khi không có NULL — nhưng để loại trừ có khả năng gặp NULL, ưu tiên NOT EXISTS.