MySQL 中 NULL 表示未知或不存在,须用 IS NULL/IS NOT NULL 判断;= 或 != 与 NULL 比较恒为 UNKNOWN;可用 COALESCE/IFNULL 转换默认值;聚合函数自动忽略 NULL,索引中 NULL 单独存储。

在 MySQL 中,空值(NULL)不是空字符串('')也不是数字 0,而是一个特殊的标记,表示“未知”或“不存在”。直接用 = 或 != 判断 NULL 会返回 FALSE 或 UNKNOWN,因此必须使用专门的 NULL 判断语法。
用 IS NULL 和 IS NOT NULL 判断空值
这是最标准、最安全的方式。MySQL 提供了两个专用操作符:
-
column_name IS NULL:匹配该字段值为 NULL 的记录 -
column_name IS NOT NULL:匹配该字段值非 NULL 的记录
例如查询没有填写电话号码的用户:
SELECT * FROM users WHERE phone IS NULL;避免用 = NULL 或 != NULL
以下写法**永远不生效**,因为 NULL 参与任何普通比较运算都会返回 UNKNOWN(在 WHERE 中等价于 FALSE):
-
WHERE phone = NULL→ 不会查出任何 NULL 记录 -
WHERE phone != NULL或WHERE phone NULL→ 同样无效
MySQL 会警告你:“Incorrect usage of NULL value”,但不会报错,容易埋下逻辑漏洞。
用 COALESCE 或 IFNULL 处理 NULL 显示或计算
当需要把 NULL 转成默认值(比如显示为 '暂无' 或参与数值计算),可用:
-
COALESCE(col, '默认值'):返回第一个非 NULL 的表达式,支持多个参数 -
IFNULL(col, '默认值'):仅接受两个参数,更简洁
示例:把 NULL 的 age 显示为 0,用于统计平均年龄:
SELECT AVG(IFNULL(age, 0)) FROM users;注意 NULL 在聚合函数和索引中的行为
大多数聚合函数(如 COUNT、SUM、AVG)会自动忽略 NULL 值:
-
COUNT(*)统计所有行;COUNT(col)只统计 col 非 NULL 的行 - 索引列允许存储 NULL(除非定义了 NOT NULL 约束),但 B-Tree 索引中 NULL 值通常单独存放,部分场景下可能影响查询效率
建表时若业务上该字段不应为空,建议显式声明 NOT NULL 并设默认值,从源头减少 NULL 处理负担。










