萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL IS NULL 用法詳解:空值判斷、排序與常見誤區

NULL 的特殊本質

在 MySQL 中,`NULL` 代表 **「無值」、「未知值」、「缺失值」**。它**不是** 0、不是空字串 `''`、不是 `'null'` 字串。任何與 `NULL` 的**算術/比較運算**結果均為 `NULL` (即 `UNKNOWN`)。

正確判斷 NULL: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` 清晰

NULL 在聚合與分組中的行為

  • COUNT(column):**忽略** NULL 值。`COUNT(*)` 計算行數 (含 NULL)。
  • SUM()/AVG()/MIN()/MAX():忽略 NULL。
  • GROUP BY:所有 `NULL` 值**歸為同一組**。
  • ORDER BY:
    • `ASC` (默認):**NULL 排在最前**。
    • `DESC`:**NULL 排在最後**。
    • 可控制:`ORDER BY col IS NULL, col ASC` (非 NULL 優先) 或 `ORDER BY col IS NULL DESC, col ASC` (NULL 優先)。

NOT NULL 約束與默認值

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
);
  • `NOT NULL` 列**不能**插入 `NULL`,但**可以**插入 `0`、空字串 `''` (視類型而定)。
  • 若無 `DEFAULT` 且 `NOT NULL`,`INSERT` 不指定該列會報錯 (嚴格模式) 或使用隱式默認值 (0/空字串/零日期)。

實戰案例:題目數據演示

-- 建表示例數據 (見原文)
-- 查詢 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

應用場景與最佳實踐

  1. 業務語義區分:「未設置」vs「設置為空/零」。如 `discount_percent NULL` = 無折扣政策,`0` = 明確無折扣。
  2. 外鍵關聯:可為 NULL 表示無關聯 (如 `parent_id`)。
  3. 索引:MySQL **可以** 為 NULL 列建立索引,`IS NULL` 可用索引 (InnoDB)。
  4. 避免 `= NULL`/`!= NULL`** 永遠使用 `IS NULL`/`IS NOT NULL`。
  5. 應用層處理:PHP 中 `$row['col'] === null` 判斷,資料庫取出的 NULL 變為 PHP `null`。
  6. COALESCE/IFNULL:`SELECT COALESCE(category, '未分類')` 顯示默認值。
copyright © 萬盛學電腦網 all rights reserved