今天我们继续聊聊NULL——数据库里那个“隐形英雄”。如果你还觉得NULL就是“啥都没有”,你说得没错,但其实还不止这样。这节课我们要学会怎么检查数据里有没有NULL,还有遇到这种情况该咋办。 准备好一起追踪缺失的值了吗?
先来个简单的例子——假设你在搞一个网店的数据库。有个订单表,有些订单没写评论,有些则写了备注。如果你想查找所有备注是空的订单,但用普通的=、<>去比对,你会发现结果很奇怪……为啥?因为NULL是个特殊情况!
在SQL里,检查有没有NULL要用IS NULL和IS NOT NULL。这俩操作符能帮你搞定NULL,拿到你想要的数据。
用IS NULL检查值
IS NULL用来判断某一列或者表达式是不是NULL。
SELECT *
FROM orders
WHERE comment IS NULL;
这个查询会返回所有comment列是NULL的行。很适合找那些没有备注的订单。
下面是orders表的例子:
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "加急送达" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
查询:
SELECT id, customer_name
FROM orders
WHERE comment IS NULL;
结果:
| id | customer_name |
|---|---|
| 2 | Maria Chi |
| 4 | Anna Song |
注意,空字符串''的那一行不会被查出来,因为''不是NULL。
用IS NOT NULL检查值
IS NOT NULL正好相反,它查的是不是NULL。比如你想找所有有备注的订单:
SELECT *
FROM orders
WHERE comment IS NOT NULL;
这个查询只会返回comment有内容的行(包括空字符串'')。
例子
orders表还是上面那个。
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "加急送达" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
执行查询:
SELECT id, customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
结果:
| id | customer_name | comment |
|---|---|---|
| 1 | Otto Art | "加急送达" |
| 3 | Alex Lin | '' |
注意,空字符串''的那一行也被查出来了。SQL觉得这不是“空”。
啥时候用IS NULL和IS NOT NULL?
举几个场景:
- 数据过滤:你想排除那些缺失值的记录。
- 错误处理:有时候
NULL说明数据录入有问题,你得把这些行挑出来。 - 数据分析:统计缺失值的数量能帮你了解数据质量。
实战应用
来点实际操作:
任务1:选出没有填写出生日期的学生
假设你有个students表:
| id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-05-10 |
| 2 | Maria Chi | NULL |
| 3 | Alex Lin | 1998-12-30 |
| 4 | Anna Song | NULL |
查询:
SELECT name
FROM students
WHERE birth_date IS NULL;
结果:
| name |
|---|
| Maria Chi |
| Anna Song |
这个查询很适合找那些还没填出生日期的学生。
任务2:选出有备注的订单
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "加急送达" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
对于orders表,我们可以查出有备注的订单:
SELECT customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
结果:
| customer_name | comment |
|---|---|
| Otto Art | "加急送达" |
| Alex Lin | '' |
和普通操作符的对比
现在我们来试试“错误”的写法,看看直接用操作符查NULL会咋样:
SELECT *
FROM orders
WHERE comment = NULL;
是不是很意外?这个查询啥都查不出来,就算comment明明是NULL。因为NULL不能用普通操作符比对。遇到这种情况,必须用IS NULL才行。
GO TO FULL VERSION