必须用is null而非= null,因null是缺失标记,所有等值比较均返回unknown,where只保留true行;正确写法为select * from users where email is null。
用 is null 而不是 = null
直接写 where column = null 永远查不到结果——因为 sql 中 null 不参与等于比较,它代表“未知”,任何与 null 的等值判断都返回 unknown(在 where 中等效于 false)。必须用标准的空值判断语法:is null 或 is not null。
在 phpMyAdmin 的 SQL 标签页里,写这样的语句就能查出字段为空的记录:
SELECT * FROM users WHERE email IS NULL;
常见错误包括:
- 误写成
email = NULL或email == NULL - 把引号套进去,比如
email = 'NULL'(这查的是字符串字面量 "NULL") - 混淆
IS NULL和IS NULL OR email = ''(后者才同时覆盖空字符串)
在 phpMyAdmin 表格界面点选 NULL 值筛选
如果不想写 SQL,可以直接在表数据页操作:点击列名上方的筛选输入框(比如 “email” 列顶部的小输入框),下拉菜单里会显示 NULL 选项,勾选它即可实时过滤。
注意几个限制:
- 该功能只对允许
NULL的列生效(即建表时定义了DEFAULT NULL或未设NOT NULL) - 如果列类型是
TINYINT(1)且存了0,它不会被当成NULL——0是有效值,NULL是缺失值 - 筛选后 URL 里会出现类似
&where_clause=email+IS+NULL,可复制保存为快捷查询
COALESCE 和 IFNULL 在查询中补空值
有时你不是只想找 NULL,而是想把它们替换成默认值再查(比如统计、导出或前端展示)。这时可在 SELECT 中用转换函数:
SELECT id, COALESCE(phone, '未提供') AS phone FROM customers;
COALESCE 接多个参数,返回第一个非 NULL 的值;IFNULL(expr1, expr2) 是 MySQL 特有简写,只支持两个参数。二者区别在于:
-
IFNULL更短,但只兼容 MySQL;COALESCE是 SQL 标准,跨数据库更稳 -
COALESCE所有参数类型需兼容(比如不能混用字符串和数字),否则报错Truncated incorrect DOUBLE value - 在 ORDER BY 或 GROUP BY 中用它们,要注意隐式类型转换可能影响排序顺序
小心索引失效:为什么 IS NULL 查询有时很慢
哪怕字段上有索引,WHERE col IS NULL 也不一定走索引——尤其当该列 NULL 占比极高(比如 > 95%)时,优化器可能直接全表扫描。
验证是否用了索引:
- 在 phpMyAdmin 的 SQL 窗口执行前加
EXPLAIN,看key列是否非NULL - 如果没走索引,考虑加一个函数索引(MySQL 8.0+):
CREATE INDEX idx_email_null ON users ((email IS NULL)); - 旧版本可建生成列:
ALTER TABLE users ADD COLUMN email_is_null TINYINT GENERATED ALWAYS AS (email IS NULL) STORED;,再给它建索引
真正麻烦的是复合条件,比如 WHERE status = 'active' AND email IS NULL——这时候需要联合索引把 status 放前面,email 放后面,且确保 email 在索引中位置允许 IS NULL 判断生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











