in 編程
in能夠分爲三類: oop
1、 優化
形如select * from t1 where f1 in ( 'a ', 'b '),應該和如下兩種比較效率 spa
select * from t1 where f1= 'a ' or f1= 'b ' 索引
或者 select * from t1 where f1 = 'a ' union all select * from t1 f1= 'b ' hash
你可能指的不是這一類,這裏不作討論。 io
2、 效率
形如select * from t1 where f1 in (select f1 from t2 where t2.fx= 'x '), select
其中子查詢的where裏的條件不受外層查詢的影響,這類查詢通常狀況下,自動優化會轉成exist語句,也就是效率和exist同樣。 循環
3、
形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),
其中子查詢的where裏的條件受外層查詢的影響,這類查詢的效率要看相關條件涉及的字段的索引狀況和數據量多少,通常認爲效率不如exists.
除了第一類in語句都是能夠轉化成exists 語句的,通常編程習慣應該是用exists而不用in.
A,B兩個表,
(1)當只顯示一個表的數據如A,關係條件只一個如ID時,使用IN更快:
select * from A where id in (select id from B)
(2)當只顯示一個表的數據如A,關係條件不僅一個如ID,col1時,使用IN就不方便了,可使用EXISTS:
select * from A
where exists (select 1 from B where id = A.id and col1 = A.col1)
(3)當只顯示兩個表的數據時,使用IN,EXISTS都不合適,要使用鏈接:
select * from A left join B on id = A.id
因此使用何種方式,要根據要求來定。
exists
exists是用來判斷是否存在的,當exists(查詢)中的查詢存在結果時則返回真,不然返回假。not exists則相反。
exists作爲where 條件時,是先對where前的主查詢詢進行查詢,而後用主查詢的結果一個一個的代入exists的查詢進行判斷,若是爲真則輸出當前這一條主查詢的結果,不然不輸出。
in和exists區別
in 是把外表和內表做hash 鏈接,而exists是對外表做loop循環,每次loop循環再對內表進行查詢。
一直以來認爲exists比in效率高的說法是不許確的。
若是查詢的兩個表大小至關,那麼用in和exists差異不大。
若是兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。
NOT EXISTS,exists的用法跟in不同,通常都須要和子表進行關聯,並且關聯時,須要用索引,這樣就能夠加快速度。
exists 至關於存在量詞:表示集合存在,也就是集合不爲空只做用一個集合。
例如 exist P 表示P不空時爲真; not exist P表示p爲空時爲真。
in表示一個標量和一元關係的關係。
例如:s in P表示當s與P中的某個值相等時 爲真; s not in P 表示s與P中的每個值都不相等時爲真:
not in 和not exists的區別
若是查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;
而not extsts 的子查詢依然能用到表上的索引。
因此不管那個表大,用not exists都比not in要快。