偶遇這樣乙個場景,使用in關鍵字進行檢索資料所消耗的時間是使用exists關鍵字進行檢索資料所消耗的時間的接近30倍。一看差距這麼大,查閱了一本sql資料,其中也沒有介紹多少,不過我們可以從其定義中可以領悟到一些差異。
(1)in關鍵字:該操作符in用於把乙個值與乙個指定列表進行比較,當被比較的值至少與列表中的乙個值相匹配時,它會返回true。
(2)exists關鍵字:該操作符exists用於搜尋指定表裡是否存在滿足特定條件的記錄。
根據這兩個關鍵字作用的描述,可知:若是in子句或者exists子句都是採用select語法檢索出來的結果列表進行匹配的話,那麼在in子句中還要將被比較值與結果列表做進一步的迴圈比較,當in中的被比較值能夠匹配到結果列表中某個值,那麼in子句就會返回true,否則的話就會返回false;而在exists子句中,若select語句檢索的結果值不為空,那麼exists子句直接將該結果集返回,若是檢索的結果值為空的,那麼exists子句就返回空,也就是說exists子句返回的就是select語句返回的結果集,不需要再次做比較判斷了。
--inselect
column1
from
table_name
where some_col in (select column1 from table_name where other_col >'xx
');--exists
select
column1
from
table_name
where
exists (select column1 from table_name where other_col >'xx
');
上述**示例只是乙個象徵性的對比說明,在同乙個表中進行不同條件的多次檢索,使用in的方式:先根據條件檢索出資料,然後some_col與結果列表進行迴圈比較;使用exists的方式:先根據條件檢索出資料,然後將該結果集直接返回,作為最終的資料結果了。由此可見,in和exists子句耗時不在於select檢索的時間,而是在於其自身所消耗的時間。所以在in子句中,若動態的結果集資料量比較大的話,還是建議使用exists子句來替換。
SQL中 IN 與 EXISTS的使用
大家在談到sql優化時,都會說到用exists 代替 in 查詢。現在就談談這兩個的用法。in查詢相當於多個or條件的疊加,這個比較好理解,比如下面的查詢 select from user where userid in 1 2,3 等效於 select from user where userid...
SQL中IN與EXISTS用法的區別
結論為 in 適合b錶比a表資料小的情況 exists 適合b錶比a表資料大的情況 當a表資料與b表資料一樣大時,in與exists效率差不多,可任選乙個使用.舉例 select from emp 基礎表 where empno 0 and exists select x from dept whe...
mysql關鍵字 exists 與 in
在mysql中我們經常會使用到子查詢,而子查詢中裡面就會使用到in與exists。下面我們就來分析一下這兩個關鍵字。1.1 exists 在sql語句中出現exists關鍵字的時候,它先會對外表進行迴圈查詢並且查詢都會檢視exists條件語句是否符合條件。當exists裡的條件語句能夠返回記錄行時,...