exists是用來判斷是否存在的,當exists中的查詢存在結果時則返回真,否則返回假。not exists則相反。
exists做為where 條件時,是先對where 前的主查詢詢進行查詢,然後用主查詢的結果乙個乙個的代入exists的查詢進行判斷,如果為真則輸出當前這一條主查詢的結果,否則不輸出。即exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。而in 是把外表和內錶作hash 連線。因此一直以來認為exists比in效率高的說法是不準確的。
由上分析可以知道如果查詢的兩個表大小相當,那麼用in和exists差別不大;如果兩個表中乙個較小,乙個是大表,則子查詢表大的用exists,子查詢錶小的用in:
現有表a(小表),表b(大表),
select * from a where col in (select col from b);--效率低
select * from a where exists(select 1 from b where col =a.col );--效率高
相反的select * from b where col in (select col from a);--效率高
select * from b where exists(select 1 from a where col =b.col );--效率低
可以說,以上兩個列子,效率高的都是在對b(大表)進行查詢的時候,使用的col列的索引。
另外對於not in 和not exists,如果查詢語句使用了not in 那麼內外表都會進行全表掃瞄,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。
ORACLE 中exist和in的區別
博文 oracle中的exists 和not exists 用法 博文 in與exists語句的效率問題 一 exists sql 返回結果集為真 notexists sql 不返回結果集為真 如下 表a id name 1a1 2a2 3a3 表b id aid name 11b1 22b2 32...
sql中exist與in的區別
in 和 exists也是很好區別的.in 是乙個集合運算子.a in 這個運算中,前面是乙個元素,後面是乙個集合,集合中的元素型別是和前面的元素一樣的.而exists是乙個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.in 運算用在語句中,它後面帶的select 一定是選乙個字段...
sql中exist與in的區別
in 和 exists也是很好區別的.in 是乙個集合運算子.a in 這個運算中,前面是乙個元素,後面是乙個集合,集合中的元素型別是和前面的元素一樣的.而exists是乙個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.in 運算用在語句中,它後面帶的select 一定是選乙個字段...