在 sql 中不能用 = NULL 判断空值,因为 null 表示未知,不等于任何值,包括自身;1. 正确判断空值应使用 is null,如 select * from users where email is null;2. 常见场景包括 left join 后查找无匹配记录,如 where o.user_id is null;3. 可与 coalesce 配合替换 null 值,如显示“无邮箱”;4. 注意 is not null 用于判断非空,字段默认值为空字符串时需用 = ” 判断,部分数据库处理 null 和空字符串不同,需注意区分;5. is null 查询可能效率较低,尤其大表,可考虑索引优化。
在 SQL 查询中,判断某个字段是否为空值时,不能直接使用等于号(=)来判断 NULL。因为 NULL 表示的是“未知”或“不存在”的值,它不等于任何值,包括它自己。所以要用 IS NULL 来准确判断空值。
为什么不能用 = NULL?
很多人刚开始写 SQL 的时候会误以为可以这样写:
SELECT * FROM users WHERE email = NULL;
但这样是查不出任何结果的。
SQL 中规定,NULL 和任何值做比较都会返回 UNKNOWN,而不是 TRUE 或 FALSE。因此,正确的写法必须是:
SELECT * FROM users WHERE email IS NULL;
这样才能正确筛选出 email 字段为空的数据。
常见使用场景
IS NULL 在实际开发中非常常见,特别是在处理外键、左连接(LEFT JOIN)等查询时,经常会用来查找没有匹配数据的记录。
比如你有两个表:用户表 users 和订单表 orders,你想找出那些没有下过订单的用户:
SELECT u.name FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE o.user_id IS NULL;
这条语句的意思就是:“找出那些在订单表中没有对应记录的用户”。
与 COALESCE 配合使用的小技巧
有时候你可能希望把 NULL 值替换成一个默认值,这时候可以用 COALESCE 函数结合 IS NULL 判断一起使用。
例如:
SELECT name, COALESCE(email, '无邮箱') AS email FROM users WHERE email IS NULL;
上面这段 SQL 的作用是:
- 把 email 为 NULL 的显示成“无邮箱”
- 同时只显示这些空值的记录
这在生成报表或者展示层处理时非常实用。
注意点和小建议
- IS NOT NULL 是 IS NULL 的反向判断,用于筛选非空值。
- 如果字段设置了默认值(如 default ”),那它就不是 NULL,而是空字符串,此时需要用 WHERE field = ” 来判断。
- 某些数据库系统对 NULL 和空字符串的处理不同,要注意区分。
- 在索引优化方面,IS NULL 查询有时效率较低,尤其是大表,可以考虑配合索引或调整设计。
基本上就这些。IS NULL 看起来简单,但在实际查询中非常关键,用错了就会漏掉数据或者查不出想要的结果。只要记住一点:永远不要用 = NULL,而要用 IS NULL,就能避免很多坑。