Đến lúc nói kỹ hơn về NULL rồi. Và đây không phải là nói chuyện phiếm đâu, dù nhân vật chính của chúng ta nhìn... chẳng ra gì cả. Nếu bảng là một ngôi nhà, NULL sẽ là con ma của nó — im lặng, bí ẩn và khó đoán. Nó kiểu như có mặt đó, nhưng không trả lời câu hỏi, không tham gia tính toán, né tránh so sánh. Nó không chỉ là "trống" — nó là "không biết gì hết".
Trong thế giới SQL, NULL không phải là số 0, không phải chuỗi rỗng và cũng không phải là "không có dữ liệu" theo nghĩa thông thường. Nó là một dấu hiệu đặc biệt cho sự không biết, và bạn phải cẩn thận khi làm việc với nó. Hôm nay mình sẽ giải thích tại sao NULL không chỉ là một vị khách kỳ lạ mà còn là thành viên quan trọng của bất kỳ database nào. Vì nó thực sự có nghĩa là "giá trị không biết hoặc chưa xác định".
NULL khác gì so với chuỗi rỗng hoặc số 0?
Nhiều bạn mới học hay nhầm NULL với các giá trị khác như chuỗi rỗng '' hoặc số 0. Cùng xem qua điểm khác biệt chính nhé:
| Khái niệm | Giá trị |
|---|---|
NULL |
Hoàn toàn không có giá trị. Không chỉ là hộp rỗng, mà là không có cái hộp luôn |
| Chuỗi rỗng | Đây là chuỗi mà không có ký tự nào cả. Ví dụ: '' |
Số 0 |
Giá trị đại diện cho một con số cụ thể, bằng không |
Ví dụ thực tế: giả sử bạn có bảng nhân viên và lưu lương của họ. Nếu lương là 0, nghĩa là người đó không được trả đồng nào. Nếu lương là NULL, thì bạn không biết họ được trả bao nhiêu (hoặc chưa xác định).
Cách hiểu NULL
Bây giờ khi đã biết sơ sơ về NULL, cùng xem SQL xử lý nó như nào nhé. Điều quan trọng nhất về NULL có thể tóm gọn trong một câu: NULL không bằng gì cả và cũng không khác gì cả, kể cả chính nó.
SELECT NULL = NULL; -- Kết quả: FALSE
Bất ngờ chưa! Tại sao lại thế? Vì NULL là không biết. Nếu bạn có hai giá trị không biết, bạn không thể khẳng định chúng bằng nhau, cũng không thể nói chúng khác nhau.
Cùng xem vài ví dụ nhé:
Ví dụ thao tác với NULL
SELECT NULL + 1; -- Kết quả: NULL
SELECT NULL * 100; -- Kết quả: NULL
SELECT NULL = 0; -- Kết quả: FALSE
SELECT NULL <> 0; -- Kết quả: FALSE
NULL khi cộng, nhân hay bất kỳ phép tính nào đều trả về NULL. Ở đây NULL không giống số 0 trong toán học đâu. Kiểu như bạn ném cái gì vào hố đen và nó nuốt hết luôn ấy.
Ví dụ thực tế
Giả sử có bảng students chứa thông tin sinh viên:
| id | name | birth_date | grade |
|---|---|---|---|
| 1 | Alice | 2000-01-01 | 85 |
| 2 | Bob | NULL | 90 |
| 3 | Charlie | 1999-05-22 | NULL |
| 4 | Diana | NULL | NULL |
Ví dụ 1: Ảnh hưởng của NULL trong điều kiện
Nếu bạn thử tìm tất cả sinh viên không có ngày sinh bằng điều kiện WHERE birth_date = NULL:
SELECT *
FROM students
WHERE birth_date = NULL;
Bạn sẽ không nhận được kết quả nào, vì NULL = NULL trả về FALSE. Để kiểm tra NULL phải dùng IS NULL:
SELECT * FROM students WHERE birth_date IS NULL;
Kết quả:
| id | name | birth_date | grade |
|---|---|---|---|
| 2 | Bob | NULL | 90 |
| 4 | Diana | NULL | NULL |
Ví dụ 2: Ảnh hưởng của NULL trong phép tính
| id | name | birth_date | grade |
|---|---|---|---|
| 1 | Alice | 2000-01-01 | 85 |
| 2 | Bob | NULL | 90 |
| 3 | Charlie | 1999-05-22 | NULL |
| 4 | Diana | NULL | NULL |
Nếu bạn thử tính điểm trung bình cho tất cả sinh viên:
SELECT AVG(grade) FROM students;
Kết quả sẽ là: 87.5. Tại sao? Vì NULL bị bỏ qua trong các hàm tổng hợp như AVG, SUM, MIN, MAX. Nhưng nhớ nhé! Nếu bạn muốn tính cả dòng có NULL, sẽ phải xử lý thêm.
Mình sẽ nói kỹ hơn về làm việc với NULL trong các bài sau.
GO TO FULL VERSION