SQL-每日一题【176.第二高的薪水】

题目

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

测试结果

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值