ifnull(expr1, expr2)在mysql中用于字段级空值兜底,expr1非null时返回其值,否则返回expr2;常用于left join右表字段补默认值、数值计算前防null、比coalesce更轻量但仅支持两参数。

在MySQL联表查询中,如果关联字段不存在匹配数据,对应列会返回NULL。用IFNULL()可直接将这些NULL替换为指定默认值,无需额外判断或子查询。
IFNULL的基本用法
IFNULL(expr1, expr2)函数的作用是:当expr1不为NULL时返回expr1,否则返回expr2。它适合用于字段级的空值兜底,尤其在SELECT列表中直接处理联表结果。
- 语法简洁,只接受两个参数,性能开销小
- 不能嵌套使用多个条件(如多层空值判断),此时应改用
CASE WHEN或COALESCE() - 注意
expr2的数据类型最好与expr1兼容,避免隐式转换导致意外结果
在LEFT JOIN中覆盖右表NULL值
最常见的场景是LEFT JOIN后右表字段为空。例如订单表关联用户表,部分订单可能用户信息缺失:
SELECT o.order_id, IFNULL(u.username, '未知用户') AS username, IFNULL(u.phone, '暂无联系方式') AS phone FROM orders o LEFT JOIN users u ON o.user_id = u.id;
这样即使u.username为NULL,最终结果也会显示“未知用户”,避免前端或报表中出现空白或报错。
配合聚合函数或计算字段使用
当联表后需对可能为NULL的数值字段做运算时,直接参与计算会导致整个表达式为NULL。用IFNULL提前兜底更安全:
-
IFNULL(t.amount, 0) * 1.08—— 税后金额,空值按0计税 -
IFNULL(p.discount_rate, 1.0)—— 折扣率缺失时视为不打折(即100%) - 避免写成
IFNULL(t.amount * 1.08, 0),因为NULL * 1.08仍是NULL,兜底时机太晚
与COALESCE的区别和选用建议
IFNULL()是MySQL特有函数,仅支持两个参数;而COALESCE(a,b,c,...)是SQL标准函数,支持多参数并返回第一个非NULL值。
- 若只需处理单个字段的空值,
IFNULL更轻量、可读性高 - 若要按优先级 fallback 多个字段(如取
mobile,没有则取phone,再没有取contact),用COALESCE(mobile, phone, contact, '未留联系方式') - 跨数据库迁移时,优先考虑
COALESCE以增强兼容性











