SQL in和exists 比較

來源:互聯網
上載者:User

今天資料庫的課上老師問了個問題說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適合於外表小而內表大的情況。

我們要根據實際的情況做相應的最佳化,不能絕對的說誰的效率高誰的效率低,所有的事都是相對的

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.