假設有如下所示的員工薪水錶:
找出表中最高的薪水非常簡單,編寫下面的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中。