NULL在SQL中表示未知而非值,因此= NULL永远不成立;正确判断空值必须用IS NULL,显示默认值应使用COALESCE或IFNULL等函数。
= NULL 永远不成立因为 NULL 在 SQL 中不是值,而是“未知”状态。它不等于任何东西——包括它自己。所以 WHERE col = NULL 的结果永远是 UNKNOWN(三值逻辑中的第三种状态),而 WHERE 子句只接受 TRUE 的行,UNKNOWN 和 FALSE 都被过滤掉。
SELECT * FROM users WHERE phone = NULL; → 返回空结果集,哪怕表里真有 phone 为 NULL 的记录phone != '138xxx' 或 phone '138xxx' 也不会包含 NULL 行——它们被悄悄排除了NaN == NaN 返回 False 是同一类设计哲学:未知不可比较IS NULL 和 IS 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,本意可能是“找出所有没得满分的人”,但实际结果里不会包含 score 为 NULL 的人——他们既没得 100,也不算“不等于 100”,只是“未知”。
WHERE score 100 OR score IS NULL
IN 和 NOT IN 对 NULL 敏感:WHERE id NOT IN (1, 2, NULL) 会返回空——因为含 NULL 的 NOT IN 整体判为 UNKNOWN
WHERE id NOT IN (1, 2) AND id IS NOT NULL
如果只是想让查询结果里不出现 NULL(比如报表展示),与其在 WHERE 里反复纠结,不如用转换函数在 SELECT 层处理。
IFNULL(email, '未填写') —— MySQL 专用,简洁直接COALESCE(phone, mobile, '暂无联系方式') —— 标准 SQL,支持多参数取第一个非 NULLCOALESCE 所有参数类型需兼容,否则可能隐式转换出错(如字符串和数字混用)SELECT name, COALESCE(phone, mobile, '请补充联系方式') AS contact, IFNULL(score, 0) AS score_display FROM students;
NULL 不是空字符串,不是 0,不是 false,它就是“不知道”。只要记住判断它只能靠 IS NULL,显示它优先用 COALESCE,绝大多数坑就绕开了。