"小明"
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...