来源:力扣(LeetCode)
MyNumbers 表:
±------------±-----+
| Column Name | Type |
±------------±-----+
| num | int |
±------------±-----+
这张表没有主键。可能包含重复数字。
这张表的每一行都含有一个整数。
单一数字 是在 MyNumbers 表中只出现一次的数字。
请你编写一个 SQL 查询来报告最大的 单一数字 。如果不存在 单一数字 ,查询需报告 null 。
查询结果如下例所示。
示例 1:
输入:
MyNumbers 表:
±----+
| num |
±----+
| 8 |
| 8 |
| 3 |
| 3 |
| 1 |
| 4 |
| 5 |
| 6 |
±----+
输出:
±----+
| num |
±----+
| 6 |
±----+
解释:单一数字有 1、4、5 和 6 。
6 是最大的单一数字,返回 6 。
示例 2:
输入:
MyNumbers table:
±----+
| num |
±----+
| 8 |
| 8 |
| 7 |
| 7 |
| 3 |
| 3 |
| 3 |
±----+
输出:
±-----+
| num
±-----+
| null |
±-----+
解释:输入的表中不存在单一数字,所以返回 null 。
题解: 本篇题解的大总结
!空表示表格没有任何输出,null表示输出为null !
此题的坑在于返回 的null 用聚合函数能巧妙的避开 没有返回值的情况
可以使用聚合函数进行空值null值的转换,具体的聚合函数包括SUM/AVG/MAX/MIN
可以使用select语句进行转换,但空值应直接写在select中而非from中
limit语句无法出现新的null值
where和having同样无法出现新的null值
select
max(t.num) as num
from
(
select num
from
MyNumbers
# group by 能自动去重复
group by
num
having
#拼接条件选出没有重复的
count(num)=1
)
#衍生表需要加别名 这个表名要加
t
此题也可以用ifnull来解决
select ifnull((select num from my_numbers
group by num
having count(*) = 1
# 此处就是找出最大的值
order by num desc limit 1)
# 如果是null 返回null
, null) num