大家在談到sql優化時,都會說到用exists 代替 in 查詢。
現在就談談這兩個的用法。
in查詢相當於多個or條件的疊加,這個比較好理解,比如下面的查詢
select
*from
user
where userid in(1
,2,3
);
等效於
select
*from
user
where userid =
1or userid =
2or userid =
3;
not in 也很好理解,就是多個and != 條件
exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時(無論記錄行是的多少,只要能返回),條件就為真。
舉個例子
select
*from a where
exists
(select id from a)
只要a表不為空,則全部資料都會返回,因為select id from a
作為條件,一直返回true。exists 看的是 bool 值 而不是返回的結果集
所以兩者的替換使用,必須要有這個思想。exists 是判斷條件是否為真, in 後面接的是結果集
例如:a 表:
idname1a
2b3c
4d5e
b表:id
uid112
2334
4使用in查詢時
select
*from a where id in
(select uid from b)
此時會查詢到 1,2,3,4
使用exists查詢
錯誤示範:
select
*from a where
exists
(select uid from b)
此時由於select uid from b
一直返回真,所以會查詢到1,2,3,4,5
正確示範:
select
*from a where
exists
(select uid from b where a.id = b.uid)
當遍歷到第五條時,由於條件為false,查詢返回1,2,3,4 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...
SQL中EXISTS的使用
網上有一些關於exists 說明的例子,但都說的不是很詳細.比如對於著名的供貨商資料庫,查詢 找出 所有零件的 商的 商名,對於這個查詢,網上一些關於exists的說明文章都不能講清楚.我先解釋本文所用的資料庫例子,供貨商 資料庫,共3個表.供貨商表 s s sname 貨物表 p p pname ...
SQL中EXISTS的用法
比如在northwind資料庫中有乙個查詢為 select c.customerid,companyname from customers c where exists select orderid from orders o where o.customerid c.customerid 這裡面的...