最初代码:
select d.dept_no, d.emp_no, max(salary) as maxSalary from dept_emp as d left join salaries as s on d.emp_no = s.emp_no group by d.dept_no order by d.dept_no
预期输出:
d001|10001|88958
d002|10006|43311
d003|10005|94692
d004|10004|74057
d005|10007|88070
d006|10009|95409
实际输出:
d001|10001|88958
d002|10006|43311
d003|10005|94692
d004|10003|74057
d005|10007|88070
d006|10009|95409
部门d004的最大工资没有问题但是员工号出错

【错误点+ 知识点汇总】
1.聚合字段与非聚合字段的区别
在含有Group by子句的查询语句中,对select关键字后的列要么是参与分组的列,要么列包含在聚合函数中。
如:select a,b,avg(c),sum(d) from 表 group by a,b
!!!在该题中,d.emp_no不是聚合字段也不是聚合函数,因此在进行分组时只会随机选择一个d.emp_no,最终导致得到的结果dept_no和maxSalary是对的,但是员工号会出错。

2.where 和 having的区别:
where将对分组前的所有数据进行筛选。having将对分组后的组进行筛选选出部分组。

修正代码如下:
select t.dept_no, salaries.emp_no, t.maxSalary from (select d.dept_no, max(salary) as maxSalary from dept_emp as d left join salaries as s on d.emp_no = s.emp_no group by d.dept_no ) as t, salaries where salaries.salary = t.maxSalary order by t.dept_no
【但是该代码会将其他组工资与该组最高工资相同的员工放入该组的统计中】

最终版如下:
select t.dept_no, q.emp_no, t.maxSalary from (select d.dept_no, max(salary) as maxSalary from dept_emp as d left join salaries as s on d.emp_no = s.emp_no group by d.dept_no ) as t, (select s.emp_no, d.dept_no,s.salary from salaries as s left join dept_emp as d on d.emp_no = s.emp_no) as q where q.salary = t.maxSalary and q.dept_no = t.dept_no order by t.dept_no
【关键就是在where中要有两个条件保证,一个是工资为最大工资,同时员工部门也应该跟该部门相同】