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 NULLdalam 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.