GROUP BY 分組中的坑
1.分組后select后的字段只能有以下兩種:
- 出現在group by 后面的字段
- 使用聚合函數的列
2.group by 默認取非聚合的第一條記錄
例題:牛客網數據庫實戰之獲取所有部門中當前員工薪水最高的相關信息
表:dept_emp
表:salaries
錯誤的解題方法:
1 select e.dept_no,e.emp_no,max(salary) as maxSalary 2 from dept_emp e 3 inner join salaries s on e.emp_no = s.emp_no 4 group by dept_no 5 order by dept_no
其中e.emp_no既不是group by后面的字段,也不是使用聚合函數的列,emp_no是非聚合字段,不能出現在SELECT。因為一個聚合字段(dept_no)對應多個非聚合字段(emp_no),所以選擇的時候,會默認選擇非聚合字段中的第一個,於是出錯。
顯示錯誤的結果:
因為group by默認取非聚合的第一條記錄,部門d004有兩個員工,分別是1003,1004,由於select后面跟的emp_no既不是group by后面的字段,也不是使用聚合函數的列,因此默認選取了1003,而不是真實的數據1004!!!
正確的解題方法:
SELECT de.`dept_no`,de.`emp_no`,s.`salary` FROM dept_emp de JOIN salaries s ON de.`emp_no` = s.`emp_no` AND de.`to_date` = '9999-01-01' AND s.`to_date` = '9999-01-01' WHERE s.`salary`=( SELECT MAX(salary) FROM dept_emp de2 JOIN salaries s2 ON de2.`emp_no` = s2.`emp_no` AND de2.`to_date` = '9999-01-01' AND s2.`to_date` = '9999-01-01' WHERE de.`dept_no` =de2.`dept_no` GROUP BY de2.`dept_no` ) ORDER BY dept_no
注意: 關於為什么一定要兩個表格的時間都限制成規定時間(9999-01-01)
因為薪水表是按年發的,而題目要查找的當前的薪水,所以要過濾掉以前的階段。即一個領導從入職到現在階段不同,薪水不同,所以to_date為最新,表示最新的薪水