在SQL数据库的实际使用中,我们经常会遇到某些字段没有存储有效数据的情况,这类值被称为空值。要准确筛选出这些字段为空的记录,需要掌握IS NULL的正确用法,避免常见的查询误区。

为什么不能用等于号判断空值
SQL中的空值表示字段没有值,它不等于0,也不等于空字符串,更不是任何具体的数据。普通比较运算符比如等于号=是用来判断两个具体值是否相等的,空值无法和任何值进行比较,所以使用字段名 = NULL的写法永远不会返回匹配的结果。
我们可以通过下面的简单示例验证这个特性,先创建一张测试表并插入包含空值的测试数据:
-- 创建测试用户表
CREATE TABLE test_user (
id INT PRIMARY KEY,
user_name VARCHAR(50),
email VARCHAR(100)
);
-- 插入测试数据,其中第二条记录的email字段为空
INSERT INTO test_user (id, user_name, email) VALUES (1, '张三', 'zhangsan@ipipp.com');
INSERT INTO test_user (id, user_name, email) VALUES (2, '李四', NULL);
INSERT INTO test_user (id, user_name, email) VALUES (3, '王五', 'wangwu@ipipp.com');
如果执行SELECT * FROM test_user WHERE email = NULL;,查询结果会返回空集,因为等于号无法判断空值。
IS NULL的基本语法
要判断字段是否为空,正确的语法是使用IS NULL,语法格式如下:
SELECT 列名1, 列名2, ... FROM 表名 WHERE 字段名 IS NULL;
如果要查询字段不为空的记录,则使用IS NOT NULL,语法格式如下:
SELECT 列名1, 列名2, ... FROM 表名 WHERE 字段名 IS NOT NULL;
实际查询示例
查询单字段为空的记录
我们基于上面的test_user表,查询所有邮箱为空的用户的id和用户名:
SELECT id, user_name FROM test_user WHERE email IS NULL;
执行上述语句后,会返回id为2、用户名为李四的记录,符合我们的预期。
查询多条件包含空值判断的记录
如果需要同时筛选多个条件,比如查询用户名为李四且邮箱为空的记录,可以这样写:
SELECT * FROM test_user WHERE user_name = '李四' AND email IS NULL;
结合其他运算符使用
IS NULL也可以和OR、IN等运算符结合使用,比如查询邮箱为空或者邮箱是特定地址的用户:
SELECT * FROM test_user WHERE email IS NULL OR email = 'zhangsan@ipipp.com';
使用IS NULL的注意事项
- 不要混淆
NULL和空字符串'',空字符串是一个具体的值,判断空字符串需要用字段名 = '',判断空值才用IS NULL。 - 不同数据库对空值的处理可能有细微差异,但IS NULL的语法是SQL标准语法,在主流的关系型数据库比如MySQL、PostgreSQL、SQL Server中都可以正常使用。
- 如果需要对空值进行替换展示,可以结合
COALESCE函数使用,比如SELECT id, user_name, COALESCE(email, '未填写') AS email FROM test_user;,这样空值的邮箱字段会显示为未填写。
常见误区总结
| 错误写法 | 正确写法 | 说明 |
|---|---|---|
| WHERE email = NULL | WHERE email IS NULL | 等于号无法判断空值 |
| WHERE email != NULL | WHERE email IS NOT NULL | 不等于号也无法判断空值 |
| WHERE email IS '未填写' | WHERE email IS NULL | IS后面只能跟NULL或者NOT NULL |