5.1 Thiếu ý nghĩa

Ngôn ngữ SQL, giống như ngôn ngữ Java, có một từ khóa đặc biệt để biểu thị sự vắng mặt của một giá trị - đó là null. Hoặc như nó thường được viết - NULL.

Cách sử dụng NULLtrong SQL rất giống với cách sử dụng null trong Java. Trong Java, có thể có các đối tượng có trường chứa giá trị null. Trong SQL, có thể có các bảng có hàng chứa giá trị NULL.

Hãy để tôi cố tình thêm một vài sản phẩm không có nhãn hiệu vào bảng sản phẩm của chúng ta. Nếu thương hiệu của sản phẩm không xác định, thì giá trị sẽ là NULL.

Để hiển thị các sản phẩm như vậy, hãy sắp xếp bảng sản phẩm của chúng ta theo id theo thứ tự ngược lại và lấy 10 bản ghi. Yêu cầu sẽ trông như thế này:

SELECT * FROM product
ORDER BY id DESC
LIMIT 10

Chúng tôi nhận được kết quả truy vấn sau:

nhận dạng tên thương hiệu giá đếm
15 đinh tán VÔ GIÁ TRỊ 0,01 1000
14 Đinh ốc VÔ GIÁ TRỊ 0,10 1000
13 Đứng IKEA 100.00 10
12 chậu hoa hoa thông minh 99,00 9
mười một Ghế bành Bosch 44.00 số 8
10 Đĩa Bosch 199.00 10
9 tủ quần áo IKEA 99,00 10
số 8 Đèn LG 15.00 100
7 TV LG 350.00 4
6 Cái kệ Bosch 25.00 114

Vâng, tôi đã thêm đinh tán và ốc vít vào bàn. Họ có giá cả và số lượng, nhưng không có thương hiệu.

5.2 So sánh với NULL

Bạn có nhớ rằng đôi khi bạn đã từng phát điên với Java khi sử dụng null không? Rằng bạn không thể so sánh các biến có thể tham chiếu đến giá trị null thông qua hàm equals(). Ví dụ:

Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) {  //an exception will be raised here}

Bạn sẽ không tin, nhưng trong ngôn ngữ SQL, bạn cũng đang chờ đợi những sắc thái khi làm việc với giá trị NULL. Và nó nghe giống như thế này:không có gì là NULL.

Nếu bạn cố gắng lọc ra tất cả các sản phẩm có thương hiệu là null:

SELECT * FROM product
WHERE brand = NULL

Bạn sẽ nhận được một bảng trống:

nhận dạng tên thương hiệu giá đếm

Nhưng nếu bạn viết vào truy vấn rằng brand is not equal to NULL, bạn sẽ nhận được kết quả tương tự:

SELECT * FROM product
WHERE brand != NULL

Bạn sẽ lại nhận được một bảng trống:

nhận dạng tên thương hiệu giá đếm

Mọi so sánh/hành động với NULL sẽ trả về NULL:

Sự biểu lộ Kết quả
thương hiệu = NULL VÔ GIÁ TRỊ
thương hiệu != NULL VÔ GIÁ TRỊ
NULL = NULL VÔ GIÁ TRỊ
NULL != NULL VÔ GIÁ TRỊ

Đúng,ngay cả khi bạn so sánh NULL với NULL, thì câu trả lời sẽ là NULL.

5.3 LÀ NULL và KHÔNG PHẢI LÀ NULL

Vậy làm cách nào để kiểm tra xem một số trường (hoặc một số cột) có giá trị là NULL? Và đối với điều này, SQL có một biểu thức đặc biệt - IS NULL. Nó trông như thế này.

variable IS NULL

Nếu bạn muốn kiểm tra xem một cột trong bảng của bạn có khác với NULL, thì bạn cần viết IS NOT NULL:

variable IS NOT NULL

Hãy viết một truy vấn sẽ chọn tất cả các sản phẩm từ bảng sản phẩm có thương hiệu bằng NULL. Một yêu cầu như vậy sẽ trông như thế này:

SELECT * FROM product
WHERE brand IS NULL

Và chúng tôi nhận được kết quả truy vấn sau:

nhận dạng tên thương hiệu giá đếm
14 Đinh ốc VÔ GIÁ TRỊ 0,10 1000
15 đinh tán VÔ GIÁ TRỊ 0,01 1000

Bây giờ, hãy hiển thị tất cả các sản phẩm có giá dưới $20:

SELECT * FROM product
WHERE price  < 20

Và chúng tôi nhận được kết quả truy vấn sau:

nhận dạng tên thương hiệu giá đếm
2 Cái ghế IKEA 5,00 45
số 8 Đèn LG 15.00 100
14 Đinh ốc VÔ GIÁ TRỊ 0,10 1000
15 đinh tán VÔ GIÁ TRỊ 0,01 1000

Bây giờ chúng tôi xác định rằng giá phải dưới 20 đô la và thương hiệu thì không NULL.

SELECT * FROM product
WHERE price  < 20 AND brand IS NOT NULL

Chúng tôi nhận được kết quả truy vấn sau:

nhận dạng tên thương hiệu giá đếm
2 Cái ghế IKEA 5,00 45
số 8 Đèn LG 15.00 100

Tuyệt vời, hai dòng cuối cùng đã biến mất. Đây là cách nó hoạt động. Một chút bất thường, nhưng vẫn có một logic nhất định trong việc này.