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

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

部门表Department

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

* 笔者看到需求第一时间想到分组先求各个部门工资,再查询员工*

1.求各个部门最高工资

select max(salary)
from employee
group by DepartmentId

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 employeegroup by DepartmentId)

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

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

为什么会出现这种情况?

where salary in (select max(salary)from employeegroup by DepartmentId)
  • 这里筛选条件相当是salary in (80000,90000)

下面给出正确的方式

selectd.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

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

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

本文例题来自leetcode,也是笔者在刷题时踩到的坑,下面给出建表的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');

求部门最高工资(Mysql多表查询)相关推荐

  1. Mysql多表查询,获取部门最高工资的sql语句方案

    PS:之前写过一篇文章,是另一种方法(关联子查询),感兴趣的可以去看一下:sql关于group by和max函数一起使用的坑(同理,求部门最高工资)_HD243608836的博客-CSDN博客 ~~~ ...

  2. mysql多表查询详解

    在mysql中把查询结果去除重复记录[distinct] 如:select distinct job from emp;// 去除员工表工作字段中的重复记录 需要注意的是distinct只能出现在所有 ...

  3. mysql多表查询详解_MySQL多表查询详解上

    时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由 ...

  4. MySQL多表查询全面解析实例【汇总】

    经常遇到mysql多表查询的问题,特整理关于MySQL多表查询全面解析实例分享记录.一步一步实战MySQL多表查询. 创建虚拟数据 -- [创建公司职员表] --DROP TABLE IF EXIST ...

  5. MySQL多表查询语句

    MySQL多表查询语句 1.内连接查询 1.隐式内连接:使用where条件消除无用数据例子: --查询所有员工信息和对应的部门信息SELECT * FROM emp,dept WHERE emp.de ...

  6. mysql分表 查询_mysql分表+查询

    mysql分表+查询 垂直分表: 其实没啥好讲,就是 主键+常用列 放在原表中,再讲 主键+一些不常用列 放在另外的表中. 这样一个数据页就可以存放更多数据. 但是缺点也明显,可能会增加join 或 ...

  7. java mysql 多表查询_解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看. Mysql多表查询: CREATE TABLE IF NOT EXISTS co ...

  8. mysql教程多表查询_解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看. Mysql多表查询: CREATE TABLE IF NOT EXISTS co ...

  9. 零基础带你学习MySQL—多表查询笛卡尔集(二十)

    零基础带你学习MySQL-多表查询笛卡尔集(二十) 一.多表查询 多表查询:就是指基于两个和两个以上的表的查询,在实际应用中,单个表并不能满足你的需求,我们经常需要在很多个表之间查询数据 二.笛卡尔集 ...

最新文章

  1. USACO-Section2.2 Preface Numbering
  2. 基于最简单的FFmpeg包封过程:视频和音频分配器启动(demuxer-simple)
  3. 使用artTemplate模板将json转换为html页面
  4. 数字计算机的分类依据,数字计算机模拟计算机分类依据
  5. java p2p实例_java文件p2p传输
  6. Vue使用Emoji表情
  7. VSTOhowtoreferene.Net3.5(VSTO如何引用.NET3.5的外接程序)
  8. python商业爬虫教程_python商业爬虫课程
  9. windowsXP消灭蓝屏的另类招式
  10. wps比对两列数据重复_“两个wps表格,怎么比对重复的数据?“两个表格对照核对...
  11. 【paper吐槽】【SelfSupervised Learning】Self-Supervised Image Restoration with Blurry and Noisy Pairs
  12. 用Java计算出租车的费用
  13. 荣誉系统排名是整个服务器,魔兽世界60年代的PVP荣誉系统、军阶对照表和各职业的徽记效果...
  14. android点击按钮发出声音
  15. Beyond Compare4过期使用方法
  16. 益和VA助力指纹认证仪构建异地考勤方案
  17. 苏宁杀入“菜场”,不断丰富智慧零售消费场景
  18. 内连接与外连接-及其典型案例
  19. Webpack优化总会让你不得不爱
  20. Steam VR的使用(二)

热门文章

  1. 各大搜索引擎蜘蛛IP地址大全
  2. 深入SpringBoot核心注解原理
  3. 企业上云的动力是什么
  4. java通过API给企业微信用户发送微信消息
  5. Ghost XP SP2下如何安装IIS的解决方案
  6. Springboot毕设项目基于WEB的延边旅游网 5jjp2java+VUE+Mybatis+Maven+Mysql+sprnig)
  7. 《宝岛双雄》曝正式海报 房祖名挑大梁的银幕转型之作
  8. 雷电、夜神、天天、逍遥等模拟器中找不到要下载的软件解决方法
  9. MATLAB中Simulink创建与运行
  10. 加快MATLAB运行速度的三个方法