Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
+----+-------+--------+--------------+
| Id | Name | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1 | Joe | 70000 | 1 |
| 2 | Henry | 80000 | 2 |
| 3 | Sam | 60000 | 2 |
| 4 | Max | 90000 | 1 |
+----+-------+--------+--------------+
Department 表包含公司所有部门的信息。
+----+----------+
| Id | Name |
+----+----------+
| 1 | IT |
| 2 | Sales |
+----+----------+
编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| Sales | Henry | 80000 |
+------------+----------+--------+
Solution 1 :
SELECT
b. NAME AS department,
a. NAME AS employee,
a.salary
FROM
employee a
JOIN department b ON a.departmentId = b.id
WHERE
(a.salary, a.departmentId) IN (
SELECT
max(salary),
departmentId
FROM
employee
GROUP BY
departmentId
)
该解法,通过分组后,max(salary) 获取最大salary, 最后 通过 salary,departmentId 确定 部门里工资最高的员工。
**Solution 2 **
SELECT
b.`name` AS department,
a.`name` AS Employee,
a.salary
FROM
(
SELECT
NAME,
salary,
departmentId
FROM
employee
ORDER BY
salary DESC
) a
LEFT JOIN department b ON a.departmentId = b.id
GROUP BY
departmentId;
该解法
- order by salary desc 作排序,作为临时表
- 巧妙的利用group by 分组 获取该分组 工资最高的员工
思考:
如果IT 部门,最高工资90000,有两名同事,这两种解法 如何呢?有什么差异