mysql语句更新员工薪水_Mysql多表查询,获取部门最高工资的sql语句方案

建表的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', 'Henry', '80000', '2');

insert into Employee (Id, Name, Salary, DepartmentId) values ('3', 'Sam', '60000', '2');

insert into Employee (Id, Name, Salary, DepartmentId) values ('4', 'Max', '90000', '1');

insert into Department (Id, Name) values ('1', 'IT');

insert into Department (Id, Name) values ('2', 'Sales');

分享一下group by在以下的多表查询中不可用,先给出错误的SQL语句,后面再给出正确语句和分析.

员工表employee,包括Id,Name,Salary,和DepartmentID,DepartmentID与部门id对应

fbd5d94e90b6977fa942939264539c12.png

部门表Department

f7c899597f199aef4e8c4057f1216a2c.png

需求 : 编写SQL语句查询每个部门中薪资最高的员工。每个部门只显示最高的工资的员工信息

309bb2f65f8e6b351ff6c038072c6565.png错误的思路参考:

1、求各个部门最高工资

select max(salary) from employee group by DepartmentId

9a49ae62f4fd6b3a4263267a041881e5.png

2、将最高工资表作虚拟表,查询出工资与最高工资相同的员工

select Department.name Department, employee.name Employee ,salary from employee join department on employee.DepartmentId = department.id where salary in (select max(salary) from employee group by DepartmentId)

8305c5f9163809526abb675f95ec9c72.png

貌似得到了想要的结果,但是出现以下情况时,得到的结果就是错误的:

5d6c80fb8975bd6718a91f4f99604ad1.png

当我改动joe的工资为80000时,得到的结果出乎意料:

e9770412277928b711694916aedc23b9.png为什么会出现这种情况?

where salary in

(select max(salary)

from employee

group by DepartmentId)

这里筛选条件相当是salary in (80000,90000)

61728749e543ad6004541de8096fa605.png下面给出正确的方式

select d.name Department,e1.name Employee,e1.salary Salary from employee e1 left join employee e2 on e1.salary < e2.salary and e1.DepartmentId=e2.DepartmentId join Department d on e1.DepartmentId = d.id where e2.id is null

一段一段看

select

*

from

employee e1 left join employee e2

on e1.salary < e2.salary and e1.DepartmentId=e2.DepartmentId

2d94d3c7415c953dacf175a2a6016510.png自连接,连接的条件是e1工资比e2工资低,部门号相同,这是当同部门中e1中没有比自己工资高的,自动补null,也就是上图中的情况

此时连接部门表,再筛选出e2的id是null的行就是所要求的

6466d105052e98770192bf1741078227.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值