Mysql多表查询,获取部门最高工资的sql语句方案
PS:之前写过一篇文章,是另一种方法(关联子查询),感兴趣的可以去看一下:sql关于group by和max函数一起使用的坑(同理,求部门最高工资)_HD243608836的博客-CSDN博客
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
建表的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对应
部门表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 employee group by DepartmentId)
貌似得到了想要的结果,但是出现以下情况时,得到的结果就是错误的:
当我改动joe的工资为80000时,得到的结果出乎意料:
为什么会出现这种情况?
where salary in
(select max(salary)
from employee
group by DepartmentId)
这里筛选条件相当是salary in (80000,90000)
下面给出正确的方式(不需要group by哦!!!)
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
自连接:连接的条件是e1工资比e2工资低,部门号相同,这是当同部门中e1中没有比自己工资高的,自动补null,也就是上图中的情况
此时连接部门表,再筛选出e2的id是null的行就是所要求的
Mysql多表查询,获取部门最高工资的sql语句方案相关推荐
- php多表数据排除,thinkphp中多表查询中防止数据重复的sql语句(必看)
thinkphp中多表查询中防止数据重复的sql语句(必看) 这里有新鲜出炉的精品教程,程序狗速度看过来! ThinkPHP 开源 PHP 框架 ThinkPHP 是一个开源的 PHP 框架,是为了简 ...
- mysql纵表 主键_数据库面试题-sql语句
原标题:数据库面试题-sql语句 1,写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的. 答: → 解1: select top ...
- mysql 删除表记录的 存储过程命令_用SQL语句删除一个数据库的所有表和所有存储过程...
如果数据库里有很多表和存储过程,要用手动鼠标右键一个个删除是很麻烦的,用SQL语句来删除就方便很多了 删除所有的表: 如果由于外键约束删除table失败,则先删除所有约束: --/第1步******* ...
- MySQL多表查询练习
/* 多表查询 */-- 准备数据 -- 创建部门表 CREATE TABLE tb_dept (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) ...
- mysql 伪表查询语句_MySql系列05:MySql中DQL查询操作
1.表的准备 准备四张表: dept(部门表).emp(员工表).salgrade(薪资等级表).bonus(奖金表) create table DEPT( DEPTNO int(2) not nul ...
- mysql多表查询详解_MySQL多表查询详解上
时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由 ...
- mysql水果表查询_最全MySQL数据库表的查询操作
序言 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可 ...
- MySQL多表查询(8.0)
文章目录 多表查询 1. 多表关系 1.1 一对多 1.2 多对多 1.3 一对一 2. 多表查询概述 2.1 数据准备 2.2 概述 2.3 分类 3. 内连接 4. 外连接 5. 自连接 5.1 ...
- Mysql多表查询效率的研究(一)
Mysql多表查询效率的研究(一) 本文探究了mysql InnoDB引擎在多表查询的应用场景下,使用子表.内连接和左联接运行速度的差别,并且比较了索引使用与否对查询效率的影响. 第一部分简略地概括了 ...
最新文章
- 编译工具 之 ant
- maven插件的使用
- P1283 平板涂色
- 【无标题】服务机器人---SLAM算法之gmapping
- NLP之ASR:语音识别技术(Automatic Speech Recognition)的简介、发展历史、案例应用之详细攻略
- linux查端口占用
- CentOS上安装Jekins
- Web前端研发工程师编程能力飞升之路
- 芭蕉树上第十二根芭蕉--opencv配置问题
- 用计算机音乐的歌词,电脑酷狗音乐怎么在屏幕上显示歌词
- 81192!请返航!
- 饥荒独立服务器在线模式收不到,Windows 服务器搭建Don’t Starve Together饥荒独立服务器教程...
- 靖哥哥教你如何在docker中安装mysql
- 微信小程序wepy框架+minui踩坑之路
- 数学建模Word排版——样式
- JS 声音提示 兼容所有浏览器
- 【ffmpeg】YUV实践
- 计算机进行取模的原理,计算机组成原理中按2取模是什么意思?
- QQ客服链接(手机浏览器、PC电脑端点击链接直接打开手机QQ添加好友)
- Python 生成随机经纬度数据