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

Posted masterpie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

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

 

以上是关于SQL练习——查询部门工资最高的员工的主要内容,如果未能解决你的问题,请参考以下文章

sql语句求出第三到第五的工资

sql查询员工的基本工资排名第3-6位的姓名和基本工资

SQL数据库 计算出每个部门的平均工资 最高工资和最低工资 语法怎么写?

几个oracle练习题

每日SQL打卡184. 部门工资最高的员工

每日SQL打卡184. 部门工资最高的员工