MySQL中exists與in的使用 對比

2021-08-14 01:11:36 字數 1028 閱讀 7702

exists用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值true或false。

exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時(無論記錄行是的多少,只要能返回),條件就為真,返回當前loop到的這條記錄,反之如果exists裡的條 件語句不能返回記錄行,則當前loop到的這條記錄被丟棄,exists的條件就像乙個bool條件,當能返回結果集則為true,不能返回結果集則為 false

mysql中的in語句是把外表和內錶作hash 連線,而exists語句是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。

如果查詢的兩個表資料量相當,那麼用in和exists差別不大

如果兩個表中乙個資料量較小,乙個是表

資料量大,則子查詢表資料量大的用exists,子查詢表資料量小的用in: 

例如:表waybill_tab (資料量大),表group_members_tab (資料量小)

select * from waybill_tab w where groupid in (select groupid from group_members_tab where userid = 19); 效率高,用到了waybill_tab 表上groupid 列的索引;

select * from waybill_tab w where exists (select 1 from group_members_tab g where g.groupid = w.groupid and g.userid = 19)效率低,用到了group_members_tab 表上groupid列的索引;

in查詢相當於多個or條件的疊加,比如下面的查詢

select * from waybill_tab where groupid in (1, 2, 3);

等效於select * from waybill_tab where groupid = 1 or groupid = 2 or groupid = 3;

not exists 的作用與 exists 正相反

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的條件就像乙...