FresherKỹ thuậtSQL
SQL xử lý NULL như thế nào và so sánh với NULL ra sao?
Thử trả lời trước
Đáp án mẫu
NULL nghĩa là "không biết hoặc thiếu", không phải số 0 và không phải chuỗi rỗng. Mọi phép so sánh với NULL, kể cả NULL = NULL, đều cho kết quả UNKNOWN, và WHERE chỉ giữ các dòng có điều kiện là TRUE. Đây là three-valued logic.
SELECT * FROM users WHERE phone = NULL; -- never returns rows
SELECT * FROM users WHERE phone IS NULL; -- correct
SELECT * FROM users WHERE phone IS NOT NULL;
Các công cụ hữu ích:
COALESCE(phone, 'n/a')trả về đối số đầu tiên khác NULL.IS DISTINCT FROMso sánh giá trị và coi hai NULL là bằng nhau. MySQL dùng<=>cho cùng ý tưởng.- Các aggregate như
SUM,AVGvàCOUNT(column)bỏ qua NULL, cònCOUNT(*)đếm mọi dòng.
Các bẫy cần biết: x <> 5 không trả các dòng mà x là NULL, và NOT IN có NULL trong danh sách sẽ không trả dòng nào.
Hãy coi mỗi cột nullable là một trạng thái thứ ba và quyết định rõ query phải xử lý nó thế nào.
Ý chính
- So sánh với NULL cho UNKNOWN, không phải TRUE hay FALSE
- Dùng IS NULL và IS NOT NULL, không dùng = NULL
- COALESCE cung cấp giá trị mặc định cho NULL
- Aggregate bỏ qua NULL trừ COUNT(*)
Câu hỏi nối tiếp thường gặp
- Vì sao NOT IN hỏng khi danh sách có NULL?
Lỗi thường gặp
- Viết column = NULL và mong có kết quả khớp
- Cho rằng x <> 5 cũng trả các dòng mà x là NULL