难受,本以为熟悉了常见的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 ;
以上方法,就很完美的解决了这个问题。如果有更好的思路,欢迎各位大佬指教,谢谢。