IN和EXISTS區別

1.IN和EXISTS:
EXISTS要遠比IN的效率高。裏面關係到full table scan和range scan。幾乎將所有的IN操作符子查詢改寫爲使用EXISTS的子查詢。
IN 一般都是全表掃描

形如select * from t1 where f1 in (select f1 from t2 where t2.fx='x'),
其中子查詢的where裏的條件不受外層查詢的影響,這類查詢一般情況下,自動優化會轉成exist語句,也就是效率和exist一樣。

形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),
其中子查詢的where裏的條件受外層查詢的影響,這類查詢的效率要看相關條件涉及的字段的索引情況和數據量多少,一般認爲效率不如exists。

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

  所以使用何種方式,要根據要求來定。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章