GROUP BY如何显示非分组字段、非聚合操作
获取每个部门中当前员工薪水最高的相关信息
http://www.nowcoder.com/questionTerminal/4a052e3e1df5435880d4353eb18a91c6
可以通过的代码
SELECT d.dept_no, d.emp_no, MAX(s.salary) -- 其实不能写d.emp_no,它既不是分组字段,也不是聚合操作 FROM dept_emp AS d INNER JOIN salaries AS s ON d.emp_no=s.emp_no WHERE d.to_date="9999-01-01" GROUP BY d.dept_no
这道题涉及连接查询和分组,需要注意几点:
- 连接查询和分组是可以同时存在的,分组是对连接查询的结果进行分组的
- 基于1,SELECT查询的必须是每个组的结果
- 基于2,原则上查询的字段只能是GROUP BY字段或其他的聚合操作,但这种规范逐渐不被人遵守了,也就出现这种情况:
查询每个部门中薪水最高值,显示部门和薪水最高值,这没什么问题,但如果要找出薪水最高值对应的员工,按照规范,在SELECT中无法直接写员工的。但若不遵守规范也是可以的,直接在SELECT中写上其他字段(非分组字段、非聚合),其含义就是找出聚合结果对应的其他字段的值,这其实是省略了一个子查询。
这里引出一个问题,如果一个部门内,最高薪水对应多个员工怎么办?可能避免不了子查询:
SELECT t.dept_no, (SELECT d2.emp_no FROM dept_emp AS d2 INNER JOIN salaries AS s2 ON d2.emp_no=s2.emp_no WHERE t.dept_no=d2.dept_no AND s2.salary=t.max_salary LIMIT 1), -- LIMIT 1防止多个员工薪水=最高薪水 t.max_salary FROM (SELECT d.dept_no AS dept_no, MAX(s.salary) AS max_salary FROM dept_emp AS d INNER JOIN salaries AS s ON d.emp_no=s.emp_no WHERE d.to_date="9999-01-01" GROUP BY d.dept_no) AS t