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

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