日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EXSITS应该怎么用?

發布時間:2024/4/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EXSITS应该怎么用? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

無論是做項目還是普通使用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 awhere exists (select 1from has_phone bwhere b.name = a.nameand 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,那么先執行子查詢,所以我們會以驅動表的快速返回為目標,?
那么就會考慮到索引及結果集的關系了?

原文:http://dacoolbaby.iteye.com/blog/1638990

轉載于:https://www.cnblogs.com/skyapplezhao/p/3796318.html

總結

以上是生活随笔為你收集整理的EXSITS应该怎么用?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。