背景
leetcode刷了一些sql题,觉得一些有意思的来总结下
mysql之第n高的薪水
编写一个 SQL 查询,获取并返回 Employee 表中第n高的薪水 。如果不存在第n高的薪水,查询应该返回 null 。分析这里的第n高有两个解释,第一种会固定,比如说,第一高,第二高。第二种说法不固定的,需要根据前端传的值来动态的表达。
方法一
SELECT IFNULL
((SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT n , 1), NULL)
AS HighestSalary;
这里的n可以是具体的值,也可以是个不固定的值
- 第1高
SELECT IFNULL((SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 0 , 1), NULL) AS HighestSalary;
- 第2高
SELECT IFNULL((SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 , 1), NULL) AS HighestSalary;
- 第3高
SELECT IFNULL((SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 2 , 1), NULL) AS HighestSalary;
方法二
使用存储过程
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
declare m int;
set m = N - 1;
RETURN (
# Write your MySQL query statement below.
select ifnull((select salary from Employee group by salary order by salary desc limit m , 1),null)
);
END
这里可定义一个存储过程来完成,具体的传入数字几,就取第几高的薪水,但这个方法实际上有局限性,作为一个开发而言,有些情况下,你是没有权限做这样的事,目标库也不允许你这样做,所以这种方式适合在操作己方的数据库。
适用
如果是我一般会选择第一种方式,加入说dao层用的是mybatis,那么sql应该类似这样写
不固定的
SELECT IFNULL((SELECT DISTINCT Salary FROM Employee
ORDER BY Salary DESC LIMIT ${n} , 1), NULL)
AS HighestSalary;
固定的 加入说 第三高
SELECT IFNULL((SELECT DISTINCT Salary FROM Employee
ORDER BY Salary DESC LIMIT 2 , 1), NULL)
AS HighestSalary;
5308

被折叠的 条评论
为什么被折叠?



