176.第二高的薪水(简单)
题目:编写一个 SQL 查询,获取 Employee
表中第二高的薪水(Salary)
例如下述 Employee
表,SQL查询应该返回 200
作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
期望结果如下:
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
解法:选择出所有不重复的薪水,按照薪水降序排列后,选择第二条数据,即为第二高的薪水
select (select distinct Salary from Employee
order by Salary DESC
limit 1 offset 1) as SecondHighestSalary;
PS:limit n offset m 表示:从第m条开始,选取n条数据(从0开始排序,所以上面选第二条数据 是 offset 1)
177.第N高的薪水
题目:编写一个 SQL 查询,获取 Employee
表中第 n 高的薪水(Salary)
例如下述 Employee
表,n = 2 时,应返回第二高的薪水 200
。如果不存在第 n 高的薪水,那么查询应返回 null
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
期望结果如下:
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200 |
+------------------------+
解法:思路与上面第二高薪水相同,降序排列后,使用limit offset 选取第N高的薪水
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 1 offset m
);
END
PS:这一题涉及mysql的自定义函数(user-defined function UDF),可以先了解下再解题
创建自定义函数,简单来说就是:
create function 函数名(形参列表) returns 返回类型 -- 注意是retruns
begin
函数体 —— 函数内定义的变量,如上面的 set m = N-1;
返回值 ——return部分
end