在 MySQL 中,`NULL` 代表 **「無值」、「未知值」、「缺失值」**。它**不是** 0、不是空字串 `''`、不是 `'null'` 字串。任何與 `NULL` 的**算術/比較運算**結果均為 `NULL` (即 `UNKNOWN`)。
IS NULL / IS NOT NULL-- 查找 category 為 NULL 的記錄
SELECT name, department, category
FROM topic
WHERE category IS NULL;
-- 查找 category 不為 NULL
SELECT name, department, category
FROM topic
WHERE category IS NOT NULL;
| 錯誤寫法 | 結果 | 原因 |
|---|---|---|
| `WHERE category = NULL` | 永遠匹配 0 行 | `= NULL` 永遠為 `UNKNOWN` (非 TRUE) |
| `WHERE category != NULL` | 永遠匹配 0 行 | `!= NULL` 永遠為 `UNKNOWN` |
| `WHERE category <=> NULL` | **可行** (NULL-safe 相等) | `<=>` 視 NULL 為相等值,但語義不如 `IS NULL` 清晰 |
COUNT(column):**忽略** NULL 值。`COUNT(*)` 計算行數 (含 NULL)。SUM()/AVG()/MIN()/MAX():忽略 NULL。GROUP BY:所有 `NULL` 值**歸為同一組**。ORDER BY:
CREATE TABLE topic (
topicid SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL, -- 必填
instock SMALLINT UNSIGNED NOT NULL DEFAULT 0, -- 非空 + 默認 0
category VARCHAR(20) -- 允許 NULL
);
-- 建表示例數據 (見原文)
-- 查詢 category 為 NULL
SELECT name, department, category FROM topic WHERE category IS NULL ORDER BY name;
-- Empty set (示例數據無 NULL)
-- 查詢 category 不為 NULL
SELECT name, department, category FROM topic WHERE category IS NOT NULL ORDER BY name;
-- 返回全部 16 行
-- NULL-safe 相等 (等價於 IS NULL)
SELECT * FROM topic WHERE category <=> NULL; -- Empty set