NULL trong SQL
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 5.Tóm tắt
Khách Chi chưa cung cấp email. Ô email của Chi không phải chuỗi rỗng, cũng
không phải số 0, mà là "không có gì". SQL gọi đó là NULL, và nó không hành
xử như một giá trị bình thường.
Khái niệm
🕳️ NULL: giá trị cho biết dữ liệu không có hoặc chưa biết, khác với 0 hay chuỗi rỗng.
🩹 NVL: hàm của Oracle trả về giá trị thay thế khi gặp NULL, ví dụ NVL(email, 'chưa có').
Mọi phép so sánh với NULL bằng = hay <> đều cho kết quả không đúng
cũng không sai, nên WHERE loại dòng đó. Muốn kiểm tra NULL phải dùng
IS NULL hoặc IS NOT NULL.
Hai điểm khác null của C#: so sánh = NULL không bao giờ đúng, và chuỗi
rỗng '' cũng là NULL. NVL làm việc giống toán tử ??.
Ví dụ
SELECT name
FROM customers
WHERE email IS NULL;IS NULLtìm những dòng chưa có email. Kết quả là Chi.IS NOT NULLthì ngược lại.- Oracle coi chuỗi rỗng
''làNULL. Lưu''vào cột nào thì ô đó thànhNULL.
Thử ngay
SELECT name, NVL(email, 'chưa có') AS email
FROM customers
ORDER BY customer_id;AS email đặt tên cho cột kết quả.
Đoán trước khi chạy: dòng của Chi hiện gì ở cột email?
Xem kết quả
| NAME | |
|---|---|
| An | an@shop.vn |
| Bình | binh@shop.vn |
| Chi | chưa có |
| Dũng | dung@shop.vn |
Email của Chi là NULL, nên NVL thay bằng "chưa có". Những dòng có email
thì giữ nguyên.
Lỗi hay gặp
So sánh với NULL bằng dấu =. Câu lệnh chạy được nhưng không trả về dòng
nào, kể cả dòng của Chi.
-- SAI — không bao giờ có kết quả
SELECT name FROM customers WHERE email = NULL;-- ĐÚNG
SELECT name FROM customers WHERE email IS NULL;Tìm chuỗi rỗng bằng = ''. Trong Oracle, '' chính là NULL, nên câu
này cũng không trả về dòng nào.
-- SAI — '' là NULL, so sánh bằng = luôn loại dòng
SELECT name FROM customers WHERE email = '';-- ĐÚNG — ô trống trong Oracle là NULL
SELECT name FROM customers WHERE email IS NULL;Tóm tắt
NULLlà không có dữ liệu, khác 0 và khác chuỗi rỗng.- Kiểm tra bằng
IS NULL,IS NOT NULL. Dùng= NULLthì không bao giờ có kết quả. NVL(cột, giá_trị)thay NULL bằng giá trị khác khi hiển thị.- Oracle coi
''làNULL.
Tự kiểm tra
0/3 câuBảng products có cột discount, một số dòng là NULL. Câu nào tìm các sản phẩm chưa có giảm giá?
Muốn hiện 0 thay cho NULL ở cột discount khi hiển thị. Viết thế nào?
Trong Oracle, INSERT một dòng với email = '' rồi tìm bằng WHERE email IS NULL. Dòng đó có được tìm thấy không?