一个初中级实习程序员面试的必经之路———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 ;

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

你可能感兴趣的:(mysql)