一个初中级实习程序员面试的必经之路———mysql面试常见题(二)

难受,本以为熟悉了常见的sql语句后刷题没啥问题,今天力扣怒刷20题,还是不行。正确率还是达不到想要的水平。一个初级后端程序员还是要兼具初级数据库管理员的大旗,奋斗在一线数据库维护中。以后本篇长期更新在数据库刷题中做错的题,以及分析解决思路

习题一:

编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

题解:

我们正常的思路是在排除最大的里面找最大,即为第二大。

select max(Salary) as SecondHighestSalary
from Employee 
where Salary<(select max(Salary)from Employee);

但是我们举一反三的想一想,如果我们要查的是第三或者第四大的时候怎么办,我们按上面的嵌套的方法就明显的不适用了;

所以我们要换一种思路,用上排序和分页。

高,DESC 排序
LIMIT 位移偏移量加以限制
 如果没有值,则返回 null,可以通过临时表或者IFNULL

select ifnull(
(
select Salary from Employee
order by Salary desc
limit 1,1
),null
) as SecondHighestSalary ;

以上方法,就很完美的解决了这个问题。如果有更好的思路,欢迎各位大佬指教,谢谢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值