首页 > 试题广场 >

获取所有非manager的员工emp_no

[编程题]获取所有非manager的员工emp_no
  • 热度指数:463204 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个员工表employees简况如下:
emp_no 
birth_date 
first_name 
last_name 
gender hire_date 
10001
1953-09-02
Georgi     
Facello   
 M 1986-06-26
10002
1964-06-02
Bezalel    
Simmel    
 F 1985-11-21
10003  
1959-12-03
Parto      
Bamford   
 M 1986-08-28

有一个部门领导表dept_manager简况如下:
dept_no 
emp_no
from_date 
to_date
d001
10002
1996-08-03 9999-01-01
d002
10003
1990-08-05 9999-01-01

请你找出所有非部门领导的员工emp_no,以上例子输出:
emp_no
10001

示例1

输入

drop table if exists  `dept_manager` ; 
drop table if exists  `employees` ; 
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`));
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`));
INSERT INTO dept_manager VALUES('d001',10002,'1996-08-03','9999-01-01');
INSERT INTO dept_manager VALUES('d002',10003,'1990-08-05','9999-01-01');
INSERT INTO employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21');
INSERT INTO employees VALUES(10003,'1959-12-03','Parto','Bamford','M','1986-08-28');

输出

10001

方法一:使用NOT IN选出在employees但不在dept_manager中的emp_no记录
SELECT emp_no FROM employees
WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager)
方法二:先使用LEFT JOIN连接两张表,再从此表中选出dept_no值为NULL对应的emp_no记录
SELECT emp_no FROM (SELECT * FROM employees LEFT JOIN dept_manager 
ON employees.emp_no = dept_manager.emp_no)
WHERE dept_no IS NULL
方法三:方法二的简版,使用单层SELECT语句即可
SELECT employees.emp_no FROM employees LEFT JOIN dept_manager
ON employees.emp_no = dept_manager.emp_no
WHERE dept_no IS NULL

编辑于 2017-10-10 15:06:56 回复(65)

Mysql 还有一种方法,和 not in 类似

select emp_no from employees
where emp_no <> all(select emp_no from dept_manager)
发表于 2021-08-29 21:19:08 回复(0)
10.获取所有非manager的员工emp_no
select emp_no
from employees
where employees.emp_no
not in(select emp_no from dept_manager)
找不在管理表上的员工emp_no,用not in
发表于 2021-08-09 09:03:44 回复(0)
select emp_no 
from employees
where emp_no not in (select emp_no from dept_manager)


发表于 2021-06-29 19:39:32 回复(0)
select a.emp_no
from employees as a
left join dept_manager as b on a.emp_no=b.emp_no
where b.emp_no is null
发表于 2021-04-08 15:39:09 回复(0)
诶 是我有问题吗- -    感觉所有的题目 都不知道说的是什么....不看代码的话  不知道发题者要说什么都
发表于 2020-09-04 16:00:23 回复(1)
select emp_no
from employees
where emp_no not in(select emp_no from dept_manager);

发表于 2020-06-06 10:53:49 回复(0)
用not in,先查出dept_manager表中的员工号,(1)
再查找employees表中的员工号emp_no 不在(2)的员工的员工号 :
select emp_no
from employees
where emp_no not in
(select emp_no from dept_manager);


发表于 2020-01-28 11:39:49 回复(0)
SELECT
    employees.emp_no
FROM
    employees
WHERE
    employees.emp_no NOT IN (select dept_manager.emp_no from dept_manager);
发表于 2018-06-22 17:13:06 回复(1)
select e.emp_no from employees e left join dept_manager dm
on e.emp_no = dm.emp_no
where dm.to_date(只要是表dm有 employee没有的字段即可) is null;
发表于 2017-09-20 22:31:12 回复(0)
三种方法:
select a.emp_no
from employees a
left join
dept_manager b
on a.emp_no=b.emp_no
where b.emp_no is null;


select a.emp_no
from employees a
where a.emp_no not in (select b.emp_no from dept_manager b);

SELECT emp_no FROM (SELECT * FROM employees LEFT JOIN dept_manager
ON employees.emp_no = dept_manager.emp_no)
WHERE dept_no IS NULL;
发表于 2017-09-06 10:16:09 回复(0)
select e.emp_no from employees e left join dept_manager d on e.emp_no = d.emp_no where d.emp_no is null;
发表于 2017-08-23 15:29:16 回复(0)
select emp_no from employees where emp_no not in (select emp_no from dept_manager)
发表于 2017-07-07 11:44:34 回复(1)
select emp_no from employees 
EXCEPT
select emp_no from dept_manager;
本题可以用集合运算。
发表于 2020-05-05 16:24:06 回复(3)
SELECT es.emp_no 
FROM employees AS es
WHERE es.emp_no NOT IN (
    SELECT emp_no 
    FROM dept_manager
)

发表于 2020-07-22 17:35:02 回复(0)
not in在实际使用中,因为not in会转化成多表连接,而且不使用索引,在这里,觉得还是用left_join代替会好一点
select e.emp_no from employees as e left join dept_manager as d on e.emp_no = d.emp_no
where d.dept_no is null

发表于 2017-08-01 03:09:05 回复(6)
select e.emp_no
from employees e
left join dept_manager dm
on dm.emp_no = e.emp_no
where dm.dept_no is null;
MySQL官方文档有说明,in关键字适合确定数量的情况,一般效率较低,不推荐使用。能用in关键字的语句都可以转化为使用join的语句,推荐使用join关键字。

发表于 2018-01-22 17:40:22 回复(9)

分享两种解法,第一种:

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

第二种

select employees.emp_no from employees left join dept_manager
on (employees.emp_no=dept_manager.emp_no)
where dept_manager.emp_no is null

貌似第二种效率更高一点??

发表于 2017-11-08 17:59:22 回复(1)
select em.emp_no from employees em where not exists(select distinct dm.emp_no from dept_manager dm where em.emp_no=dm.emp_no)
使用not in 如果子查询中返回的任意一条记录包含空值,则查询不返回任何记录,而且not in 会对内外表进行全表扫描,没有用到索引。而not exists子查询仍然会用到索引,所以无论那个表大,not exists都会比not in 快。
另外,如果子查询表大适合用exists,表小适合用in
发表于 2017-09-18 09:48:00 回复(1)
最高赞方法二我觉得能简化一下,会更好理解。
SELECT e.emp_no FROM employees e LEFT JOIN dept_manager d ON e.emp_no = d.emp_no WHERE dept_no is NULL
编辑于 2017-10-07 16:47:42 回复(3)