無論是做專案還是普通使用sql,我們通常都會使用in。因為很好理解,也很方便。但是,面對著多層查詢巢狀,或者in關鍵字裡面的結果集數量巨大,查詢的效率就會直線下降。這時候,我們應該用好exsits。
首先,來乙個簡單的例子。
with score(id,name,subject,score)as(select 0,'張三','數學',88 from dual union all
select 1,'張三','英語',78 from dual union all
select 2,'李四','數學',68 from dual union all
select 3,'李四','英語',98 from dual union all
select 4,'王五','數學',77 from dual union all
select 5,'王五','英語',92 from dual union all
select 6,'趙六','數學',81 from dual union all
select 7,'趙六','英語',75 from dual
),has_phone(name,has_phone)
as(select '張三','有' from dual union all
select '李四','沒有' from dual union all
select '王五','沒有' from dual union all
select '趙六','有' from dual
)--select *
-- from score a
-- where name in (select name from has_phone where has_phone = '有')
select *
from score a
where exists (select 1
from has_phone b
where b.name = a.name
and has_phone = '有')
這段sql的意思是,查詢有手機的同學的成績。
那麼我來理解一下in和exsits的區別吧。
在使用in的時候。
資料庫首先是去在has_phone裡面查詢所有條件為「有」的name。
然後把這些結果集讓每乙個name去匹配。
在使用exsits的時候。
資料庫是先查詢score,然後每個連線條件到exsits裡面進行判斷。
如果為true,則加入結果集,否則就跳過。
exsits執行過程
可以理解為:
for x in (select * from score a)
loop
if(exists(select 1 from has_phone b where b.name = a.name ))
then
output the record;
end if;
end loop;
對於in 和 exists的效能區別:
如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in;
反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists.
其實我們區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,
那麼以外層表為驅動表,先被訪問,如果是in,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,
那麼就會考慮到索引及結果集的關係了
原文:
mysql怎麼用鎖 MySQL的鎖應該怎麼用 一
先說重點 鎖是為了固化資源狀態的,加鎖之後一定會有狀態判斷 或加鎖語句的條件裡含有這個 只加鎖不判斷狀態,那這個鎖就沒啥用。如果你加了鎖,但是後邊並沒有回滾機制,那你就要考慮下你 的邏輯是不是有問題了。要有自檢的功能,第一不能相信使用者,第二不能相信呼叫你函式的其它程式設計師。盡量保證你的 在被重複...
Golang中的select應該怎麼用
1.什麼是select select就是用來監聽和channel有關的io操作,當 io 操作發生時,觸發相應的動作。2.基本用法 select如果有乙個,或者多個io操作可以完成,則golang執行時會隨機選擇乙個執行,否則的話會執行default分支語句,如果沒有定義default的話會一直阻塞...
領域模型vs資料模型,應該怎麼用?
依稀記得我第一次設計乙個系統的時候,畫了一堆uml unified modeling language,統一建模語言 圖,面對class diagram 其實就是領域模型 糾結了好久,不知道如何落地。因為,如果按照這個類圖去落資料庫的話,看起來很奇怪,有點繁瑣。可是不按照這個類圖落庫的話,又不知道這...