题目:部门工资最高的员工
Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
+----+-------+--------+--------------+
| 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 |
+----+----------+
编写一个 SQL 查询,找出每个部门工资最高的员工。对于上述表,您的 SQL 查询应返回以下行(行的顺序无关紧要)。
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
+------------+----------+--------+
解释:Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。
使用sql语句建表并插入数据
Create table If Not Exists Employee (Id int, Name varchar(255), Salary int, DepartmentId int);
Create table If Not Exists Department (Id int, Name varchar(255));insert into Employee (Id, Name, Salary, DepartmentId) values ('1', 'Joe', '70000', '1');
insert into Employee (Id, Name, Salary, DepartmentId) values ('2', 'Jim', '90000', '1');
insert into Employee (Id, Name, Salary, DepartmentId) values ('3', 'Henry', '80000', '2');
insert into Employee (Id, Name, Salary, DepartmentId) values ('4', 'Sam', '60000', '2');
insert into Employee (Id, Name, Salary, DepartmentId) values ('5', 'Max', '90000', '1');insert into Department (Id, Name) values ('1', 'IT');
insert into Department (Id, Name) values ('2', 'Sales');
1.先找出每个部门有哪些员工
select
d.name Department,e.name Employee,e.Salary
from
Employee e
right join
Department d
on
e.DepartmentId = d.Id;//select d.name Department,e.name Employee,e.Salary from Employee e right join Department d on e.DepartmentId = d.Id;
解释:这里使用外连接,以部门表为主表,因为有可能部门中对应的员工数为null。就这道题来说,也可以使用内连接。两张表连接的条件是
员工表的部门编号等于部门表的编号。
查询结果
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Joe | 70000 |
| IT | Jim | 90000 |
| IT | Max | 90000 |
| Sales | Henry | 80000 |
| Sales | Sam | 60000 |
+------------+----------+--------+
2.再找出每个部门的最高工资
select
max(Salary) sal,departmentid
from
employee
group by
departmentid;
解释:在员工表进行查找,以部门编号进行分组,使用分组函数max
查询结果:
+-------+--------------+
| sal | departmentid |
+-------+--------------+
| 90000 | 1 |
| 80000 | 2 |
+-------+--------------+
3.两次查询结果结合起来,使用子查询,通过where进行条件判断
select
d.name Department,e.name Employee,e.Salary
from
Employee e
right join
Department d
on
e.DepartmentId = d.Id
where (e.Salary,e.departmentid) in
(select
max(Salary) sal,departmentid
from
employee
group by
departmentid);
解释:这里使用in语句,需要联合两个字段一起查询,这也是这道题的难点
查询结果
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
| IT | Max | 90000 |
+------------+----------+--------+