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

Posted 数据修行路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客网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代替, 副表多出字段不会查询到的, 所有考虑好主表与左右连接

以上是关于牛客网SQL-第九题-获取所有非manager的员工emp_no的主要内容,如果未能解决你的问题,请参考以下文章

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

SQL练习题-牛客网

牛客网SQL-第8题-找出所有员工当前具体的薪水salary情况

牛客网SQL-第8题-找出所有员工当前具体的薪水salary情况

牛客网SQL-第8题-找出所有员工当前具体的薪水salary情况

牛客网SQL-第8题-找出所有员工当前具体的薪水salary情况