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