mysql中判断null的唯一标准写法是is null和is not null;isnull()是返回0/1的数值函数,非标准判断操作符,不可替代is null用于where条件。

MySQL 中 IS NULL 和 IS NOT NULL 是唯一标准写法
MySQL 不支持 IsNull() 或 IsNotNull() 这类函数形式来判断 NULL——那是 SQL Server 的语法。在 MySQL 里硬写 IsNull(col) 不会报错,但它的含义完全不同:ISNULL() 是一个返回 0 或 1 的函数,仅用于检测表达式是否为 NULL 值(类似 IFNULL() 的布尔版),不能用在 WHERE 子句中替代标准的 IS NULL 判断。
常见错误现象:
- 写
WHERE IsNull(name)→ 实际执行的是函数调用,结果恒为 0 或 1,无法按预期过滤出 name 为 NULL 的行 - 写
WHERE name = NULL→ 永远不成立,因为 NULL 与任何值(包括自身)比较都返回 UNKNOWN
正确写法:用 IS NULL 和 IS NOT NULL 直接判断
这是 SQL 标准语法,在 MySQL 中完全支持,语义清晰、性能好、可被索引优化(部分场景下)。
使用示例:
SELECT * FROM users WHERE email IS NULL; SELECT * FROM orders WHERE shipped_at IS NOT NULL;
注意事项:
-
IS NULL和IS NOT NULL是操作符,不是函数,后面不加括号 - 它们只能作用于列或表达式,不能写成
IS NULL(col) - 复合条件中注意优先级:
WHERE status = 'active' AND created_at IS NULL比WHERE status = 'active' AND ISNULL(created_at)更安全、更易读
ISNULL() 函数在 MySQL 中的真实用途
MySQL 的 ISNULL() 是一个数值函数,返回 1 表示表达式计算结果为 NULL,否则返回 0。它常用于排序或条件计算,而非逻辑过滤。
典型用法:
SELECT name, ISNULL(score) AS score_missing FROM students; SELECT * FROM products ORDER BY ISNULL(discount), discount DESC;
容易踩的坑:
- 误以为
ISNULL(col)等价于col IS NULL—— 虽然结果相同,但语义和执行路径不同,前者是函数调用,可能阻止索引使用 - 在
WHERE中混用:WHERE ISNULL(updated_at) = 1虽能工作,但多了一层隐式转换,可读性差,且 MySQL 优化器不一定能有效下推
NULL 判断相关的兼容性与性能提醒
MySQL 对 IS NULL 的索引支持取决于存储引擎和字段定义:
- InnoDB 支持对允许 NULL 的列建立 B+ 树索引,
WHERE col IS NULL可走索引(需该列在索引最左前缀中) - 如果字段定义为
NOT NULL,那IS NULL条件永远不匹配,优化器会直接剪枝 - 避免在判断条件中对字段做函数操作,例如
WHERE IFNULL(phone, '') = ''会强制全表扫描
真正要检查空值,就老实用 IS NULL;想补默认值再比较,才考虑 IFNULL() 或 COALESCE()。
NULL 的语义本身就很特殊,加上不同数据库对函数名的重载(比如 SQL Server 的 ISNULL vs MySQL 的 ISNULL()),最容易出问题的地方,往往就是抄了别家的写法却没意识到上下文已变。











