首先我們來分別用in和exists寫兩個相同的語句:、
in:select * from a sno where in (select sno from b);
exists:
select * from a a where exists(select sno from b b where a.sno=b.sno);
我們先對用in寫的語句進行分析,首先執行應該是執行子查詢,首先將學生會的sno查詢出來將返回sno快取起來,然後通過遍歷student表將所有的sno與子查詢語句查詢到的學生會的sno比較,若相同則選出來,而exists則是將每乙個student中的sno放到子查詢中和學生會中的sno進行比較。
這裡我們進行假設,
當a表有100條資料,b表有10條資料時:
使用in會將b表裡的10條資料先查出來,然後快取起來。然後再將a表中的100條資料和快取中的10條資料一一比較。
而使用where則是將a表中的100條資料,放到子查詢語句中,依次比較是否相同,也就是說這時相比使用in,where多了99次進入b表查詢的時間。
所以,可以得出結論當b錶比a錶小的時候用in的效率更高。
而當a表有10條資料,b表有100條資料時:
使用in會將b表裡的100條資料先查出來,然後快取起來。然後再將a表中的10條資料和快取中的10條資料一一比較。
而使用where則是將a表中的10條資料,放到子查詢語句中,依次比較是否相同。
這時我們使用in的時候會將100條資料進行快取,而使用where則不用快取。當b表大於a表時快取的時間會大於進入b表查詢的時間;所以這個時候使用where的效率更高。
綜上:當a表大於b表時使用in效率更高,而b表大於a表時使用where效率更高。
MySQL中exists與in的使用
exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時 無論記錄行是的多少,只要能返回 條件就為真,返回當前loop到的這條記錄,反之如果exists裡的條 件語句不能返回記錄行,則當前loop到的這條記錄被丟棄,exists的條件...
MySQL中exists與in的使用
總結 當涉及到外表和子查詢時,要考慮到exists和in 的選擇 exists的子句是乙個boolean條件,這個子句當能返回結果集則為true,不能返回結果集則為 false,子句為真所的記錄會被加入結果集,子句為假所的記錄被拋棄結果集為空 in查詢相當於多個or條件的疊加,in查詢就是先將子查詢...
mysql中exists與in的使用
exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當exists裡的條件語句能夠返回記錄行時 無論記錄行是多少,只要能返回 條件就為真,返回當前loop到的這條記錄,反之如果exists裡的條件語句不能返回記錄行,則當前loop到的這條記錄被丟棄,exists的條件就像乙...