Tóm tắt
Thay chuỗi WHERE id != 5 AND id != 10 AND id != 15 bằng WHERE id NOT IN (5, 10, 15) – ngắn gọn, dễ đọc, hiệu năng tương đương.
Cú pháp
SELECT * FROM bang WHERE cot NOT IN (gia_tri_1, gia_tri_2, ...);
Ví dụ
1. Tạo bảng
CREATE TABLE User_informations (UserId INT, UserName VARCHAR(20));
INSERT INTO User_informations VALUES
(12,'Maxwell'), (7,'David'), (1,'Ramit'), (10,'Bob'),
(2,'Carol'), (14,'Sam'), (6,'Mike'), (4,'Robert');
2. Loại trừ UserId 1, 2, 7
SELECT * FROM User_informations WHERE UserId NOT IN (1, 2, 7);
3. Kết quả
+--------+----------+
| UserId | UserName |
+--------+----------+
| 12 | Maxwell |
| 10 | Bob |
| 14 | Sam |
| 6 | Mike |
| 4 | Robert |
+--------+----------+
Lưu ý quan trọng về NULL
SELECT * FROM bang WHERE cot NOT IN (1, 2, NULL);
-- Kết quả: 0 hàng (vì NULL trong danh sách làm toàn bộ UNKNOWN)
Không bao giờ để NULL trong danh sách NOT IN – dùng NOT IN (1,2) AND cot IS NOT NULL hoặc NOT EXISTS.
NOT IN vs NOT EXISTS
| Đặc điểm | NOT IN | NOT EXISTS |
|---|---|---|
| NULL trong subquery | Trả về 0 hàng (dangerous) | An toàn, xử lý NULL đúng |
| Hiệu năng | Tương đương (optimizer chuyển đổi) | Tương đương |
| Độ dài danh sách | Giới hạn ~max_allowed_packet | Không giới hạn (subquery) |
Khuyến nghị
- Danh sách hằng số nhỏ, chắc chắn không NULL →
NOT INOK. - Subquery hoặc có khả năng NULL →
NOT EXISTSan toàn hơn.