Hôm nay tụi mình sẽ tiếp tục tìm hiểu về NULL — anh hùng thầm lặng trong database. Nếu bạn vẫn nghĩ NULL chỉ là "không có gì", thì đúng đó, nhưng chưa đủ đâu nha. Trong bài này, mình sẽ chỉ cho bạn cách kiểm tra xem dữ liệu của mình có NULL không, và làm gì với nó. Sẵn sàng đi săn giá trị thiếu chưa?
Bắt đầu đơn giản nhé — tưởng tượng bạn đang làm việc với database của một shop online. Bạn có bảng đơn hàng, trong đó một số đơn không có thông tin ghi chú, còn một số thì có. Nếu bạn muốn tìm tất cả đơn hàng không có ghi chú mà lại dùng so sánh bình thường =, <>, bạn sẽ bất ngờ đó... Tại sao? Vì NULL là trường hợp đặc biệt mà!
Trong SQL, để kiểm tra có hay không có NULL thì phải dùng IS NULL và IS NOT NULL. Hai ông này giúp mình xử lý NULL và lấy đúng dữ liệu cần thiết.
Kiểm tra giá trị với IS NULL
IS NULL dùng để kiểm tra xem một cột hoặc biểu thức có giá trị NULL không.
SELECT *
FROM orders
WHERE comment IS NULL;
Query này sẽ trả về tất cả các dòng mà cột comment là NULL. Rất tiện nếu bạn muốn tìm đơn hàng không có ghi chú.
Ví dụ bảng orders:
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Giao hàng gấp" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Query:
SELECT id, customer_name
FROM orders
WHERE comment IS NULL;
Kết quả:
| id | customer_name |
|---|---|
| 2 | Maria Chi |
| 4 | Anna Song |
Lưu ý là dòng có chuỗi rỗng '' không được tính vào, vì '' không phải là NULL đâu nha.
Kiểm tra giá trị với IS NOT NULL
IS NOT NULL thì ngược lại; nó kiểm tra xem giá trị có phải không phải NULL không. Ví dụ, bạn muốn lấy tất cả đơn hàng có ghi chú:
SELECT *
FROM orders
WHERE comment IS NOT NULL;
Query này chỉ trả về các dòng mà cột comment có dữ liệu (kể cả chuỗi rỗng '').
Ví dụ
Bảng orders vẫn như cũ nha.
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Giao hàng gấp" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Chạy query này nhé:
SELECT id, customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
Kết quả:
| id | customer_name | comment |
|---|---|---|
| 1 | Otto Art | "Giao hàng gấp" |
| 3 | Alex Lin | '' |
Lưu ý là dòng có chuỗi rỗng '' cũng được tính vào. SQL coi đây là giá trị "không rỗng".
Khi nào dùng IS NULL và IS NOT NULL?
Một vài trường hợp hay gặp nè:
- Lọc dữ liệu: bạn muốn loại bỏ các bản ghi chưa đủ thông tin, thiếu giá trị.
- Xử lý lỗi: đôi khi
NULLcó thể là lỗi nhập liệu, bạn cần tách riêng các dòng này ra. - Phân tích dữ liệu: đếm số bản ghi thiếu giá trị giúp bạn đánh giá chất lượng dữ liệu.
Ứng dụng thực tế
Thử vài bài tập thực tế nhé:
Bài 1: Chọn sinh viên chưa có ngày sinh
Giả sử bạn có bảng students:
| id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-05-10 |
| 2 | Maria Chi | NULL |
| 3 | Alex Lin | 1998-12-30 |
| 4 | Anna Song | NULL |
Query:
SELECT name
FROM students
WHERE birth_date IS NULL;
Kết quả:
| name |
|---|
| Maria Chi |
| Anna Song |
Query này rất hữu ích để tìm sinh viên cần bổ sung ngày sinh.
Bài 2: Chọn đơn hàng có ghi chú
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Giao hàng gấp" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Với bảng orders này, bạn có thể tìm đơn hàng đã có ghi chú như sau:
SELECT customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
Kết quả:
| customer_name | comment |
|---|---|
| Otto Art | "Giao hàng gấp" |
| Alex Lin | '' |
So sánh với các toán tử thông thường
Giờ thử làm một query "sai lầm" để kiểm tra NULL nhé:
SELECT *
FROM orders
WHERE comment = NULL;
Bất ngờ chưa? Query này sẽ không trả về dòng nào, kể cả khi comment rõ ràng là NULL. Đó là vì NULL không thể so sánh bằng các toán tử thông thường. Muốn so sánh kiểu này thì phải dùng IS NULL nha.
GO TO FULL VERSION