力扣176(MySQL)-第二高的薪水(中等)
题目:
id 是这个表的主键。
表的每一行包含员工的工资信息。
编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null 。
查询结果如下例所示。
示例 1:
示例 2:
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/second-highest-salary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
方法一:
先将薪水降序排序,然后再使用limit限制输出条数。但由于有可能只有一条原始数据,无法输出第二高的数据。因此将查询的结果作为临时表来输出null。因为select null 返回的是null值。使用 distinct 去掉重复的薪水值。
1 select ( 2 select distinct salary 3 from Employee 4 order by salary desc 5 limit 1 offset 1 6 )as SecondHighestSalary;
注意:select后面不接from的原理?
这是mysql中的用法,把值输出的意思。select 后面加常量的时候可以不加from 和表名。
方法二:
将不同的薪资降序排序,然后使用limit获得第二高的薪资,如果表中的原始数据只有一条,则查询就会出现空的情况,需要使用IFNULL进行判断。
1 select IFNULL( 2 (select distinct salary 3 from Employee 4 order by salary desc 5 limit 1,1), null ) 6 as SecondHighestSalary
知识点:
1.limit的用法
①limit m,n:跳过第m条数据,输出n条数据。(limit 2,3跳过第2条数据,输出3条数据)
②limit m offset n:跳过第n条数据,输出m条数据。
2.IFNULL和NULLIF用法
①IFNULL(expression,value):如果第一个参数(expression)为空,则返回第二个参数的值,如果不为空返回第一个参数的值;
②NULLIF(expre1,expre2):如果第一个参数等于第二个参数,则 nullif 函数返回 null,否则返回第一个参数。
面试题:
小米:分别找出每个课程内的第二高的成绩,这种情况下应该怎么分组求出?
使用窗口函数:row_number() over(partition by 课程 order by 成绩)
①row_number() over语句用于为查询结果的每一行生成一个唯一的数字行号;
②partition by语句用于将查询结果按照指定的列进行分组,生成的行号只在每组内部有效;
③order by语句用于指定在每组内部对行号进行排序的列。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)