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 NULL
trong 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.