如果找不到数据会返回empty set
而不是返回null
,只有查询的数据被指定为null
时才会返回null
1. null
表示未知
如果要判断一个字段是否为null,应该使用is null
关键字
SELECT * FROM TABLE WHERE USER_AGE = NULL ❌
SELECT * FROM TABLE WHERE USER_AGE IS NULL 🙆♂️
这是因为null
表示未知,一个未知的东西必然不知道是否和一个值相等
2. null
和not in
SELECT * FROM SOME_TABLE
WHERE 5 NOT IN (1, 2, 3, 4, NULL)
这里判断5是否在(1, 2, 3, 4, NULL)
中,在比较5和null的时候,因为并不知道5和null
这个未知值是否相等,所以整个in
语句会返回null
,也就是未知,再取反仍是未知,所以整个where语句会返回未知,查询不到数据
对于下面的语句
SELECT * FROM SOME_TABLE
WHERE 5 IN (1, 2, 3, 4, NULL)
由于同样的原因,where语句也会返回为止,查询不到语句
3. ifnull
函数
编写一个 SQL 查询,获取 Employee
表中第二高的薪水(Salary
)
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
如果不存在第二高的薪水,那么查询应返回 null
。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
关键点在于如果不存在第二高的薪水如何返回null
select distinct Salary from Employee order by Salary desc limit 1,1
直接使用上面的语句,如果原表中薪水值的数量少于2个,那么就会直接返回empty set
解决方法1:select
一个空表直接提示Empty set
,如果直接select
一个空结果集,会返回一行包含NULL
的结果
select (select distinct Salary from Employee order by Salary desc limit 1,1)as SecondHighestSalary
解决方法2:是使用ifnull
关键字,ifnull(a,b)
函数解释:
- 如果value1不是空,结果返回a
- 如果value1是空,结果返回b
对于本题的sql就是:
select ifNull( (select distinct salary from Employee order by Salary desc limit 1,1),null ) as SecondHighestSalary
核心思想依旧是select
一个空结果集返回null
,再在ifnull
中比较