5.1 Kurang kepentingan
Bahasa SQL, seperti bahasa Java, mempunyai kata kunci khas untuk menandakan ketiadaan nilai - ia adalah batal. Atau seperti yang sering ditulis - NULL
.
Penggunaan NULL
dalam SQL sangat serupa dengan penggunaan null di Jawa. Di Jawa, mungkin terdapat objek yang bidangnya mengandungi nilai nol. Dalam SQL, mungkin terdapat jadual yang barisnya mengandungi nilai NULL.
Izinkan saya menambahkan beberapa produk tidak berjenama pada jadual produk kami dengan sengaja. Jika jenama produk tidak diketahui, maka nilainya ialah NULL
.
Untuk memaparkan produk sedemikian, mari kita susun jadual produk kita mengikut id dalam susunan terbalik dan ambil 10 rekod. Permintaan akan kelihatan seperti ini:
SELECT * FROM product
ORDER BY id DESC
LIMIT 10
Kami mendapat hasil pertanyaan berikut:
ID | nama | jenama | harga | mengira |
---|---|---|---|---|
15 | Rivet | NULL | 0.01 | 1000 |
14 | skru | NULL | 0.10 | 1000 |
13 | Berdiri | IKEA | 100.00 | 10 |
12 | Pasu bunga | Bunga pintar | 99.00 | 9 |
sebelas | Kerusi berlengan | Bosch | 44.00 | 8 |
10 | Pinggan | Bosch | 199.00 | 10 |
9 | almari pakaian | IKEA | 99.00 | 10 |
8 | lampu | LG | 15.00 | 100 |
7 | TV | LG | 350.00 | 4 |
6 | rak | Bosch | 25.00 | 114 |
Ya, saya menambah rivet dan skru pada meja. Mereka mempunyai harga dan kuantiti, tetapi tiada jenama.
5.2 Perbandingan dengan NULL
Adakah anda ingat bahawa kadang-kadang anda pernah marah di Jawa apabila menggunakan null? Bahawa anda tidak boleh membandingkan pembolehubah yang boleh merujuk kepada nilai nol melalui equals(). Contoh:
Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) { //an exception will be raised here
…
}
Anda tidak akan mempercayainya, tetapi dalam bahasa SQL anda juga sedang menunggu nuansa apabila bekerja dengan nilai NULL. Dan bunyinya seperti ini:tiada yang NULL.
Jika anda cuba menapis semua produk yang mempunyai jenama null
:
SELECT * FROM product
WHERE brand = NULL
Anda akan mendapat meja kosong:
ID | nama | jenama | harga | mengira |
---|
Tetapi jika anda menulis dalam pertanyaan bahawa jenama tidak sama dengan NULL
, anda akan mendapat hasil yang sama:
SELECT * FROM product
WHERE brand != NULL
Anda sekali lagi akan mendapat meja kosong:
ID | nama | jenama | harga | mengira |
---|
Sebarang perbandingan/tindakan dengan NULL akan mengembalikan NULL:
Ungkapan | Hasilnya |
---|---|
jenama = NULL | NULL |
jenama != NULL | NULL |
NULL = NULL | NULL |
NULL != NULL | NULL |
ya,walaupun anda membandingkan NULL dengan NULL, maka jawapannya adalah NULL.
5.3 ADALAH NULL dan BUKAN NULL
Jadi bagaimana kita menyemak bahawa beberapa medan (atau beberapa lajur) mempunyai nilai NULL
? Dan untuk ini, SQL mempunyai ungkapan khas - IS NULL
. Ia kelihatan seperti ini.
variable IS NULL
Jika anda ingin menyemak sama ada lajur jadual anda tidak sama dengan NULL
, maka anda perlu menulis IS NOT NULL
:
variable IS NOT NULL
Mari tulis pertanyaan yang akan memilih semua produk daripada jadual produk yang jenamanya bersamaan dengan NULL
. Permintaan sedemikian akan kelihatan seperti ini:
SELECT * FROM product
WHERE brand IS NULL
Dan kami mendapat hasil pertanyaan berikut:
ID | nama | jenama | harga | mengira |
---|---|---|---|---|
14 | skru | NULL | 0.10 | 1000 |
15 | Rivet | NULL | 0.01 | 1000 |
Sekarang mari kita paparkan semua produk yang harganya kurang daripada $20:
SELECT * FROM product
WHERE price < 20
Dan kami mendapat hasil pertanyaan berikut:
ID | nama | jenama | harga | mengira |
---|---|---|---|---|
2 | kerusi | IKEA | 5.00 | 45 |
8 | lampu | LG | 15.00 | 100 |
14 | skru | NULL | 0.10 | 1000 |
15 | Rivet | NULL | 0.01 | 1000 |
Sekarang kami menyatakan bahawa harga mestilah kurang daripada $20 dan jenama itu tidak NULL
.
SELECT * FROM product
WHERE price < 20 AND brand IS NOT NULL
Kami mendapat hasil pertanyaan berikut:
ID | nama | jenama | harga | mengira |
---|---|---|---|---|
2 | kerusi | IKEA | 5.00 | 45 |
8 | lampu | LG | 15.00 | 100 |
Bagus, dua baris terakhir sudah tiada. Begini cara ia berfungsi. Sedikit luar biasa, tetapi masih terdapat logik tertentu dalam hal ini.