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就不会用错。
