5.1 缺乏意義

SQL 語言和 Java 語言一樣,有一個特殊的關鍵字來表示值的缺失——它是 null。或者正如它經常寫的那樣 - NULL

SQL 中的用法NULL與 Java 中 null 的用法非常相似。在 Java 中,可能存在其字段包含空值的對象。在 SQL 中,可能存在其行包含 NULL 值的表。

讓我特意在我們的產品表中添加一些無品牌產品。如果產品的品牌未知,則該值為NULL

要顯示此類產品,讓我們按id倒序對我們的產品表進行排序,並取 10 條記錄。該請求將如下所示:

SELECT * FROM product
ORDER BY id DESC
LIMIT 10

我們得到如下查詢結果:

ID 姓名 品牌 價格 數數
15 鉚釘 無效的 0.01 1000
14 擰緊 無效的 0.10 1000
13 站立 宜家 100.00 10
12 花盆 聰明花 99.00 9
十一 扶手椅 博世 44.00 8個
10 盤子 博世 199.00 10
9 梳妝台 宜家 99.00 10
8個 LG 15.00 100
7 電視 LG 350.00 4個
6個 架子 博世 25.00 114

是的,我在桌子上加了鉚釘和螺絲。他們有價格和數量,但沒有品牌。

5.2 與 NULL 的比較

你還記得你以前在 Java 中使用 null 時會很生氣嗎?您不能通過 equals() 比較可以引用空值的變量。例子:

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

您可能不會相信,但在 SQL 語言中,您也在等待處理 NULL 值時的細微差別。聽起來像這樣:什麼都不是 NULL.

如果您嘗試過濾掉品牌為的所有產品null

SELECT * FROM product
WHERE brand = NULL

你會得到一個空表:

ID 姓名 品牌 價格 數數

但是,如果您在查詢中寫入brand不等於NULL,您將得到相同的結果:

SELECT * FROM product
WHERE brand != NULL

你會再次得到​​一個空表:

ID 姓名 品牌 價格 數數

與 NULL 的任何比較/操作都將返回 NULL:

表達 結果
品牌 = NULL 無效的
品牌 != NULL 無效的
空 = 空 無效的
空!= 空 無效的

是的,即使你將 NULL 與 NULL 進行比較,那麼答案也將是 NULL.

5.3 IS NULL 和 IS NOT NULL

那麼我們如何檢查某些字段(或某些列)的值為NULL?為此,SQL 有一個特殊的表達式 - IS NULL。看起來像這樣。

variable IS NULL

如果你想檢查你的表的列是否不等於NULL,那麼你需要寫IS NOT NULL

variable IS NOT NULL

讓我們編寫一個查詢,從產品表中選擇品牌等於 的所有產品NULL。這樣的請求看起來像這樣:

SELECT * FROM product
WHERE brand IS NULL

我們得到以下查詢結果:

ID 姓名 品牌 價格 數數
14 擰緊 無效的 0.10 1000
15 鉚釘 無效的 0.01 1000

現在讓我們顯示所有價格低於 20 美元的產品:

SELECT * FROM product
WHERE price  < 20

我們得到以下查詢結果:

ID 姓名 品牌 價格 數數
2個 椅子 宜家 5.00 45
8個 LG 15.00 100
14 擰緊 無效的 0.10 1000
15 鉚釘 無效的 0.01 1000

現在我們指定價格必須低於 $20 而品牌不是NULL

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

我們得到如下查詢結果:

ID 姓名 品牌 價格 數數
2個 椅子 宜家 5.00 45
8個 LG 15.00 100

太好了,最後兩行不見了。這是它的工作原理。有點不尋常,但這其中還是有一定的邏輯的。