SQL查询全体员工第二高薪资时遇空结果问题求助
排查查询全体员工第二高薪资返回空的SQL问题
原SQL的核心问题分析
- 逻辑完全偏离需求:你要查询的是全体员工薪资中的第二高值,但原SQL的逻辑是试图筛选每个
employee_id分组下的非最大id记录,再重新分组,这和目标完全不匹配。 - 子查询存在语法逻辑错误:
- 子查询
select id from employess group by employee_id order by id desc中,group by employee_id后直接选取id,在MySQL默认模式下会返回每组任意一条id,并非你预期的每组最大id;若开启ONLY_FULL_GROUP_BY严格模式,该语句直接报错,因为id既不在分组字段中,也没有使用聚合函数。 order by id desc在这个子查询中毫无作用,group by的结果排序不会改变分组后选取的行,除非搭配limit,但显然这不是你的意图。
- 子查询
- 外层分组冗余且违规:外层
GROUP BY employee_id会合并同一员工的记录,进一步偏离需求;同时SELECT中包含id、name这类非聚合、非分组字段,要么返回不确定值,要么触发语法错误。
正确的查询写法
要实现“全体员工第二高薪资”的需求,推荐两种常用写法:
写法1:去重后偏移取值(支持返回null)
适用于需要排除重复薪资,且在无第二高薪资时返回null的场景:
SELECT ( SELECT DISTINCT salary FROM employess ORDER BY salary DESC LIMIT 1 OFFSET 1 ) AS second_highest_salary;
如果不需要返回null,直接用:
SELECT DISTINCT salary AS second_highest_salary FROM employess ORDER BY salary DESC LIMIT 1 OFFSET 1;
写法2:用聚合函数筛选
通过排除最高薪资后取最大值,自动处理重复薪资:
SELECT MAX(salary) AS second_highest_salary FROM employess WHERE salary < (SELECT MAX(salary) FROM employess);
内容的提问来源于stack exchange,提问作者Akhil
相关产品推荐
相关产品推荐

