今天資料庫的課上老師問了個問題說in和exists哪個效率高。這我倒真沒研究過只知道in加子查詢效率低,但平時還不時在用。所以我就總結下他們之間的區別
SQL中in可以分為三類:
1、形如select * from t1 where f1 in ('a','b'),應該和以下兩種比較效率
select * from t1 where f1='a' or f1='b'
或者 select * from t1 where f1 ='a' union all select * from t1 f1='b'
你可能指的不是這一類,這裡不做討論。
2、形如select * from t1 where f1 in (select f1 from t2 where t2.fx='x'),
其中子查詢的where裡的條件不受外層查詢的影響,這類查詢一般情況下,自動最佳化會轉成exist語句,也就是效率和exist一樣。
3、形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),
其中子查詢的where裡的條件受外層查詢的影響,這類查詢的效率要看相關條件涉及的欄位的索引情況和資料量多少,一般認為效率不如exists。
除了第一類in語句都是可以轉化成exists 語句的SQL,一般編程習慣應該是用exists而不用in,而很少去考慮in和exists的執行效率.
in和exists的SQL的使用和比較
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
所以使用何種方式,要根據要求來定
IN適合於外表大而內表小的情況;EXISTS適合於外表小而內表大的情況。
我們要根據實際的情況做相應的最佳化,不能絕對的說誰的效率高誰的效率低,所有的事都是相對的