为什么不能用等号判断null_mysql语法误区说明

7次阅读

NULL 在 SQL 中表示未知而非值,因此 = NULL 永远不成立;正确判断空值必须用 IS NULL,显示默认值应使用 COALESCE 或 IFNULL 等函数。

为什么不能用等号判断 null_mysql 语法误区说明

为什么 = NULL 永远不成立

因为 NULL 在 SQL 中不是值,而是“未知”状态。它不等于任何东西——包括它自己。所以 WHERE col = NULL 的结果永远是 UNKNOWN(三值逻辑中的第三种状态),而 WHERE 子句只接受 TRUE 的行,UNKNOWNFALSE 都被过滤掉。

  • SELECT * FROM users WHERE phone = NULL; → 返回空结果集,哪怕表里真有 phoneNULL 的记录
  • 同理,phone != '138xxx'phone '138xxx' 也不会包含 NULL 行——它们被悄悄排除了
  • 这和 Python 的 NaN == NaN 返回 False 是同一类设计哲学:未知不可比较

正确写法只有 IS NULLIS NOT NULL

这是 SQL 标准语法,在 MySQL、PostgreSQL、SQL Server 等所有主流数据库中都一致有效,且语义明确、无歧义。

  • 查空值:WHERE email IS NULL
  • 查非空值:WHERE email IS NOT NULL
  • 可安全组合:WHERE status = 'active' AND created_at IS NULL
  • 注意:IS 是关键字,不能省略或替换成 =IS NULL 是一个整体操作符,不是“IS”加“NULL”

常见连带陷阱:不等于条件漏掉 NULL 数据

当你写 WHERE score 100,本意可能是“找出所有没得满分的人”,但实际结果里不会包含 scoreNULL 的人——他们既没得 100,也不算“不等于 100”,只是“未知”。

  • 要真正表达“不是 100,包括未知”,必须显式补上:WHERE score 100 OR score IS NULL
  • 同理,INNOT IN 对 NULL 敏感:WHERE id NOT IN (1, 2, NULL) 会返回空——因为含 NULLNOT IN 整体判为 UNKNOWN
  • 安全替代方案:WHERE id NOT IN (1, 2) AND id IS NOT NULL

想显示默认值?别在判断上硬扛,用函数转换

如果只是想让查询结果里不出现 NULL(比如报表展示),与其在 WHERE 里反复纠结,不如用转换函数在 SELECT 层处理。

  • IFNULL(email, '未填写') —— MySQL 专用,简洁直接
  • COALESCE(phone, mobile, '暂无联系方式') —— 标准 SQL,支持多参数取第一个非 NULL
  • 注意:COALESCE 所有参数类型需兼容,否则可能 隐式转换 出错(如字符串和数字混用)
SELECT    name,   COALESCE(phone, mobile, '请补充联系方式') AS contact,   IFNULL(score, 0) AS score_display FROM students;

NULL 不是空字符串,不是 0,不是 false,它就是“不知道”。只要记住判断它只能靠 IS NULL,显示它优先用 COALESCE,绝大多数坑就绕开了。

text=ZqhQzanResources