今天我們繼續來聊聊 NULL —— 資料庫裡的隱形英雄。如果你還以為 NULL 就只是「什麼都沒有」,你說得沒錯,但又不完全對。在這堂課裡,我們會學會怎麼檢查資料裡有沒有 NULL,還有該怎麼處理這種狀況。 準備好來追蹤那些不存在的值了嗎?
我們先從簡單的開始 —— 想像你在管理一個網路商店的資料庫。有一張訂單表,某些訂單沒有填寫評論,其他的則有備註。如果你想找出所有評論是空的訂單,然後用一般的比較 =、<>,你會很驚訝... 為什麼?因為 NULL 是個特例啦!
在 SQL 裡,檢查有沒有 NULL 要用 IS NULL 跟 IS NOT NULL。這兩個 operator 幫我們搞定 NULL,拿到想要的資料。
用 IS NULL 檢查值
IS NULL 是用來檢查某個欄位或運算式是不是 NULL。
SELECT *
FROM orders
WHERE comment IS NULL;
這個查詢會回傳所有 comment 欄位是 NULL 的資料列。很方便,想找沒有備註的訂單就靠它。
這裡有個 orders 表格範例:
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "緊急配送" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
查詢:
SELECT id, customer_name
FROM orders
WHERE comment IS NULL;
結果:
| id | customer_name |
|---|---|
| 2 | Maria Chi |
| 4 | Anna Song |
注意,空字串 '' 的那一列沒被選進來,因為 '' 不是 NULL 喔。
用 IS NOT NULL 檢查值
IS NOT NULL 則是反過來用,檢查值不是 NULL。比如你想找所有有填評論的訂單:
SELECT *
FROM orders
WHERE comment IS NOT NULL;
這個查詢只會回傳 comment 欄位有資料的列(包含空字串 '')。
範例
orders 表格還是長這樣。
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "緊急配送" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
來查詢一下:
SELECT id, customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
結果:
| id | customer_name | comment |
|---|---|---|
| 1 | Otto Art | "緊急配送" |
| 3 | Alex Lin | '' |
注意,空字串 '' 也會被選進來。SQL 覺得這個值「不是空的」。
什麼時候該用 IS NULL 跟 IS NOT NULL?
這裡有幾個常見情境:
- 資料過濾:你想排除那些缺資料的紀錄。
- 錯誤處理:有時
NULL代表資料輸入有問題,你得把這些列挑出來。 - 資料分析:統計缺值的數量,有助於了解資料品質。
實戰應用
來試幾個實用的小練習:
練習 1:找出沒有填生日的學生
假設你有一張 students 表:
| id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-05-10 |
| 2 | Maria Chi | NULL |
| 3 | Alex Lin | 1998-12-30 |
| 4 | Anna Song | NULL |
查詢:
SELECT name
FROM students
WHERE birth_date IS NULL;
結果:
| name |
|---|
| Maria Chi |
| Anna Song |
這個查詢很適合找出還沒填生日的學生,方便你去補資料。
練習 2:找出有評論的訂單
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "緊急配送" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
對 orders 表來說,我們可以找出有填評論的訂單:
SELECT customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
結果:
| customer_name | comment |
|---|---|
| Otto Art | "緊急配送" |
| Alex Lin | '' |
跟一般 operator 的比較
現在我們來試試「錯誤」的查詢方式來檢查 NULL:
SELECT *
FROM orders
WHERE comment = NULL;
是不是很意外?這個查詢一筆資料都不會回傳,就算 comment 明明是 NULL。因為 NULL 不能用一般的 operator 來比較。遇到這種情況一定要用 IS NULL 才行。
GO TO FULL VERSION