目錄
四、結論
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
的速度較快。
指定乙個子查詢,檢測行的存在。
遍歷迴圈外表,檢查外表中的記錄有沒有和內錶的的資料一致的。
匹配得上就放入結果集。
in
和exists
的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in
, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists
。
其實我們區分in
和exists
主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists
,那麼以外層表為驅動表,先被訪問,如果是in
,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係 ,另外in
是不對null
進行處理。
in
是把外表和內錶作hash
連線,而exists
是對外表作loop
迴圈,每次loop
迴圈再對內表進行查詢。一直以來認為exists
比in
效率高的說法是不準確的。
如果查詢語句使用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是把外...