一、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