mysql中EXISTS與IN用法比較

2021-10-13 05:07:27 字數 2845 閱讀 7944

1、使用方式:

(1)exists用法

select a.batchname,a.projectid from ucsc_project_batch a where exists (select b.id from ucsc_project b where a.projectid = b.id)

上面這條sql的意思就是:以ucsc_project_batch為主表查詢batchname與projectid欄位,其中projectid欄位存在於ucsc_project表中。

exists 會對外表ucsc_project_batch進行迴圈查詢匹配,它不在乎後面的內錶子查詢的返回值是什麼,只在乎有沒有存在返回值,存在返回值,則條件為真,該條資料匹配成功,加入查詢結果集中;如果沒有返回值,條件為假,丟棄該條資料。

例如我們這裡改變一下子查詢的查詢返回字段,並不影響外查詢的查詢結果:

select a.batchname,a.projectid from ucsc_project_batch a where exists (select b.companyid,b.name from ucsc_project b where a.projectid = b.id)

(2)in用法

select a.batchname,a.projectid from ucsc_project_batch a where a.projectid in (select b.id from ucsc_project b)

上面這條sql的查詢結果與剛才的exists的結果一樣,查詢的意思也一樣。

2、注意點:

(1)exists寫法需要注意子查詢中的條件語句一般需要帶上外查詢的表做關聯,不然子查詢的條件可能會一直為真,或者一直為假,外查詢的表進行迴圈匹配的時候,要麼全部都查詢出來,要麼一條也沒有。

select a.batchname,a.projectid from ucsc_project_batch a where exists (select b.id from ucsc_project b)

比如上述這種寫法,由於ucsc_project 表存在值,子查詢的條件一直為真,ucsc_project_batch 每條資料進行迴圈匹配的時候,都能匹配成功,查詢出來的結果就成為了ucsc_project_batch整張表資料。

select a.batchname,a.projectid from ucsc_project_batch a where exists (select b.id from ucsc_project b where b.id is null)

這種寫法,子查詢肯定查不到結果,所以子查詢的條件為假,外查詢的每條資料匹配失敗,整個查詢結果為空

(2)in語句在mysql中沒有引數個數的限制,但是mysql中sql語句有長度大小限制,整段最大為4m

(3)exists的子查詢語句不在乎查詢的是什麼,只在乎有沒有結果集存在,存在則整個子查詢可以看作乙個條件為真的語句,不然就是乙個條件為假的語句

(4)in語句對於子查詢的返回字段只能由乙個,不然會報錯:

select a.batchname,a.projectid from ucsc_project_batch a where a.projectid in (select b.id,b.companyid from ucsc_project b)

[err] 1241 - operand should contain 1 column(s)

3、場景選擇

外查詢表大,子查詢錶小,選擇in;外查詢錶小,子查詢表大,選擇exists;若兩表差不多大,則差不多。

(1)in中的sql查詢只會查詢一次,然後把結果集存在臨時檔案中,然後再與外層查詢sql進行匹配,其中外查詢與子查詢都可以使用索引

select a.batchname,a.projectid from ucsc_project_batch a where a.projectid in

(select b.id from ucsc_project b)

等價於:

$result =

;$ucsc_project_batch =

"select a.batchname,a.projectid from ucsc_project_batch a"

;$ucsc_project =

"select b.id from ucsc_project b"

;for

($i =

0;$i < $ucsc_project_batch .length;$i++)}

}

(2)exists會對外查詢的表ucsc_project_batch 進行迴圈匹配,執行ucsc_project_batch.length次,其中子查詢可以使用索引,外查詢全表掃瞄

select a.batchname,a.projectid from ucsc_project_batch a where

exists

(select b.id from ucsc_project b where a.projectid = b.id)

等價於:

$result =

;$ucsc_project_batch =

"select a.batchname,a.projectid from ucsc_project_batch a "

;for

($i =

0; $i < $ucsc_project_batch . length; $i++

)}

通過兩個的偽**分析可知:子查詢的表大的時候,使用exists可以有效減少總的迴圈次數來提公升速度;當外查詢的表大的時候,使用in可以有效減少對外查詢表迴圈遍歷來提公升速度。

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