题解-牛客网-SQL-(SQL10)获取所有非manager的员工emp_no

1. 题目描述

1.1 输入

有一个员工表employees简况如下:
employees表简况
建表语句如下:

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));

有一个部门领导表dept_manager简况如下:
dept_manager表简况
建表语句如下:

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));

1.2 输出

请你找出所有非部门领导的员工emp_no,以上例子输出:
SQL查询期望的输出结果

2. 题目分析及解答

2.1 题目分析

该题旨在考查SQL逻辑运算符NOT IN的用法。由于IN关键字效率较低,也可将NOT IN语句改写为左外连接语句。需要注意的是,不能写成如下语句:

SELECT e.emp_no FROM employees AS e, dept_manager AS d WHERE e.emp_no != d.emp_no;

该语句的输出实际上是employees表和dept_manager表的笛卡尔积去掉满足employees.emp_no = dept_manager.emp_no的记录后得到的集合,并不符合本题的查询要求。

2.2 详细解答

根据题目分析可直接写出相应的SQL查询语句:

SELECT emp_no FROM employees WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager);

或:

SELECT e.emp_no FROM employees AS e LEFT OUTER JOIN dept_manager AS d ON e.emp_no = d.emp_no WHERE d.dept_no is NULL;
-- 左外连接的目的是获取一个结果集合,该集合中非manager的员工的dept_no为NULL,从而可以使用WHERE子句将这些员工从集合中筛选出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值