最常用的是coalesce和ifnull:coalesce是sql标准函数,支持多参数并返回首个非null值;ifnull是mysql特有,仅支持两参数、效率略高但扩展性差。

COALESCE 和 IFNULL 怎么选
处理 NULL 最常用的是 COALESCE 和 IFNULL,但它们行为不同:前者是 SQL 标准函数,支持多个参数,返回第一个非 NULL 值;后者是 MySQL 特有,只接受两个参数,效率略高但扩展性差。
实际写法差异明显:
SELECT COALESCE(col1, col2, 'default') FROM t;
SELECT IFNULL(col1, 'default') FROM t;
- 如果可能有多个备选字段(比如优先用
email_work,没有再试email_personal,最后兜底),必须用COALESCE - 若只是简单兜底(
price为空就设为 0),IFNULL更直观,且在老版本 MySQL(如 5.6)中兼容性更稳 -
COALESCE所有参数会强制转为最高优先级的数据类型,比如COALESCE(1, 'abc')返回字符串'1',容易引发隐式转换 bug
聚合函数遇到 NULL 会自动忽略吗
是的,SUM、AVG、COUNT(不带 *)等聚合函数默认跳过 NULL,但这个“自动”常被误用。
-
COUNT(col)统计非NULL行数,而COUNT(*)统计所有行 —— 如果你本意是“记录总数”,却写了COUNT(status),那status为NULL的行就被漏掉了 -
AVG(col)对全NULL列返回NULL,不是 0,下游应用若没判空,可能触发空指针或类型错误 - 想把
NULL当 0 参与计算?得先用IFNULL(col, 0)包一层,不能依赖聚合函数“自动处理”
WHERE 条件里写 col = NULL 为什么查不到数据
这是新手高频翻车点:= NULL 永远返回 UNKNOWN,不是 TRUE 或 FALSE,所以 WHERE 不会匹配任何行。
- 正确写法只有
col IS NULL或col IS NOT NULL - 别用
!= NULL或NULL—— 同样无效,SQL 标准规定所有与NULL的比较都为未知 - 如果逻辑复杂(比如 “状态为 active 或者 status 字段为空”,即
status = 'active' OR status IS NULL),注意OR会让索引失效,必要时拆成UNION或加函数索引
自定义函数里怎么安全返回 NULL
MySQL 存储函数(CREATE FUNCTION)中,若参数为 NULL,函数默认也返回 NULL —— 除非显式声明 DETERMINISTIC 并手动处理,但这不是重点;关键是函数体内部如何应对输入 NULL。
- 不要假设入参非空,尤其来自用户输入或关联表字段时。开头加判断:
IF param IS NULL THEN RETURN NULL; END IF; - 避免在函数里拼接字符串时直接用
CONCAT(a, b):任一参数为NULL,结果就是NULL。改用CONCAT_WS('', a, b)或先IFNULL(a, '') - 函数返回类型要和实际一致。比如声明
RETURNS INT,但内部有RETURN NULL是合法的;但如果声明RETURNS INT NOT NULL,则函数内不能返回NULL,否则调用时报错
健壮性不在堆砌防御逻辑,而在每处与外部数据交汇的地方,明确回答:“这里会不会来 NULL?来了我认不认?认了怎么转?不认了怎么拦?” —— 尤其是 JOIN 后的字段、子查询结果、JSON_EXTRACT 返回值,这些地方的 NULL 最隐蔽也最致命。










