今天在牛客网刷题时,碰见了一道题目,话不多说先上题目。
使用含有关键字exists查找未分配具体部门的员工的所有信息。
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_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
首先,我想到了使用NOT IN来进行子查询,代码如下:
select*
from employees
where emp_no not in
(select emp_no from dept_emp);
用emp_no连接两表,没有在dept_emp中的就是没有分配部门的员工,题目要求才用EXISTS关键字,于是第二种解法如下:
select *
from employees e
where not exists(select *
from dept_emp d
where e.emp_no=d.emp_no );
既然以上两种方法都可以,那么什么时候该用EXISTS,什么时候该用IN呢?
EXISTS和IN的选择
在主表和从表都对关联的列建立索引的前提下:
1.当主表比从表大时,IN查询的效率较高。
2.当从表比主表大时,EXISTS查询的效率较高。
原因如下:
IN是先执行子查询,得到一个结果集,将结果集代入外层谓词条件执行主查询,子查询只需要执行一次
EXISTS是先从主查询中取得一条数据,再代入到子查询中,执行一次子查询,判断子查询是否能返回结果,主查询有多少条数据,子查询就要执行多少次。