Bootstrap

【MySQL】如何查找第N高的数据?

例题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,则查询将返回第三高的薪水)。

;