写点什么

数据库每日一题 --- 第 1 天:超过经理收入的员工

作者:知心宝贝
  • 2022 年 6 月 03 日
  • 本文字数:885 字

    阅读完需:约 3 分钟

数据库每日一题---第1天:超过经理收入的员工

一、问题描述

表:Employee 
+-------------+---------+| Column Name | Type |+-------------+---------+| id | int || name | varchar || salary | int || managerId | int |+-------------+---------+
复制代码


Id是该表的主键。该表的每一行都表示雇员的 ID、姓名、工资和经理的 ID。


编写一个 SQL 查询来查找收入比经理高的员工。


任意顺序 返回结果表。


题目链接:超过经理收入的员工

二、题目要求

样例

输入: Employee 表:+----+-------+--------+-----------+| id | name  | salary | managerId |+----+-------+--------+-----------+| 1  | Joe   | 70000  | 3         || 2  | Henry | 80000  | 4         || 3  | Sam   | 60000  | Null      || 4  | Max   | 90000  | Null      |+----+-------+--------+-----------+输出: +----------+| Employee |+----------+| Joe      |+----------+解释: Joe 是唯一挣得比经理多的雇员。
复制代码

考察

1.查询2.建议用时10~25min
复制代码

三、问题分析

1.子查询

子查询就是不断的向下延伸,因为每一次都需要重新遍历,所以适合数据量较少、表较少的情况。


这一题,我们先遍历数据库的数据,根据经理的薪资和员工的薪资对比就行了。

2.连接查询

连接查询就是提前将表连接成一个表,再从表中筛选出符合条件的记录。连接查询的部分表,如下所示:



我们只需要在 where 子句里面添加两个条件判断就行,一个是经理的 id 号要等于一开始的 id 号,第二个是员工的工资要大于经理才行。


筛选出满足这两种条件的记录,输出其姓名就行。

3.join 优化

我们可以摒弃 where,直接使用 join 优化连接,条件还是上面确定的两个条件,只不过用在 on 后面。

四、编码实现

1.子查询

select e.name as Employeefrom Employee as ewhere salary>(select salary  from Employee where id=e.managerId)
复制代码

2.连接查询

select a.name as Employeefrom Employee as a,Employee as bwhere a.managerId=b.id and a.salary>b.salary
复制代码

3.join 优化

select a.name as Employeefrom Employee as a join Employee as bon a.managerId=b.id  and a.salary>b.salary
复制代码

五、测试结果



发布于: 刚刚阅读数: 4
用户头像

知心宝贝

关注

公众号:穿越计算机的迷雾 2022.03.07 加入

生于尘埃 溺于人海 死于理想高台

评论

发布
暂无评论
数据库每日一题---第1天:超过经理收入的员工_数据库_知心宝贝_InfoQ写作社区