作者:whisper
链接:http://proprogrammar.com:443/article/632
声明:请尊重原作者的劳动,如需转载请注明出处
前面我们讲了部门前N高薪水的问题,现在再来讲讲第N高薪水的问题,主要是使用limit offset size
编写一个 SQL 查询,获取
Employee
表中第二高的薪水(Salary) 。+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
例如上述
Employee
表,SQL查询应该返回200
作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回null
。+---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+
select MAX(Salary) SecondHighestSalary
from Employee
where Salary < (select MAX(Salary) from Employee);
没有group by也可以用聚集函数,当select返回一行中的一个字段(数据)时,可以直接与另一个字段(数据)比较,对结果取别名
再看另一种比较快的解法
select ifNull((select distinct Salary from Employee order by Salary desc limit 1,1),null) as SecondHighestSalary;
当没有结果行时,用ifNull转为null,否则结果是空的(不是null),还有limit offset size的用法
编写一个 SQL 查询,获取
Employee
表中第 n 高的薪水(Salary)。+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
例如上述
Employee
表,n = 2 时,应返回第二高的薪水200
。如果不存在第 n 高的薪水,那么查询应返回null
。+------------------------+ | getNthHighestSalary(2) | +------------------------+ | 200 | +------------------------+
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
Begin
Declare M INT;
Set M=N-1;
Return (
Select distinct Salary from Employee order by Salary desc limit M,1
);
END
函数的定义,包括声明变量与设置变量值
再看一个优化的写法
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set n = n-1;
RETURN (
# Write your MySQL query statement below.
select distinct Salary from Employee order by Salary desc limit n,1
);
END
去掉了自定义的变量,也可以看出变量名不区分大小写
亲爱的读者:有时间可以点赞评论一下
全部评论