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

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值