- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
Employees
+-------------+----------+ | Column Name | Type | +-------------+----------+ | employee_id | int | | name | varchar | | manager_id | int | | salary | int | +-------------+----------+ 在 SQL 中,employee_id 是这个表的主键。 这个表包含了员工,他们的薪水和上级经理的id。 有一些员工没有上级经理(其 manager_id 是空值)。查找这些员工的id,他们的薪水严格少于
$30000
并且他们的上级经理已离职。当一个经理离开公司时,他们的信息需要从员工表中删除掉,但是表中的员工的manager_id
这一列还是设置的离职经理的id 。返回的结果按照
employee_id
从小到大排序。查询结果如下所示:
示例:
输入: Employees table: +-------------+-----------+------------+--------+ | employee_id | name | manager_id | salary | +-------------+-----------+------------+--------+ | 3 | Mila | 9 | 60301 | | 12 | Antonella | null | 31000 | | 13 | Emery | null | 67084 | | 1 | Kalel | 11 | 21241 | | 9 | Mikaela | null | 50937 | | 11 | Joziah | 6 | 28485 | +-------------+-----------+------------+--------+ 输出: +-------------+ | employee_id | +-------------+ | 11 | +-------------+ 解释: 薪水少于 30000 美元的员工有 1 号(Kalel) 和 11号 (Joziah)。 Kalel 的上级经理是 11 号员工,他还在公司上班(他是 Joziah )。 Joziah 的上级经理是 6 号员工,他已经离职,因为员工表里面已经没有 6 号员工的信息了,它被删除了。
三,建表语句
Create table If Not Exists Employees (employee_id int, name varchar(20), manager_id int, salary int);
Truncate table Employees;
insert into Employees (employee_id, name, manager_id, salary) values ('3', 'Mila', '9', '60301');
insert into Employees (employee_id, name, manager_id, salary) values ('12', 'Antonella', null, '31000');
insert into Employees (employee_id, name, manager_id, salary) values ('13', 'Emery', null, '67084');
insert into Employees (employee_id, name, manager_id, salary) values ('1', 'Kalel', '11', '21241');
insert into Employees (employee_id, name, manager_id, salary) values ('9', 'Mikaela', null, '50937');
insert into Employees (employee_id, name, manager_id, salary) values ('11', 'Joziah', '6', '28485');
四,分析
题解:
表 员工表
字段:员工id 员工姓名,上级id ,薪水
要求:薪水低于30000
并且 经理id 已经离职 不在员工id列
找出这样的员工
且按照员工id排序
解法一: 子查询
条件1 直接薪水小于3000
条件2 经理的id不在表的eid里面
然后拿到员工的id 最后排序
解法二,自链接 且是左连接
员工表1链接员工表2 表1的员工id 等于表2的经理id
先判断第一个 员工的薪资小于3000 筛选出来
第二个条件 就是我经理的id不在员工的id列里面 所以我经理的id not in 全表的id
最后排序
五,SQL解答
解法一:子查询
select employee_id as e from employees
where salary<30000
and manager_id not in(select employee_id from employees)
order by employee_id;
解法二,自连接
with t1 as (
select e1.employee_id as e_1 from employees e1 left join employees e2 on e1.employee_id=e2.manager_id
where e1.salary<30000
and e1.manager_id not in (select employee_id from employees)
)
select distinct t1.e_1 as employee_id from t1 order by employee_id;
六,验证
七,知识点总结
如果用自连接之后
e1的员工就是经理
e2的员工就是他所属的员工
我的标识如果是经理的标识 那么我就是经理
- 学习:知识的初次邂逅
- 复习:知识的温故知新
练习:知识的实践应用