例题1:第二高的薪水
例题
思路与解法
解法一:聚合函数max+标量子查询
所谓“第二高”就是去掉最大的数据,剩下的数据里最大的:
Select MAX(Salary) as SecondHighestSalary
from Employeee
where Salary != (select MAX(Salary) from Employee)
解法二:Order by+Limit+Ifnull
解法二:可以使用ORDER BY语句对薪水进行降序排序,并使用LIMIT子句来限制结果集的大小。其中,limit n子句表示查询结果返回前n条数据,offset n表示跳过x条语句,limit y offset x 分句表示查询结果跳过 x 条数据,读取前 y 条数据。使用limit和offset,降序排列再返回第二条记录可以得到第二大的值。Ifnull则表示,如果第一个参数为null的时候,就返回第二个参数的值。如果第一个参数不为null,就会返回第一个参数的值。
select ifNull(
(select distinct salary
from Employee
order by Salary Desc
limit 1,1),null
) as SecondHighestSalary;
但有一点需要注意:LIMIT子句中的两个参数在大多数SQL中是这样工作的——第一个参数是偏移量(从0开始),第二个参数是行数。因此,LIMIT 1, 1实际上跳过了第一行(即最高的薪水),然后返回接下来的1行(即第二高的薪水)。
拓展:查找第N高的数据
第三高的薪水:
SELECT IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 2, 1), -- 注意这里我们使用2作为偏移量,因为我们要找第三高的薪水
NULL
) AS ThirdHighestSalary;
查找第N高的薪水:
SELECT IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET (N-2)),
NULL
) AS NthHighestSalary
替换N为你想要查询的薪水的排名(例如,如果N=3,则查询将返回第三高的薪水)。