图解sql面试题:查找TOPN的数据

力扣SQL 第176题

题目:求第二高的薪水

employee表

idsalary
1100
2200
3300
4300

分析结果:查询结果应该最后返回的是200作为第二高的薪水。如果不存在则为null

【解题思路】
1:考虑到成绩可能有重复的值,所以我们第一就是使用distinct去重
2:
思路一、可以先求出最大的值,然后再找出小于这个最大值的列即为第二高的薪水;
如下:

select max(distinct salary)  from emplyee;
select max(distinct salary)  from emplyee where salary < (select max(distinct salary)  from emplyee);

思路二、使用limit和offset

limit n表示查询结果返回前N条数据;
offset n表示跳过n条数据; limit y offset x
分句表示查询结果跳过 x 条数据,读取前 y 条数据

如下:则表示跳过1条数据,获取前1条数据,就是第二条数据;

select  distinct salary from emplyee order by salary desc limit 1 OFFSET 1;

走到这里,其实大体结果就出来了,那我们就需要考虑最后一步,没有第二高的薪水的时候为空;

3、没有的话为空;

ifnull(a,b)函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL
则返回第一个参数的值。

那最后的sql语句就是:看自己喜欢用那种方式了

select IFNULL((select  distinct salary from emplyee order by salary desc limit 1 OFFSET 1),null) as '第二高的薪水';
select IFNULL((select max(distinct salary)  from emplyee where salary < (select max(distinct salary)  from emplyee)),null) as '第二高的薪水';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值