SQL练习——查询部门工资最高的员工

题目来源于leetcode:184. 部门工资最高的员工

思路:

首先是分部门的,因此肯定会用到group by ;其次各部门拥有最高工资的员工可能不仅仅只有一个人。

初步解法:

根据需求,可以先查询Employee表中的各部门的最高工资标准,作为一个标准线,代码如下:

select Max(Salary) Salary,DepartmentId from Employee group by Employee.DepartmentId -- 各部门最高工资的标准 

有了这个工资水平线,就可以用它来和员工工资进行比较,工资等于最高工资的员工使我们需要的结果,代码如下

select d.Name Department,e.Name Employee ,e.Salary  from Employee e
left join Department d on d.Id=e.DepartmentId
left join (select Max(Salary) Salary,DepartmentId from Employee group by Employee.DepartmentId)a on a.DepartmentId = e.DepartmentId
where e.Salary = a.Salary

  写到这我感觉问题不大了,执行的时候输出也和预期结果一致,但是当我提交的时候,结果却仍然是解答错误,仔细看了一下提交记录中的测试用例,看到一个提示,如下

原来当Department表记录为空时,输出与预期不一致。我想这个测试用例可能是出于业务上的场景考虑。

二次考虑:

造成我这种输出的原因是我用的是左连接,即Employee表是主表,其它表不论是否有数据都不会影响记录的行数。既然要考虑Department表的记录数,那我不如就把Department表作为主表来连接,即对Department表进行右连接,而那个最高工资水平线的表本身就是从Employee表中查询的,因此它的记录行数应该小于等于Employee的记录数,总之它的记录数受Employee的影响,因此它采用左连接还是右连接都无关紧要。修改后的代码如下(仅仅一个left join 改成right join)

select d.Name Department,e.Name Employee ,e.Salary  from Employee e
right join Department d on d.Id=e.DepartmentId
left join (select Max(Salary) Salary,DepartmentId from Employee group by Employee.DepartmentId)a on a.DepartmentId = e.DepartmentId
where e.Salary = a.Salary

这样就能提交成功了,刚开始也只是凭感觉试了一下没多想,结果成功了反倒让我挺惊讶,仔细一想确实是这么一个事儿。

大家有什么想法,一起来讨论呀!

原文地址:https://www.cnblogs.com/masTerpie/p/11644278.html

时间: 2024-11-05 18:44:13

SQL练习——查询部门工资最高的员工的相关文章

MySQL_项目7: 各部门工资最高的员工(难度:中等)

项目七: 各部门工资最高的员工(难度:中等) 创建Employee 表,包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id. +----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 | | 2 | Henry | 80000 | 2 | |

184. 部门工资最高的员工

  184. 部门工资最高的员工 需要注意的几个点,inner join可以缩减成join,取的是两个表的交集 in关键词,找的是当前所要找的数值是否在指定的范围之中 # Write your MySQL query statement below select d.Name as Department, e.Name as Employee, e.Salary from Employee e inner join Department d on e.DepartmentId = d.Id wh

力扣——部门工资前三高的员工(数据库的题

Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id . +----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | |

[Oracle系列整理01]PL/SQL 基本查询与排序

本课重点:    1.写SELECT语句进行数据库查询    2.进行数学运算    3.处理空值    4.使用别名ALIASES    5.连接列    6.在SQL PLUS中编辑缓冲,修改SQL SCRIPTS    7.ORDER BY进行排序输出.    8.使用WHERE 字段. 一.写SQL 命令:      不区分大小写.      SQL 语句用数字分行,在SQL PLUS中被称为缓冲区.      最后以:或 / 结束语句.      也可以用RUN来执行语句 二.例1:

Oracle SQL 经典查询练手第三篇

Oracle SQL 经典查询练手第三篇 本文分享的是Oracle SQL的经典查询第三篇,仅仅是作者自己的见解,如有问题,希望您给出建议或者方法.同时,欢迎广大读者们补充,如果您有经典的查询方式也可以拿出来我们共同分享,共同成长,共同进步. 本计算机上使用的是Oracle 11.2.0版本,使用scott用户登陆.使用的是系统自带的表. 表结构: describe employees; describe departments; describe locations; select *from

SQL复杂查询(子查询)

USE STUDY SELECT * from EMP SELECT * FROM SALGRADE --1.查询雇员姓名,所在部门编号和名称 SELECT ename,EMP.deptno,DEPT.deptno FROM EMP INNER JOIN DEPT ON DEPT.deptno =EMP.deptno --2.查询雇员姓名,工作,领导的姓名 SELECT e1.ename,e1.job,e2.ename FROM EMP e1 INNER JOIN EMP e2 on e1.mg

SQLAlchemy教程-第四章-SQL常用查询的ORM写法进阶2-待完善

内容预告 别名的用法 函数的用法 分组的写法. case when的用法. exists的用法 为啥要用别名? 如果两个表的两列名字相同, 那么为了区分这两列, 必须使用别名. 如果有一列是通过运算出来的, 那么一定要给这列起个名字, 否则无法在查询结果中引用. 看别名的写法. 先把代码贴上来, 然后注释我都在代码里写了, 请大家自行阅读~ (#^.^#) from models import * # 别名 def query_with_column_alias(): emps = sess.q

Oracle数据库——SQL高级查询

一.涉及内容 1.掌握SELECT语句的多表连接查询. 2.掌握SELECT语句的子查询. 二.具体操作 (一)根据Oracle数据库scott方案下的emp表和dept表,完成下列操作: 1.查询所有工种为CLERK的员工的姓名及其部门名称. select ename,dname from scott.emp t1 inner join scott.dept t2 on t1.deptno=t2.deptno where job='CLERK'; 2.查询所有部门及其员工信息,包括那些没有员工

sql 简单查询,限定查询及排序

SQL(structured Query Language  结构化查询语言)是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统. SQL语言包含4个部分: ※数据定义语言(DDL),例如:CREATE.DROP.ALTER等语句. ※数据操作语言(DML),例如:INSERT.UPDATE.DELETE语句. ※数据查询语言(DQL),例如:SELECT语句. ※数据控制语言(DCL),例如:GRANT.REVOKE.COMMIT.ROLLBACK等语句. 简单查询