ifnull 是 mysql 中专用于将 null 转为指定值的函数,语法为 ifnull(expr1, expr2),仅当 expr1 为 sql null 时返回 expr2,否则返回 expr1;它不处理空字符串或 0,且仅支持两个参数,适用于聚合统计中补零场景。

IFNULL 是 MySQL 里最直接、最安全的“空转0”手段,尤其适合聚合统计场景;它比 COALESCE 更简洁,比 IS NULL 判断更少出错。
IFNULL 函数怎么写才不出错
语法就一个套路:IFNULL(expr1, expr2),当 expr1 是 NULL(注意:不是空字符串或 0),就返回 expr2;否则返回 expr1。关键点在于:
-
expr1必须是可能为NULL的字段或表达式,比如SUM(amount)、AVG(score)、左连接查不到的字段 -
expr2类型最好和expr1一致,否则 MySQL 会隐式转换——比如IFNULL(count(*), '0')虽然能跑,但结果变成字符串,后续加减会出问题 - 不能用它处理空字符串:
IFNULL('', 0)返回的是'',不是0,因为''不等于NULL
在 COUNT/SUM/AVG 等聚合函数后加 IFNULL 的典型写法
聚合函数本身不产生 NULL,但分组后某组没数据时,SUM 或 AVG 就会返回 NULL;COUNT 永远返回数字,所以不需要 IFNULL。
示例:查每个部门的总薪资,没人的部门显示 0
SELECT dept_id, IFNULL(SUM(salary), 0) AS total_salary FROM employees GROUP BY dept_id;
- 如果某
dept_id下没有任何员工记录,SUM(salary)返回NULL,IFNULL把它转成0 - 别写成
IFNULL(COUNT(*), 0)——COUNT(*)永远 ≥ 0,不会是NULL - 如果想把「无部门」也纳入统计(比如
LEFT JOIN后的空匹配),同样适用:IFNULL(e.salary, 0)
IFNULL 和 COALESCE 的区别在哪,什么时候该换用 COALESCE
IFNULL 只接受两个参数,而 COALESCE(a, b, c) 支持多参数、按顺序返回第一个非 NULL 值。实际中容易踩的坑:
-
IFNULL(NULL, IFNULL(NULL, 0))是合法嵌套,但可读性差;不如直接用COALESCE(col1, col2, 0) -
COALESCE是 SQL 标准函数,跨数据库兼容性更好(PostgreSQL、SQL Server 都支持);IFNULL是 MySQL 特有 - 性能上几乎没差别,但
IFNULL在 MySQL 内部做了优化,简单两值场景下略快一点点 - 如果字段可能为
NULL或空字符串,得先用NULLIF转换:IFNULL(NULLIF(col, ''), 0),这时候逻辑已经变复杂,建议抽到视图或应用层处理
真正要注意的是:NULL 和空值不是一回事,IFNULL 对空字符串、0、'false' 都无感——它只响应 SQL 层面的 NULL。业务里常有人把“没填”当成空字符串存进去了,结果 IFNULL 完全不生效,得先查数据真实状态。











