sql優化必會 exists代替in改寫sql

2022-06-21 12:42:14 字數 1942 閱讀 7336

概述

一般在做sql優化的時候講究使用exists帶替代in的做法,理由是exists執行效率要比in高。

個人理解:

in表示範圍,指某一字段在某一範圍之內,這個範圍一般使用子查詢來獲取,由此可知in子查詢返回的結果應該就是這個範圍集。

exists表示存在,指至少存在一處,這個條件由exists子查詢來完成,但是在這裡exists子查詢返回的結果卻不再是乙個結果集,而是乙個布林值(true或false),其實這個挺好理解的,exists就表示如果子查詢能查到值則返回true,則執行exists之前的語句。

測試資料

員工引數課程培訓資料,兩次不同課程培訓分別存在class_a 和 class_b 兩張表中。

class_a:

class_b:

需求:查詢同時參加了兩門課程的員工。

兩種方式實現

下面分別使用in 和 exists兩種方式實現。

1、in 方式查詢

select *from class_awhere id in ( select id from class_b);

2、exists 方式查詢

select *from class_a awhere exists ( select * from class_b b where a.id = b.id);

說明:上述兩種方法查詢結果一樣,但exists 方式速度要快。分析如下:

1)如果連線列id 上有索引,那麼查詢class_b時,無需查詢實際表,僅需要查索引就可以了。

2)使用exists ,那麼只有查到一行資料滿足條件就會終止查詢,不會產生臨時表。

3)使用in查詢時,資料庫首先會執行子查詢,然後將結果儲存在臨時表中,然後掃瞄整個臨時表,很多情況下非常耗費資源。

如何用exists來代替in

假如有乙個表user,它有兩個欄位id和name,要查詢名字中帶a的使用者資訊:

最簡單的sql:select * from user where name like '%a%'; 使用in的sql:select u.* from user u where u.id in (select uu.id from user uu where uu.name like '%a%');

將使用in的sql修改為使用exists的sql該怎麼寫呢?

一開始我直接將u.id in 替換為exists,獲得如下語句 :

select u.* from user u where exists(select uu.id from user uu where uu.name like '%a%');

經過測試發現輸出結果錯誤,該語句將所有的使用者全部乙個不漏的查詢出來了,相信你也發現了問題,後來我對上述語句做了修改如下:

select u.* from user u where exists (select uu.id from user uu where uu.name like '%a%' and uu.id=u.id);

只是在子查詢中新增了「and uu.id=u.id」,結果查詢結果正確。

總結:exists子查詢可以看成是乙個獨立的查詢系統,只為了獲取真假邏輯值,exists子查詢與外查詢查詢的表是兩個完全獨立的毫無關係的表(當第二個表中的name中有包含a的姓名存在,那麼就執行在第乙個表中查詢所有使用者的操作),當我們在子查詢中新增了id關聯之後,exists子查詢與外查詢查詢的表就統一了,是二者組合組建的虛表,是同乙個表(這樣當子查詢查詢到虛表中當前行的uu.name中包含a時,則將虛表當前行中對應的u.id與u.name查詢到了)

所以一切的重點就在這個id關聯之上,新增id關聯,資料庫會先將兩張表通過id關聯組合成一張虛表,所有的查詢操作都在這張虛表上完成,操作的是同一張表,當然就不會出現之前的那種情況了!

總結exists 方式查詢 比 in 方式查詢效率高,但in 可讀性較好。建議盡可能使用exists方式,避免使用子查詢,除非in 的引數為數值列表。

使用exists代替in

select from class a where id in select id from class b select from class a a where exists select from class b b where a.id b.id 分析 上述兩種方法查詢結果一樣,但exist...

SQL優化 Exists和in的效率哪個高

系統要求進行sql優化,對效率比較低的sql進行優化,使其執行效率更高,其中要求對sql中的部分in not in修改為exists not exists 修改方法如下 in的sql語句 select id,category id,htmlfile,title,convert varchar 20 ...

SQL優化 使用關聯查詢代替子查詢

sql優化 使用關聯查詢代替子查詢 測試例子 子查詢 selecta.select workflowname from workflowbase whereid workflowid workflowname from zping.com a where a.operator 402882ed111...