mysql中isnull()仅支持单参数,用于判断是否为null并返回1或0;替换null应使用ifnull()或coalesce(),where中检测null推荐用is null而非isnull()。

MySQL 中没有 ISNULL(expr1, expr2) 这种双参数写法,用它会直接报错 (1582, "Incorrect parameter count in the call to native function 'ISNULL'") ——这是最常见的误踩点。
ISNULL() 只能单参数,本质是布尔判断函数
它不是用来“替换 NULL”的,而是用来“判断是否为 NULL”并返回 1 或 0 的标量函数。语义等价于 expr IS NULL,但返回的是数字而非布尔值(在 MySQL 中布尔即 TINYINT(1))。
-
ISNULL(NULL)→ 返回1 -
ISNULL(42)→ 返回0 -
ISNULL('')→ 返回0(空字符串不等于 NULL) -
ISNULL(name)常用于统计:SELECT SUM(ISNULL(phone)) AS missing_phone_count FROM users;
想把 NULL 替换成默认值?别用 ISNULL,改用 IFNULL 或 COALESCE
真正做“空值兜底”的场景,ISNULL() 完全不合适。它不接受第二个参数,强行加就会触发上面那个错误。
-
IFNULL(expr1, expr2):MySQL 原生、高效、仅限两个参数,推荐用于简单兜底
例如:SELECT IFNULL(price, 0) AS price FROM products; -
COALESCE(expr1, expr2, expr3, ...):SQL 标准函数,支持多参数,按序取第一个非 NULL 值
例如:SELECT COALESCE(nickname, real_name, '用户') AS display_name FROM users; - 注意:
IFNULL(NULL, '')返回空字符串,但IFNULL('', 'N/A')仍返回''——它只认 NULL,不认空字符串
WHERE 条件里检测 NULL,优先用 IS NULL 而非 ISNULL()
虽然 WHERE ISNULL(col) 语法合法,但可读性差、易和 SQL Server 混淆,且无法利用索引(和 col IS NULL 一样,但后者是标准写法)。
- ✅ 推荐:
SELECT * FROM orders WHERE status IS NULL; - ⚠️ 可用但不推荐:
SELECT * FROM orders WHERE ISNULL(status); - ❌ 错误:
SELECT * FROM orders WHERE ISNULL(status, 'pending');(语法报错) - 如果还要同时过滤空字符串,得显式写:
WHERE status IS NULL OR status = ''
真正容易被忽略的是:NULL 和空字符串在 MySQL 中完全独立,ISNULL() 对空字符串返回 0,对 NULL 才返回 1;而业务上常把两者都当作“缺失值”处理——这时候必须手动合并判断,不能只靠一个函数搞定。











