SQL语句验证:查询平均薪资最高部门的编号及最低薪资
验证SQL语句的正确性:查询平均薪资最高部门的编号及最低薪资
这段SQL不正确,问题出在WHERE子句的子查询部分:
select max(avg(sal)) from emp group by deptno
错误原因
group by deptno会返回多行结果(每个部门对应一行,值为该部门的平均薪资),而max()聚合函数无法直接对分组后的多行结果进行计算,数据库会报错(比如Oracle提示“不是单组分组函数”,MySQL会因子查询返回多行无法匹配=运算符报错)。必须先把所有部门的平均薪资作为临时数据集,再从中取最大值。
修正后的SQL
select min_sal, deptno, round(avg_sal) from (select avg(sal) as avg_sal, min(sal) as min_sal, deptno from emp group by deptno) dept_sal where avg_sal = ( select max(avg_sal) from (select avg(sal) as avg_sal from emp group by deptno) temp_avg );
补充说明
- 给外层子查询
(select avg(sal)... group by deptno)添加别名dept_sal,这是多数数据库的语法要求(比如Oracle必须给派生表指定别名)。 - 内层临时表
temp_avg生成所有部门的平均薪资列表,再通过max()取最大值,这样就能精准匹配平均薪资最高的部门数据。
内容的提问来源于stack exchange,提问作者Aikul Tungyshbaeva
相关产品推荐
相关产品推荐

