Mysql中exists和in使用选择

本文探讨了在SQL查询中如何选择使用EXISTS和IN关键字,通过实例展示了如何找出未分配部门的员工。当主表比从表大时,IN查询效率更高;反之,EXISTS更优。理解这两种方法的性能差异有助于优化数据库查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在牛客网刷题时,碰见了一道题目,话不多说先上题目。

使用含有关键字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先从主查询中取得一条数据,再代入到子查询中,执行一次子查询,判断子查询是否能返回结果,主查询有多少条数据,子查询就要执行多少次。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值