天道酬勤,学无止境

Mysql__leecode/0184.部门工资最高的员工

184. 部门工资最高的员工

  • 一、刷题内容
    • 原题链接
    • 内容描述
  • 二、解题方法
    • 1.方法一

一、刷题内容

原题链接

https://leetcode-cn.com/problems/department-highest-salary/

内容描述

SQL架构
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 在销售部的工资最高。

二、解题方法

1.方法一

# Write your MySQL query statement below
SELECT
    Department.name AS 'Department',
    Employee.name AS 'Employee',
    Salary
FROM
    Employee
        JOIN
    Department ON Employee.DepartmentId = Department.Id
WHERE
    (Employee.DepartmentId , Salary) IN
    (   SELECT
            DepartmentId, MAX(Salary)
        FROM
            Employee
        GROUP BY DepartmentId
	)
;

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • MySQL练习题184. (中等)部门工资最高的员工
    184. (中等)部门工资最高的员工 184. (中等)部门工资最高的员工 链接: https://leetcode-cn.com/problems/department-highest-salary/ 权限: 会员可查看 要求 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 查询,找出每个部门工资最高的员工。对于上述表,您的
  • mysql 查询部门中男女人数,工资最高,等
    所用数据库的两个表 部门表和用户表 表结构如下 部门表(dept) 用户表(USERS) 1 对单个表进行操作 1.1查询(升序,降序 ) select * from 表名 order by 列名 DESC(降序)/AESC(升序可省) 1.按工资高低排序 SELECT * FROM USERS ORDER BY SALARY (升序) SELECT * FROM USERS ORDER BY SALARY DESC (降序) 结果如图所示(降序) 1.2 查询(查询最大值,第二大值) 1 max函数 2 limit 限制 查出工资最高的员工的信息 (这里没有考虑有重复值的情况,如果有重复值只显示其中一条,要考虑重复值可参考查找每个部门工资最高的员工信息) SELECT * FROM USERS WHERE SALARY =(select max(SALARY) from USERS) SELECT * FROM USERS ORDER BY SALARY DESC limit 1 查询出每个部门工资最高的员工信息 SELECT USERNAME ,max(SALARY) from users GROUP BY dept 3.查出工资第二高的员工的信息 SELECT * FROM USERS WHERE SALARY not in (select max(SALARY) from
  • 【MariaDB 数据库】简单入门
    这篇博客介绍下MariaDB的安装及其使用! MariaDB 数据库 数据库Database1.DBMS2.SQL语言3.SQL语句分类4.数据库相关SQL练习题 5.表相关SQL练习题 6.表相关SQL续表相关SQL回顾练习题 7.DML数据操作语言(和数据相关的SQL)增删改查回顾:综合练习题 8.数据类型9.主键约束 primary key主键约束+自增 auto_increment 10导入*.sql批处理文件11.is null和 is not null去重distinct比较运算符 > < >= <= = !=和<>and和orin关键字between x and y 两者之间 包含x和y综合练习题 12.模糊查询like排序 order by分页查询 limit数值计算+ - * / %别名综合练习题 13.聚合函数综合练习题 14.分组查询group by综合练习题 15.having关键字16.子查询(嵌套查询)16.关联关系关联查询关联查询之等值连接关联查询之内连接关联查询之外连接 有人可能会问,MariaDB和mysql有什么关系?回答:Mysql数据库是瑞典 mysql ab公司开发的,免费开源的数据库;后来被 Oracle甲骨文公司收购,然后就想把 mysql 搞成和 Oracle 数据库一样的闭源收费的,但原来搞 mysql
  • mySQL数据库练习题
    1. 分别创建mydb1和mydb2数据库 字符集第一个是utf8第二个是gbk; 2. 查询所有数据库检查是否创建成功 3. 分别查询两个数据库的字符集 检查是否成功 4. 先使用mydb1再使用mydb2 5. 删除两个数据库 create database mydb1 character set utf8; create database mydb2 character set gbk; show databases; show create database mydb1; show create database mydb2; use mydb1; use mydb2; drop database mydb1; drop database mydb2; 1. 创建数据库mydb2 并使用 如果mydb2存在 删除掉 重新创建 2. 在mydb2数据库里面创建员工表emp 字段有name 字符集为utf8 3. 添加age字段在最后面 4. 添加id字段在最前面 5. 添加gender字段在name字段后面 6. 修改gender性别为sal工资 7. 删除age字段 8. 修改表名为t_emp 9. 删除t_emp 10. 删除数据库 create database mydb2; use mydb2; create table emp(name varchar(50)
  • B站_千锋2020MySQL_6.04练习题
    创建数据 -- 已知三张表 部门表、员工表和工资等级表 -- 部门表[部门编号deptno,部门名称dname,部门地址loc] create table dept( deptno int primary key , dname varchar(14), loc varchar(13) ); -- 添加数据 insert into dept values (10,'accounting','NEW YORK'); insert into dept values (20,'research','DALLAS'); insert into dept values (30,'sales','CHICAGO'); insert into dept values (40,'operations','BOSTON'); -- 员工表 emp -- [员工编号empno, 员工姓名 ename,员工工作 job,员工直属领导编号mgr,入职时间hiredate, -- 工资sal,奖金comn,部门编号deptno] create table emp( empno int primary key , ename varchar(10), job varchar(9), mgr int, hiredate date, sal double, comm double, deptno int ); -
  • LeetCode:MySQL分组内取前几名问题(难度:困难)
    题目:查询部门工资前三高的所有员工 Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId 。 Department 表包含公司所有部门的信息。 编写一个 SQL 查询,找出每个部门获得前三高工资的所有员工。例如,根据上述给定的表,查询结果应返回: 解释:IT 部门中,Max 获得了最高的工资,Randy 和 Joe 都拿到了第二高的工资,Will 的工资排第三。销售部门(Sales)只有两名员工,Henry 的工资最高,Sam 的工资排第二。 题解 对于这种分组内取前几名的问题,可以先group by然后用having count()来筛选。思路为: 先找到每个部门工资前三的员工ID(自联结+group by+having) 再找到每个部门工资前三的部门名称、员工名称、工资和员工ID(两表联结) 最后子查询嵌套即可 1.找到每个部门工资前三的员工ID 用Employee和自己做连接,连接条件是【部门相同但工资比我高】 接下来按照having count(Salary) <= 2来筛选的原理是:如果【跟我一个部门而且工资比我高的人数】不超过2个,那么我一定是部门工资前三 这样就可以查询出每个部门工资前三的员工ID select e1.id,e1.name,e1.DepartmentId from
  • mysql(1-6):基础查询、条件查询、排序查询、常函数、分组、连接查询
    注意:这里面很有可能一些图片的结果与sql语句不一致,是因为上传时,出现了错误,并不是sql语句本身的错误!!! myemployees.sql和girls.sql链接为:链接: https://pan.baidu.com/s/1AcFDFdhxHMuugaiqePXQHg 提取码:izvp 复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V3的分享 mysql基础 1.将myemployees数据库导入Linux上的mysql 点击右键---》执行SQL脚本--->选择电脑中存储myemployees数据的地方 ---加入成功 2.使用数据库的好处: 1.实现数据的持久化 2.使用完整的管理系统统一管理数据,易于查询 3.DB,DBMS,SQL DB:数据库(database),用于保存一组有组织的数据容器 DBMS:数据库管理系统(DataBase Management System),又称数据库软件,用于管理DB中的数据 SQL:结构化查询语言(Structure Query Language),用于和DBMS进行通信 4.数据库的特点 1.将数据放入表中,再将表放入库中 (数据---->表---->库) 2.一个数据库可以有多个表(表名具有唯一性) 3.表具有一些特性,定义了数据在表中怎样存储,类似于Java中的"类" 4.表包含多列
  • MySql学习
    高性能MySql泛读 尚硅谷MySql基础 # 高性能MySql泛读 MySql逻辑架构 最上层不是Mysql独有的,大多数网络、客户端的工具都有类似的架构第二层提供Mysql的核心服务功能,所有跨存储引擎的功能都在这里实现第三层包含了存储引擎,负责数据的存储和提起 1.1.1 连接管理和安全性 每个客户端连接都会在服务器中有一个线程,这个链接单独的在线程中执行,轮流在某个CPU核心中运行,服务器只会负责缓存线程,所以不需要我们主动销毁他们 1.2 并发控制 本章讨论:服务器层和存储引擎层的并发问题 1.2.1 读写锁 读锁是共享的,互相不阻塞的写锁是阻塞的,会阻塞其他所有的写锁和读锁 1.2.2 锁粒度 提高共享资源并发性的方法是让锁定对象更有选择性,尽量之锁定需要修改的部分数据,而不是全部锁策略就是在锁的开销和数据的安全性之间寻求平衡,一般都是在表上加行级锁 表锁:类似邮箱加锁机制,锁定整个表,一个用户在对表写的时候们必须先得到写锁,只有没有写锁的时候骂别人才可以读锁。且写锁的优先级更高,最小的锁开销。行级锁:最大程度的支持并发处理,只在存储引擎层实现,最大的锁开销。 尚硅谷MySql基础 基础知识 语法 基础知识篇 语法篇 #基础查询 #进阶1: 基础查询 /* 一、语法 select 查询列表 from 表名; 二、特点 1、查询列表可以是字段、常量、表达式、函数 2
  • MySQL6天笔记——day02
    文章目录 MySQL数据库 DQL语言 基础查询 条件查询 排序查询 常见函数 单行函数 分组函数 分组查询 欢迎斧正!!! MySQL数据库 全部SQL源文件链接:https://pan.baidu.com/s/1wc51qkVetSRybFzcIYGBIg 提取码:3wpt DQL语言 基础查询 语法:select 查询列表 from 表名; 类似于System.out.println(打印东西); 特点: 1.查询列表可以是:表中的字段、常量值、表达式、函数 2.查询的结果可以是一个虚拟表格; 案例 USE myemployees; #1.查询表中的单个字段 SELECT last_name FROM employees; #2.查询表中多个字段 SELECT last_name,salary,email FROM employees; #3.查询表中的所有字段 SELECT * FROM employees; #4.查询常量 # select 常量值; # 注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要 SELECT 100; SELECT 'join'; #5.查询函数 #select 函数名(实参列表); SELECT VERSION(); #6.查询表达式 SELECT 100%98; #7.起别名 /* 1.便于理解 2.如果要查询的字段有重名的情况
  • mysql的DQL(数据查询语言)一
    DQL(数据查询语言) 基本的SELECT语句基础查询案例 过滤和排序数据过滤查询案例 分组查询 思维导图大纲 基本的SELECT语句 列的别名: 重命名一个列。 便于计算。 紧跟列名,也可以在列名和别名之间加入关键字‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。 字符串: 字符串可以是 SELECT 列表中的一个字符,数字,日期。 日期和字符只能在单引号中出现。 • 每当返回一行时,字符串被输出一次。 注意: SQL 语言大小写不敏感。 • SQL 可以写在一行或者多行 关键字不能被缩写也不能分行 各子句一般要分行写。 使用缩进提高语句的可读性。 基础查询案例 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 特点: 1、查询列表可以是:表中的字段、常量值、表达式、函数 2、查询的结果是一个虚拟的表格 */ 1.查询表中的单个字段 SELECT last_name FROM t_mysql_employees; 2.查询表中的多个字段 SELECT last_name,salary,email FROM t_mysql_employees; 3.查询表中的所有字段 方式一: SELECT employee_id, first_name, last_name, phone_number
  • MySQL之分组查询
    一、语法规则 select 分组函数,列(要求出现在group by后面) from 表 【where筛选条件】 group by 分组的列表 【order by 子句】 #注意: #查询列表必须特殊,要求是分组函数和group by后面出现的字段 二、分组查询的特点 1.分组查询中的筛选条件分两类 a.分组前筛选,数据源是原始表,位置在group by子句的前面,使用where关键字 b.分组后筛选,数据源是分组后的结果集,位置在group by子句的后面,使用having关键字 2.分组函数做条件肯定是放在having子句中,能使用分组前筛选的,就优先考虑使用分组前筛选 三、实际案例 1.添加分组前的筛选 #案例1:查询每个工种(job_id)的最高工资 SELECT MAX(salary), job_id FROM employees GROUP BY job_id; #案例2:查询每个位置(local_id)上的部门个数 SELECT COUNT(*), local_id FROM employees GROUP BY local_id; #案例3:查询邮箱(email)中包含a字符的,每个部门(department_id)的平均工资 SELECT AVG(salary), department_id FROM employees WHERE email LIKE '%a%
  • MySQL复习(三)分组函数,分组查询
    分组函数 sum 求和 max 最大值 min 最小值 avg 平均值 count 计数 特点: 1、以上五个分组函数都忽略null值,除了count(*) 2、sum和avg一般用于处理数值型 max、min、count可以处理任何数据类型 3、都可以搭配distinct使用,用于统计去重后的结果 4、count的参数可以支持: 字段、*、常量值,一般放1 建议使用 count(*) 分组查询 语法: SELECT 分组函数,列(要求出现在group by 后面) FROM 表 WHERE 筛选条件 GROUP BY 分组的列表 ORDER BY 子句 特点: 可以按单个字段分组和分组函数一同查询的字段最好是分组后的字段分组筛选 针对的表 位置 关键字分组前筛选: 原始表 group by的前面 where分组后筛选: 分组后的结果集 group by的后面 having可以按多个字段分组,字段之间用逗号隔开可以支持排序having后可以支持别名 # 引入:查询每个部门的平均工资 # 结果:6461.682243 SELECT AVG(salary) FROM employees; # 简单的分组查询 # 案例1: 查询每个工种的最高工资 # 结果:8300.00 AC_ACCOUNT (结果集) SELECT MAX(salary),job_id FROM employees
  • mysql查询之部门工资最高的员工
    最近发现一个网站 力扣 查看 上面有很多算法和数据库的题目,做了一下,发现自己平时都疏忽了,因此边做边记录下来 Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。 +----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | +----+-------+--------+--------------+ Department 表包含公司所有部门的信息。 +----+----------+ | Id | Name | +----+----------+ | 1 | IT | | 2 | Sales | +----+----------+ 编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。 +------------+----------+--------+ |
  • MySQL分组查询——简单查询、添加筛选条件、添加排序
    MySQL分组查询 分组数据: group by子句 可以使用group by子句将表中的数据分成若干组 语法: select 分组函数,列(分组查询搭配分组函数使用,要求列要出现在group by后面) from 表 【where 筛选条件】 group by 表达式 【order by 字段】 注: 查询列表比较特殊,要求是分组函数和group by 后出现的字段, where一定要放在from后面 。 特点: 1. 分组查询中的筛选条件分为两类: 注: ①分组函数做条件放在having子句中 ②能用分组前筛选的,优先考虑使用分组前筛选 数据源(针对的表)位置关键字分组前筛选:原始表group by的前面where分组后筛选:分组后的结果集group by的后面having 2. group by子句支持单个字段分组、多个字段分组(多个字段之间用逗号隔开没有顺序要求)、表达式或函数(相对前两种不常用) 3. 也可以添加排序(排序放在整个分组查询的最后) 一. 简单查询 : 1.查询每个工种的最高工资 2.查询每个位置上的部门个数 二. 添加筛选条件 : 1.查询邮箱中包含a字符的,每个部门的平均工资 2.查询每个领导手下有奖金的员工最高工资 注:以上两个筛选条件涉及的(where后面的)字段都来自原始表(from后面的表) 三. 添加复杂筛选条件 : 1.查询部门的员工个数>2
  • 动力节点Mysql练习题34道
    有三张表 1、部门表 dept 2、员工表 emp 3、薪水等级表 salgrade 1、 取得每个部门最高薪水人员的名称 select e.ename,t.* from (select deptno,max(sal) as msal from emp group by deptno)as t join emp e on e.sal = t.msal and e.deptno = t.deptno; 2、哪些人的薪水在部门的平均薪水之上 select e.ename,t.* from emp e join (select deptno,avg(sal) avgsal from emp group by deptno)t on e.deptno = t.deptno and e.sal > t.avgsal; 3、取得部门中所有人平均的薪水等级 select e.deptno,avg(s.grade) agrade from emp e join salgrade s on e.sal between s.losal and s.hisal group by e.deptno; 4、不用组函数(max),取得最高薪水 select ename,sal from emp order by sal desc limit 1; 5、取得平均薪水最高部门的部门编号; select
  • mysql子查询
    一、子查询 嵌入在其它sql语句中的select语句,又叫嵌套查询 二、单行子查询 只返回一行数据的子查询语句。 -- 子查询 -- 查询与小王同一部门的员工 -- 先查询小王所属部门编号 -- 把SELECT deptno FROM emp WHERE ename = '小王'当作一个子查询使用 SELECT deptno FROM emp WHERE ename = '小王' SELECT*FROM emp WHERE deptno= (SELECT deptno FROM emp WHERE ename = '小王') 三、多行子查询 返回多行数据的子查询,使用关键字in。 -- 查询和部门3的工作相同的雇员,不包含3号部门自己的员工 SELECT DISTINCT job FROM emp WHERE deptno = 3 SELECT ename,job,sal,deptno FROM emp WHERE job IN(SELECT DISTINCT job FROM emp WHERE deptno = 3)AND deptno !=3 四、子查询当作临时表使用 -- 查询商品表,各类中价格最高的商品 -- 价格最高的商品max+group by cat_id,当作临时表 SELECT cat_id, MAX(shop_price) FROM ecs_goods
  • MYSQL学习4分组查询
    MYSQL学习4分组查询 #进阶5:分组查询 /* 语法: select 分组函数,列(要求出现在group by后面) from 表 【where 筛选条件】 group by 分组的列表 【order by 子句】 注意: 查询列表比较特殊,要求分组函数和group by后出现的字段 特点: 1.分组查询中的筛选条件分为两类 数据源 位置 关键字 分组前筛选 原始表 group by字句的前面 where 分组后筛选 分组后的结果集 group by字句的后面 having 1.分组函数做条件肯定是放在having子句中 2.能用分组前筛选的,就优先考虑使用分组前筛选 2.group by字句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求), 表达式或函数(用的较少) 3.也可以添加排序(排序放在整个分组查询的最后) */ #引入:查询每个部门的平均工资 #简单的分组查询 #案例1:查询每个工种的最高工资 SELECT MAX(salary),job_id FROM employees GROUP BY job_id ; #案例2:查询每个位置上的部门个数 SELECT COUNT(department_id), location_id FROM departments GROUP BY location_id ; #添加分组前的筛选条件 #案例1
  • MySQL学习总结(四)DQL语言之子查询/标量子查询/列子查询/行子查询/表子查询/分页查询/联合查询
    一、子查询 (一)概念 出现在其他语句内部的SELECT语句,称为子查询或内查询;内部嵌套其他SELECT语句的查询,称为外查询或主查询 (二)分类 按子查询出现的位置: SELECT后面:仅支持标量子查询FROM后面:支持表子查询WHERE或HAVING后面:支持标量子查询、列子查询、行子查询EXISTS后面(相关子查询):支持表子查询 按子查询结果集的行列数不同: 标量子查询(结果集只有一行一列)列子查询(结果集只有一列多行)行子查询(结果集为多行多列或一行多列)表子查询(结果集一般为多行多列) (三)WHERE或HAVING后面的子查询 支持标量子查询、列子查询、行子查询 特点: 子查询放在小括号内子查询一般放在条件的右侧标量子查询,一般搭配着单行操作符使用(> < >= <= = <>)列子查询,一般搭配着多行操作符使用(in/not in、any/some、all)子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果 1.标量子查询 一般搭配着单行操作符使用(> < >= <= = <>) 案例1:谁的工资比Abel高? #1.查询Abel的工资 SELECT salary FROM employees WHERE last_name='Abel'; #2.查询员工的信息,满足salary>1中的结果 SELECT * FROM employees WHERE
  • LeetCode 部门工资前三高的所有员工
    题 目 描 述 : \color{blue}题目描述: 题目描述: Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId 。 +----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 85000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | | 5 | Janet | 69000 | 1 | | 6 | Randy | 85000 | 1 | | 7 | Will | 70000 | 1 | +----+-------+--------+--------------+ Department 表包含公司所有部门的信息。 +----+----------+ | Id | Name | +----+----------+ | 1 | IT | | 2 | Sales | +----+----------+ 编写一个 SQL 查询,找出每个部门获得前三高工资的所有员工。例如,根据上述给定的表
  • MySQL基础-查询
    1. 简单查询 语法: SELECT 表字段名 FROM 表名; 多个字段用逗号隔开 例如: 1.查询表中的单个字段 SELECT last_name FROM employees; 2.查询表中的多个字段 SELECT last_name,salary,email FROM employees; 3.查询表中的所有字段 方式一: SELECT `employee_id`, `first_name`, `last_name`, `phone_number`, `last_name`, `job_id`, `phone_number`, `job_id`, `salary`, `commission_pct`, `manager_id`, `department_id`, `hiredate` FROM employees ; 方式二: SELECT * FROM employees; 注意:字段名前面加的(着重符号,在键盘数字1左边) 4.查询常量值 SELECT 100; SELECT 'john'; 5.查询表达式 SELECT 100%98; 6.查询函数 SELECT VERSION(); 7.起别名 ①便于理解 ②如果要查询的字段有重名的情况,使用别名可以区分开来 方式一:使用as SELECT last_name AS 姓,first_name AS 名 FROM