SQL-Exists与IN用法比较

一、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.csdn.net/qq_34514415/article/details/79599194

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章