Sql語句中in和exits的區別

2021-10-02 02:27:24 字數 1082 閱讀 3854

"小明"

in(select sname from student)

等同於exists (select * from student where sname=

"小明"

)

這兩個涵數是差不多的, 但是由於優化方案的不同,通常not exists要比not in 要快, 因為not exists可以使用結合演算法,而not in 就不行了,而exists則不如in快, 因為這時候in可能更多的使用結合演算法.

select * from 表 a where exists(select * from 表b where 表b.id=表a.id)

這句相當於

select * from 表 a where id

in(select id from 表b)

區別及應用場景:

in 和 exists的區別: 如果子查詢得出的結果集記錄較少主查詢中的表較大且又有索引時應該用in反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists

其實我們區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵)。如果是exists,那麼以外層表為驅動表,先被訪問;如果是in,那麼先執行子查詢。

所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係了 ,另外in時不對null進行處理。

in 是把外表和內錶作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的。

exists與in的使用效率的問題:

通常情況下採用exists要比in效率高,因為in不走索引,但要看實際情況具體使用: in適合於外表大而內錶小的情況;exists適合於外表小而內錶大的情況。

sql語句中的 和in

今天優化了一段專案中的 的作用就是在使用者表和使用者賬戶表中查出所有有賬戶的使用者,當然查出來的使用者應該是不重複的 distinct一下 這2個表中的記錄大約都為2萬條左右,資料量還是很大的,通過hibernate的轉換出來是這樣的 select from select rownumber ove...

sql語句中的exists和in

比如在northwind資料庫中有乙個查詢為 select c.customerid,companyname from customers c where exists select orderid from orders o where o.customerid c.customerid 這裡面的...

Sql語句中的DDL語句

資料庫模式定義語言ddl data definition language 是用於描述資料庫中要儲存的現實世界實體的語言。主要由create 新增 alter 修改 drop 刪除 和 truncate 刪除 四個關鍵字完成。create database 資料庫名 建立乙個資料庫 create d...