假设有如下所示的员工薪水表:
找出表中最高的薪水非常简单,编写下面的SQL即可:
SELECT max(Salary) as HighestSalary
FROM Employee;
利用查询的嵌套,也可以较为容易地找出表中第二高的薪水:
SELECT max(Salary)
FROM Employee WHERE Salary < (SELECT max(Salary) FROM Employee);
不过,要是我们想找出第三高、第四高的薪水呢?有的人可能会说按照上面的思路,在SQL语句的外层再嵌套查询,不过这样写起来很麻烦,并且嵌套太多的子查询会影响性能。采用下面的SQL语句是个更好的选择:
SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT 1,1;
其中LIMIT 1,1
也可以写成LIMIT 1 OFFSET 1
,事实上后面的写法更好。LIMIT N OFFSET M
代表从第M+1行开始取N行。要求第三高、第四高、第N高的薪水,只需要将末尾改成LIMIT 1 OFFSET N-1
即可。
针对第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
注意,求第N高的薪水实际上是把表排序后偏移N-1行,因此需要先把N的值减1存在M中。
转载:https://blog.csdn.net/hxy1996520/article/details/106073824
查看评论