牛客网SQL-第九题-获取所有非manager的员工emp_no

牛客网SQL-第九题-获取所有非manager的员工emp_no

往期SQL:

牛客网SQL-第8题-找出所有员工当前具体的薪水salary情况
牛客网SQL-第7题-请你查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t
牛客网SQL-第4题-请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,未分配的部门的员工不显示
牛客网SQL-第二题-请你查找employees里入职员工时间排名倒数第三的员工所有信息
牛客网-SQL题库第一题-解答

现在进入第10题:
题目描述:

有一个员工表employees简况如下:
在这里插入图片描述
有一个部门领导表dept_manager简况如下:
在这里插入图片描述
创建语句:

CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
题目要求:

请你找出所有非部门领导的员工emp_no,以上例子输出:
在这里插入图片描述

解析与理解

献上解题源码:

select emp_no
from employees
where emp_no not in(
select emp_no
from dept_manager
)

这是我最先解题方法, 就是子查询

  1. 先通过领导表查出领导员工的no号
  2. 再通过大员工表查不包含领导no的的员工no号

但是我过了一段时间, 在做这个题目的时候, 不想用原来的方法, 所以用了多表查询的左查询

左查询的源码:

SELECT e.emp_no
FROM employees e
LEFT JOIN dept_manager d
ON e.emp_no = d.emp_no
WHERE dept_no IS NULL;

左查询:

  1. 把大员工表作为左表(员工表肯定比领导表人员多, 因为领导也属于员工), 领导表作为右表
  2. 这样连接后, 因为领导少, 所以会有一些null出现
  3. 出现null的列就是纯粹员工表,所以只要赛选出是null的就行.
理解与解析:

1.子查询中in (not in) 后面接多个字段, 本文中领导的emp_no不止一个, 所以是用not in, 如何能够确定是一个, 也可以用"=", 但是, “=” 后面解的字段只能是一个, 不然会错误
2. 在外连接(包含有左查询与右查询等)中, 以主表为准, 副表未有字段会以null代替, 副表多出字段不会查询到的, 所有考虑好主表与左右连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Data π

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值