NULL biểu thị giá trị chưa biết / không tồn tại, khác hẳn số 0 hay chuỗi rỗng ''. Vì "chưa biết", SQL dùng logic ba giá trị: mọi so sánh cho ra TRUE, FALSE, hoặc UNKNOWN.
Hệ quả thực tế:
- NULL = NULL không ra TRUE mà ra UNKNOWN → phải dùng IS NULL / IS NOT NULL, không dùng = NULL.
- WHERE chỉ giữ hàng cho kết quả TRUE → điều kiện UNKNOWN bị loại. WHERE x <> 5 sẽ bỏ sót hàng có x IS NULL.
- Hàm tổng hợp bỏ qua NULL: COUNT(col) không đếm NULL (nhưng COUNT(*) đếm cả hàng), AVG tính trên giá trị non-NULL.
- NULL trong phép nối chuỗi/số học lan ra NULL (dùng COALESCE(x, default) để thay).
- UNIQUE thường cho nhiều NULL (vì mỗi NULL "khác nhau").
-- Hàng có price IS NULL bị loại khỏi CẢ HAI truy vấn dưới đây:
SELECT * FROM products WHERE price = 100; -- NULL không khớp
SELECT * FROM products WHERE price <> 100; -- NULL cũng không khớp (UNKNOWN)Đây là nguồn bug kinh điển: quên xử lý NULL khi lọc/join làm kết quả sai lặng lẽ.