SQL中exists和in的用法以及區別

2022-09-17 13:21:11 字數 2301 閱讀 3995

目錄

四、結論

in語法為:

select *

from table_name

where col_name in (value1, value2,...);

in操作符允許在where子句中規定多個值。

in查詢相當於多個or條件的疊加,比較好理解。

in查詢就是先將子查詢條件的記錄全都查出來。

in查詢的子條件返回結果必須只有乙個字段。

exists語法為:

select *

from table_a a

where exists (select 1 from table_b b where b.id = b.id);

exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句。

exists裡的條件語句能夠返回記錄行時(無論返回多少記錄行,只要能返回),條件就為真,返回當前loop到的這條記錄。

反之如果exists裡的條件語句不能返回記錄行,則當前loop到的這條記錄被丟棄。

exists的條件就像乙個bool條件,當能返回結果集則為true,不能返回結果集則為false

當子查詢為select null時,mysql仍然認為它是true

確定給定的值是否與子查詢或列表中的值相匹配。

in在查詢的時候,首先查詢子查詢的表,然後將內錶和外表做乙個笛卡爾積,然後按照條件進行篩選。

所以相對內錶比較小的時候,in的速度較快。

指定乙個子查詢,檢測行的存在。

遍歷迴圈外表,檢查外表中的記錄有沒有和內錶的的資料一致的。

匹配得上就放入結果集。

inexists的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists

其實我們區分inexists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是in,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係 ,另外in是不對null進行處理。

in是把外表和內錶作hash連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直以來認為existsin效率高的說法是不準確的。

如果查詢語句使用not in,那麼內外表都進行全表掃瞄,沒有用到索引;

not exists的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。

1. 外層查詢表小於子查詢表,則用exists,外層查詢表大於子查詢表,則用in,如果外層和子查詢表差不多,則愛用哪個用哪個。

2.not exists 比 not in 效率高。

in的遍歷是在記憶體中遍歷。

exists需要查詢資料庫。

查詢資料庫所消耗的效能更高,而記憶體比較快。

參考鏈結1:在mysql裡,有個和in一樣的東東叫做exists,但是它比in更牛叉,你會麼?

參考鏈結2:**mysql中exists與in的使用 (寫的非常好)

參考鏈結3:sql 語句中 in 和 exists 的區別及應用

sql中in和exists的區別

in是把外表和內錶作hash連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢,一直以來認為exists比in效率高的說法是不準確的。如果查詢的兩個表大小相當,那麼用in和exists差別不大 如果兩個表中乙個較小乙個較大,則子查詢表大的用exists,子查詢錶小的用in ...

SQL中in和exists的區別

in和exists in 是把外表和內錶作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。in parm1,parm2.parm是有個數限制的 如果兩個表中乙個較小,乙個是大表,則子查詢表大的用exists,子查詢錶小的用in 例如 表a 小表 表b 大表 1...

sql中exists和in區別

參考文章 1.查詢順序 exists先執行主查詢,再去子查詢中查詢與其對應的結果,如果true則輸出記錄,否則不輸出。in先子查詢產生結果集,然後主查詢去結果集中找符合要求的字段列表,符合要求則輸出記錄,否則不輸出。2.內外表連線方式 exists是對外表做loop迴圈,再對內表進行查詢。in是把外...