IS NULL 和 IS NOT NULL 是 MySQL 中判断 NULL 的唯一正确方式,因为 NULL 表示缺失或未知状态,不能用 =、!= 等比较操作符;空字符串 ”、数值 0 与 NULL 本质不同,需分别处理。

IS NULL 和 IS NOT NULL 是唯一正确的 NULL 判断方式
在 MySQL 中,NULL 不是一个值,而是一种“缺失/未知”状态。因此它不能用 =、!= 或 比较——这些操作一律返回 UNKNOWN(既不是 TRUE 也不是 FALSE),导致查询结果为空或逻辑错乱。
-
SELECT * FROM users WHERE phone = NULL;→ 永远不返回任何行,哪怕phone全是NULL -
SELECT * FROM users WHERE phone IS NULL;→ 正确,能准确命中所有空值记录 -
IS NOT NULL同理,是判断“有值”的唯一可靠方式,不是!= NULL的替代写法
常见误用场景:空字符串 ”、数值 0 和 NULL 完全不同
很多人把 ''(空字符串)、0 和 NULL 当成一回事,但 MySQL 严格区分:
-
NULL:无值、未知、未填写 -
'':明确填了“空”,是长度为 0 的字符串 -
0:一个具体数值,参与计算不会变成NULL
所以如果你要查“没填电话”,只写 phone IS NULL 是不够的——有些用户可能填了 ''。需要联合判断:
SELECT * FROM users WHERE phone IS NULL OR phone = '';
和聚合函数、排序、条件表达式一起用时要注意行为差异
IS NULL 在复杂语句中很常用,但几个关键点容易出错:
-
COUNT(phone)自动忽略NULL,但COUNT(*)不忽略——别指望它统计“空值数量” - 排序时
ORDER BY phone默认把NULL排在最前(ASC)或最后(DESC),取决于 MySQL 版本和 SQL 模式 - 用
IF或CASE做空值标记时,必须用IS NULL判断:IF(phone IS NULL, '未提供', phone) -
IN (a, b, NULL)会导致整个条件失效(因为col IN (..., NULL)永远不为TRUE)
建表和写代码时的防御性建议
空值问题往往在写查询时暴露,但根子在设计阶段:
- 字段能设
NOT NULL就别留空——比如created_at、user_id这类必填字段 - 允许空值的字段,考虑加
DEFAULT NULL显式声明,避免靠隐式行为 - 应用层(如 Python/Java/PHP)取到数据库返回的
NULL时,别直接调用.length()或json.dumps(),先判空 - 批量更新时慎用
SET col = NULL,尤其当该列被其他业务逻辑依赖非空时
真正难的不是语法,而是意识到:NULL 不是“空”,而是“不知道”。只要记住这点,IS NULL 就不会用错。
