一、题目描述
表: Employee
+--------------+---------+
| 列名 | 类型 |
+--------------+---------+
| id | int |
| name | varchar |
| salary | int |
| departmentId | int |
+--------------+---------+
id是此表的主键列。
departmentId是Department表中ID的外键。
此表的每一行都表示员工的ID、姓名和工资。它还包含他们所在部门的ID。
表: Department
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| id | int |
| name | varchar |
+-------------+---------+
id是此表的主键列。
此表的每一行都表示一个部门的ID及其名称。
编写SQL查询以查找每个部门中薪资最高的员工。
按 任意顺序 返回结果表。
查询结果格式如下例所示。
示例 1
输入:
Employee 表:
+----+-------+--------+--------------+
| id | name | salary | departmentId |
+----+-------+--------+--------------+
| 1 | Joe | 70000 | 1 |
| 2 | Jim | 90000 | 1 |
| 3 | Henry | 80000 | 2 |
| 4 | Sam | 60000 | 2 |
| 5 | Max | 90000 | 1 |
+----+-------+--------+--------------+
Department 表:
+----+-------+
| id | name |
+----+-------+
| 1 | IT |
| 2 | Sales |
+----+-------+
输出:
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
| IT | Max | 90000 |
+------------+----------+--------+
解释:Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。
二、代码
代码如下:
SELECT Department.name AS 'Department', Employee.name AS 'Employee', Employee.salary AS 'Salary'
FROM Employee
JOIN Department ON Employee.departmentId = Department.id
WHERE (Employee.salary , Employee.departmentId) IN (
SELECT MAX(salary) , departmentId
FROM Employee
GROUP BY departmentId
)
三、解题思路
本题的难点在于引入了2张表且这2张表中有元素是互相关联的,我们需要同时使用2张表里面的信息,这里就需要用到JOIN ... ON ...
方法了,将2张表中的相同内容进行联动,这样就能在读取表1时通过表1的内容找到表2中对应的值。
另外,需要注意的是,这里面需要找出每种类别的最大值,如果单纯使用MAX函数的话,则是判断的是全局的数据,这里需要使用分组方法GROUP BY ...
,将表中数据按照部门类别进行分组,之后再在每一组中寻找当前组的最大值进行返回。