问题描述
在刷LeetCode
数据库练习题176.第二高的薪水和619.只出现一次的最大数字时,遇到了这样的问题:若数据为空,则返回NULL
。
作为一个SQL菜鸟,想不出要怎么判断数据是否为空并返回NULL,后面在CSDN搜索到了相关文章,并通过LeetCode大佬的题解,彻底明白了空数据与NULL的转换
,并在此写下博客,方便日后查阅。
参考文章:CSDN文章链接、LeetCode题解链接
测试
1. 测试数据
使用大佬的测试数据,但是测试条件稍微修改下,简洁点,方便理解
CREATE TABLE IF NOT EXISTS my_numbers (num INT);
TRUNCATE TABLE my_numbers
INSERT INTO my_numbers (num) VALUES ('8');
INSERT INTO my_numbers (num) VALUES ('8');
INSERT INTO my_numbers (num) VALUES ('3');
INSERT INTO my_numbers (num) VALUES ('3');
INSERT INTO my_numbers (num) VALUES ('4');
INSERT INTO my_numbers (num) VALUES ('4');
INSERT INTO my_numbers (num) VALUES ('5');
INSERT INTO my_numbers (num) VALUES ('5');
2. 空表SQL
根据测试数据,构造一条基础SQL,该SQL查询出来的表为空(不是NULL)
SELECT num FROM my_numbers WHERE num > 10;
3. 一轮查询-聚合函数
不使用聚合函数查询
SELECT num FROM my_numbers WHERE num > 10;
使用聚合函数查询
SELECT
SUM(num) sum_num,
AVG(num) avg_num,
MAX(num) max_num,
MIN(num) min_num
FROM my_numbers
WHERE num > 10;
由此可知,聚合函数是可以将空数据转换为NULL的。
4. 二轮查询-IFNULL()
使用IFNULL()查询
SELECT
IFNULL((SELECT num FROM my_numbers WHERE num > 10), NULL)
AS num;
不使用IFNULL()查询
SELECT
(SELECT num FROM my_numbers WHERE num > 10)
AS num;
由此可知,虽然空数据转换为NULL,但并不是IFNULL()的作用
5. 三轮查询-SELECT与FROM
将空表放在SELECT后
SELECT(
SELECT num FROM my_numbers WHERE num > 10
) num;
将空表放在FROM后
SELECT tmp.num
FROM (SELECT num FROM my_numbers WHERE num > 10) tmp;
由此可知
- SELECT 空表:会将空值转换为NULL
- FROM 空表:不会将空值转换为NULL
总结
- 空表格:表格没有任何数据,没有任何输出
- 表格值为null:表格有数据,只是为NULL
空数据转NULL值总结:
- 使用聚合函数,SUM/AVG/MAX/MIN
- 使用SELECT语句,但空值需要写在SELECT中而不是FROM中
- LIMIT语句无法出现新的NULL值(本文没做测试,可以阅读大佬文章,不过这很好理解,LIMIT是对结果集进行截取,并不会出现新的NULL值)
- WHERE和HAVING无法出现新的NULL值(通过空表SQL可知WHERE不会出现新的NULL值,HAVING同理)