查库的时候明知道有一批手机号是空的,写 phone = NULL 去查,结果一行都出不来。这是新手最常踩的坑:NULL 不等于任何值,连它自己都不相等,等号判断天然失效,得换专门的判空写法。

mysql isnull 的基本用法

ISNULL 函数只收一个参数,是 NULL 返回 1,不是返回 0,常拿来在查询结果里加一列标记:

SELECT name, ISNULL(phone) AS no_phone FROM users; SELECT * FROM orders WHERE pay_time IS NULL;

实际筛数据时,多数情况直接写 IS NULL 或 IS NOT NULL,语义更清楚,也更容易用上索引。ISNULL 更多出现在 SELECT 列表里做展示判断,比如报表里标记哪些字段缺了值。

要兜底值就用 IFNULL

IFNULL 收两个参数,第一个是 NULL 就返回第二个,否则原样返回第一个。统计和报表里给空值兜底基本都靠它:

SELECT IFNULL(nickname, name) AS show_name FROM users; SELECT IFNULL(score, 0) FROM exam;

类似的还有 COALESCE,能收多个参数,返回从左到右第一个非空的值,字段有多个候选来源时用它更顺。

别和 SQL Server 的 ISNULL 搞混

SQL Server 里 ISNULL(col, 0) 是标准的两参数兜底函数,很多人写顺手了。这套搬到 mysql 里会直接报参数个数不对的错误,两边同名函数行为不一样。手上要是同时维护两套库,兜底统一写成 IFNULL 或 COALESCE,迁移时能省不少事。

顺手记两个相关的细节:COUNT(字段) 不统计 NULL 行,COUNT(*) 全统计;升序排序时 mysql 一般把 NULL 排在最前面。排查报表数字对不上时,这几个点经常出问题。一句话记法:判断空不空用 IS NULL,把空换成默认值用 IFNULL,ISNULL 只负责返回 0 和 1。