SQL-Exists与IN用法比较

本文探讨了SQL中的EXISTS和IN两种查询方式的用法及效率差异。EXISTS关注是否存在匹配记录,而IN则用于比较指定字段是否在列表中。当表大小相当,两者效率差异不大;若外表大,IN更优;反之,EXISTS更优。文章提供了相关参考资料以供深入研究。

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

一、EXISTS用法说明
EXITS谓词代表 存在量词,带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值TRUE或逻辑假值FALSE。只要EXITS引导的子句有结果集返回,该条件即成立,EXITS不在乎返回的是什么内容,只在乎是否有结果集返回。
如:

select * from customer
where not exists(
  select 0 from customer_goods where customer_id=I)

以及

#表A
ID NAME
1  A1
2  A2
3  A3

#表B
ID  AID  NAME
1   1    B1
2   2    B2
3   2    B3

#表A/B关系是一对多:A.ID --> B.AID
SELECT ID,NAME FROM A
WHERE EXISTS(SELECT * FROM B WHERE A.ID=B.AID)
>>>
>1  A1
>2  A2

可以理解为:

SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 1) 
-->SELECT * FROM B WHERE B.AID = 1有值返回真所以有数据 

SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 2) 
-->SELECT * FROM B WHERE B.AID = 2有值返回真所以有数据 

SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 3) 
-->SELECT * FROM B WHERE B.AID = 3无值返回真所以没有数据 

二、EXISTS与IN 的用法异同
1、IN只能返回一个字段值,但EXITS允许返回多个字段。
2、exists是对外表做loop循环,每次loop循环再对内表做查询;IN是将外表和内表做hash连接,相当于多个or条件叠加。exists需要查询数据库,in是内存里遍历比较。

三、EXISTS与IN 的效率比较
对于表A,表B:

#用法1
select * from a where cc in(select cc from b)
#用法2
select * from a where exists (select * from b where cc=a.cc)

1、若表A/B大小相当,那运行效率差异不大;
2、若表A(外表)更大,则用法1即in()效率更高;
3、若表B(内表)更大,则用法2即exists()效率更高。

参考:
https://www.jianshu.com/p/df614c2c901b
http://www.cnblogs.com/highriver/archive/2011/05/30/2063461.html
https://blog.youkuaiyun.com/qq_34514415/article/details/79599194

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值