牛客网数据库SQL实战10—— 获取所有非manager的员工emp_no

牛客网数据库SQL实战10—— 获取所有非manager的员工emp_no

题目描述

获取所有非manager的员工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`));

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

输入描述:

输出描述:

emp_no
10001
10003
10007
10008
10009
10011

我的解答

not in在实际使用中,因为not in会转化成多表连接,而且不使用索引,一般都会将其转为not exists:

select e.emp_no 
from employees e
where not exists(select 1 from dept_manager d where e.emp_no = d.emp_no)

not in的写法(不推荐):

select e.emp_no 
from employees e
where e.emp_no not in(select d.emp_no from dept_manager d)

注意:所有的not in和in语句都可以用类似的逻辑转化为not exists和exists,可以提高查询效率

我觉得最好的答案

哈哈哈,你们忘记SQL是支持集合运算的吗

SELECT employees.emp_no
FROM salaries
EXCEPT
SELECT dept_manager.emp_no
FROM dept_manager;

    -- EXPECT  集合差运算
 
    -- UNION  集合并运算
 
    -- INTERSECT 集合交运算
发布了175 篇原创文章 · 获赞 58 · 访问量 37万+

猜你喜欢

转载自blog.csdn.net/sunbocong/article/details/105483706