IS NULL 是 MySQL 中唯一安全、标准的空值判断方式,因为 NULL 表示“未知”,= NULL 或 != NULL 永远返回 NULL(即不成立),无法用于条件筛选;空字符串 ''、数字 0 与 NULL 完全不同,需分别处理。

IS NULL 是 MySQL 中唯一安全、标准的空值判断方式,= NULL 或 != NULL 永远返回 NULL(即不成立),不能用于条件筛选。
为什么不能用 = NULL?
因为 SQL 中 NULL 表示“未知”,任何与 NULL 的等值比较结果都是 UNKNOWN(在 WHERE 中视为 FALSE)。即使字段确实是 NULL,WHERE col = NULL 也查不到任何记录。
常见错误现象:
-
SELECT * FROM user WHERE name = NULL;→ 返回空结果集(哪怕 name 列全是 NULL) -
SELECT * FROM user WHERE name != 'admin';→ 自动排除所有name IS NULL的行(因为NULL != 'admin'不为 TRUE)
IS NULL 和 IS NOT NULL 的基本用法
这是唯一推荐的空值判断语法,语义清晰、跨数据库兼容、执行计划稳定。
实操建议:
- 查所有未填手机号的用户:
SELECT * FROM user WHERE phone IS NULL; - 查邮箱已填写且不为空字符串的用户:
SELECT * FROM user WHERE email IS NOT NULL AND email != '';(注意:空字符串''≠NULL) - 联合索引中含
IS NULL条件时,MySQL 仍可能使用索引(取决于版本和统计信息),但IS NOT NULL在某些旧版本中会跳过索引
区分 NULL、空字符串 '' 和数字 0
三者在 MySQL 中完全不同,业务逻辑中常被混为一谈,导致查询漏数据或误删。
典型场景:
- 用户注册时未提交地址 → 字段为
NULL - 用户主动填了空格或
''→ 字段为非 NULL 空字符串 - 年龄字段默认设为
0→ 是有效数值,不是缺失
安全查询示例(同时覆盖 NULL 和空字符串):SELECT * FROM user WHERE address IS NULL OR TRIM(address) = '';
用 COALESCE 或 IFNULL 做空值替代时的注意事项
它们不用于判断,但常配合 IS NULL 使用。重点在于类型一致性:
-
IFNULL(phone, '未提供')要求两个参数类型兼容;若phone是BIGINT,而'未提供'是字符串,MySQL 会隐式转成数字0,造成数据失真 -
COALESCE(col1, col2, 'N/A')返回第一个非 NULL 值,但所有参数会被强制转为最高优先级类型(如含 DATETIME 和 VARCHAR,可能报错或截断) - 在
ORDER BY中用COALESCE(age, 999)排序时,要注意 999 是否符合业务语义(比如年龄最大只到 120)
真正容易被忽略的是:建表时没明确 NOT NULL 约束,又没配默认值,导致大量字段可为 NULL,后续每个查询都得加 IS NULL 判断——这种设计债比写错一条 SQL 影响更深远。










