题目
Employee
表:
编写一个 SQL 查询,获取并返回 Employee
表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null
。
查询结果如下例所示。
示例 1:
示例 2:
解题思路
前置知识
本题中我们用到了case函数,下面我们先来学习一下,sql语句中case when及select case when的用法
Case函数
case sex when '1' then '男' when '2' then '女' else '其他' end
Case搜索函数
case when sex = '1' then '男' when sex = '2' then '女' else '其他' end
这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
比如说,下面这段sql,你永远无法得到“第二类”这个结果
case when col_1 in ( 'a', 'b') then '第一类' when col_1 in ('a') then '第二类' else'其他' end
limit
limit子句可以被用于强制lSELECT语句返回指定的记录数。limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是0(而不是1):
结构
limit函数结构为:limit m , n,表示从第m+1条数据取出n条数据。
例子
查找入职员工时间排名倒数第三的员工所有信息select * from `user` where date = (select distinct date from `user` order by date desc limit 2,1);
将入职时间降序排列,从第三个位置(即2+1处)取一条数据,也就是第三条数据本身,就是我们想要的入职时间为倒数第三的这条数据,需要注意将时间去重,按时间分组,相同时间会分为一组。
有了以上的知识我们如何解决本道问题呢?
1.题目要求我们查询第二高的薪水,但是薪水会存在相同的情况,所以我们应该先给薪水字段去重(distinct salary)
2.之后我们判断去重后的薪水的值的个数是否还大于等于二(count(distinct salary)>=2)
3.如果去重后的薪水的值的个数大于等于二,我们就分组并排序然后limit取第二个((select salary from employee group by salary order by salary desc limit 1,1))
4.若小于则返回null(else null end)
5.并为查询到的新表重新命名为(SecondHighestSalary)
代码实现
select case when
count(distinct salary)>=2 then (select salary from employee
group by salary
order by salary desc limit 1,1)
else null end
as SecondHighestSalary from employee