亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL查詢中in和exists的區別分析

2024-08-31 01:00:37
字體:
來源:轉載
供稿:網友

select * from A where id in (select id from B);

select * from A where exists (select 1 from B where A.id=B.id);

對于以上兩種情況,in是在內存里遍歷比較,而exists需要查詢數據庫,所以當B表數據量較大時,exists效率優于in。

1、select * from A where id in (select id from B);

in()只執行一次,它查出B表中的所有id字段并緩存起來。之后,檢查A表的id是否與B表中的id相等,如果相等則將A表的記錄加入結果集中,直到遍歷完A表的所有記錄。
它的查詢過程類似于以下過程:

復制代碼 代碼如下:


List resultSet={};
Array A=(select * from A);
Array B=(select id from B);

for(int i=0;i<A.length;i++) {
   for(int j=0;j<B.length;j++) {
      if(A[i].id==B[j].id) {
         resultSet.add(A[i]);
         break;
      }
   }
}
return resultSet;

可以看出,當B表數據較大時不適合使用in(),因為它會B表數據全部遍歷一次
如:A表有10000條記錄,B表有1000000條記錄,那么最多有可能遍歷10000*1000000次,效率很差。
再如:A表有10000條記錄,B表有100條記錄,那么最多有可能遍歷10000*100次,遍歷次數大大減少,效率大大提升。

結論:in()適合B表比A表數據小的情況

2、select * from A where exists (select 1 from B where A.id=B.id);

exists()會執行A.length次,它并不緩存exists()結果集,因為exists()結果集的內容并不重要,重要的是其內查詢語句的結果集空或者非空,空則返回false,非空則返回true。
它的查詢過程類似于以下過程:

復制代碼 代碼如下:


List resultSet={};
Array A=(select * from A);

for(int i=0;i<A.length;i++) {
   if(exists(A[i].id) {  //執行select 1 from B where B.id=A.id是否有記錄返回
       resultSet.add(A[i]);
   }
}
return resultSet;

當B表比A表數據大時適合使用exists(),因為它沒有那么多遍歷操作,只需要再執行一次查詢就行。
如:A表有10000條記錄,B表有1000000條記錄,那么exists()會執行10000次去判斷A表中的id是否與B表中的id相等。
如:A表有10000條記錄,B表有100000000條記錄,那么exists()還是執行10000次,因為它只執行A.length次,可見B表數據越多,越適合exists()發揮效果。
再如:A表有10000條記錄,B表有100條記錄,那么exists()還是執行10000次,還不如使用in()遍歷10000*100次,因為in()是在內存里遍歷比較,而exists()需要查詢數據庫,我們都知道查詢數據庫所消耗的性能更高,而內存比較很快。

結論:exists()適合B表比A表數據大的情況

當A表數據與B表數據一樣大時,in與exists效率差不多,可任選一個使用。
在插入記錄前,需要檢查這條記錄是否已經存在,只有當記錄不存在時才執行插入操作,可以通過使用 EXISTS 條件句防止插入重復記錄。
insert into A (name,age) select name,age from B where not exists (select 1 from A where A.id=B.id);

EXISTS與IN的使用效率的問題,通常情況下采用exists要比in效率高,因為IN不走索引。但要看實際情況具體使用:IN適合于外表大而內表小的情況;EXISTS適合于外表小而內表大的情況。

關于exists:

EXISTS用于檢查子查詢是否至少會返回一行數據,該子查詢實際上并不返回任何數據,而是返回值True或False。
EXISTS 指定一個子查詢,檢測行的存在。
語法: EXISTS subquery
參數: subquery 是一個受限的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關鍵字)。
結果類型: Boolean 如果子查詢包含行,則返回 TRUE ,否則返回 FLASE 。
結論:select * from A where exists (select 1 from B where A.id=B.id)
EXISTS(包括 NOT EXISTS )子句的返回值是一個boolean值。 EXISTS內部有一個子查詢語句(SELECT ... FROM...), 我將其稱為EXIST的內查詢語句。其內查詢語句返回一個結果集。 EXISTS子句根據其內查詢語句的結果集空或者非空,返回一個布爾值。
一種通俗的可以理解為:將外查詢表的每一行,代入內查詢作為檢驗,如果內查詢返回的結果取非空值,則EXISTS子句返回TRUE,這一行行可作為外查詢的結果行,否則不能作為結果。
分析器會先看語句的第一個詞,當它發現第一個詞是SELECT關鍵字的時候,它會跳到FROM關鍵字,然后通過FROM關鍵字找到表名并把表裝入內存。接著是找WHERE關鍵字,如果找不到則返回到SELECT找字段解析,如果找到WHERE,則分析其中的條件,完成后再回到SELECT分析字段。最后形成一張我們要的虛表。
WHERE關鍵字后面的是條件表達式。條件表達式計算完成后,會有一個返回值,即非0或0,非0即為真(true),0即為假(false)。同理WHERE后面的條件也有一個返回值,真或假,來確定接下來執不執行SELECT。
分析器先找到關鍵字SELECT,然后跳到FROM關鍵字將STUDENT表導入內存,并通過指針找到第一條記錄,接著找到WHERE關鍵字計算它的條件表達式,如果為真那么把這條記錄裝到一個虛表當中,指針再指向下一條記錄。如果為假那么指針直接指向下一條記錄,而不進行其它操作。一直檢索完整個表,并把檢索出來的虛擬表返回給用戶。EXISTS是條件表達式的一部分,它也有一個返回值(true或false)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美极度另类性三渗透| 91精品视频在线免费观看| 91高清视频在线免费观看| 精品久久久久久久久久久久| 国产精品免费福利| 国产丝袜一区视频在线观看| 国产午夜精品理论片a级探花| 国产成人精品视频在线观看| 亚洲精品久久久久久久久久久久| 91麻豆桃色免费看| 久久成人这里只有精品| 国产精品电影一区| 亚洲美女精品成人在线视频| 国产男女猛烈无遮挡91| 久久中文字幕在线视频| 国产精品亚洲自拍| 国产精品美女久久| 国产欧美日韩精品在线观看| 国产精品久久久久久亚洲调教| 亚洲一区二区在线| 91精品在线一区| 亚洲аv电影天堂网| 久久精品久久精品亚洲人| 欧美极品美女视频网站在线观看免费| 欧美国产日韩免费| 九九精品视频在线观看| 色综合久久天天综线观看| 国产精品日韩久久久久| 欧美电影免费观看高清完整| 亚洲综合色激情五月| 欧美成人h版在线观看| 午夜精品久久久久久99热| 国产欧美日韩中文| 久久天堂电影网| 亚洲japanese制服美女| 97在线免费视频| 视频一区视频二区国产精品| 国产免费亚洲高清| 亚洲成人网av| 亚洲区在线播放| 欧美激情精品久久久久久大尺度| 最近更新的2019中文字幕| 亚洲午夜未满十八勿入免费观看全集| 国产一区二区精品丝袜| 国产精品爽黄69天堂a| 一区三区二区视频| 国产日韩中文字幕在线| 亚洲成人精品视频| 97视频在线观看成人| 在线色欧美三级视频| 国产亚洲精品久久久优势| 精品国产一区二区三区四区在线观看| 日韩精品一区二区视频| 久久久久久久久久久成人| 日韩一区二区精品视频| 日韩禁在线播放| 98精品国产自产在线观看| 夜夜嗨av色一区二区不卡| 亚洲一区二区三区视频播放| 久久久免费在线观看| 欧美激情第1页| 97久久超碰福利国产精品…| 日韩美女视频免费在线观看| 日韩在线观看电影| 不卡在线观看电视剧完整版| 欧美一级片久久久久久久| 韩国三级日本三级少妇99| 97视频在线免费观看| 日韩激情第一页| 性亚洲最疯狂xxxx高清| 久久久久久久999精品视频| 91国产精品91| 欧美夜福利tv在线| 日韩av理论片| 日韩激情第一页| 日韩在线观看你懂的| 久久久91精品| 午夜精品视频网站| 性日韩欧美在线视频| 亚洲美女又黄又爽在线观看| 久久国产精品久久久久| 北条麻妃99精品青青久久| 亚洲欧美国产日韩中文字幕| 国产亚洲一区二区在线| 亚洲一级黄色片| 中文字幕亚洲一区| 日韩女优人人人人射在线视频| 久青草国产97香蕉在线视频| 国产精品久久久久久久久久久久| 亚洲高清色综合| 亚洲色图13p| 久久久久久欧美| 中文字幕欧美精品在线| 欧美性猛交xxxx黑人| 国产精品极品在线| 国产成人综合精品| 2019中文在线观看| 国产精品精品视频| 国产精品九九久久久久久久| 97香蕉久久超级碰碰高清版| 成人精品视频在线| 在线观看成人黄色| 国产欧美久久久久久| 亚洲欧美变态国产另类| 国内揄拍国内精品少妇国语| 久久久国产精品视频| 自拍偷拍亚洲欧美| 一夜七次郎国产精品亚洲| 欧美性xxxxxx| 久久精品视频导航| 成人网欧美在线视频| 久久躁狠狠躁夜夜爽| 中文字幕亚洲欧美日韩在线不卡| 日本一区二三区好的精华液| 中文字幕成人在线| 欧美黄色性视频| 欧美性猛交xxxx乱大交极品| 久久久91精品国产一区不卡| 欧美区二区三区| 国产精品揄拍一区二区| 久久久久国产精品www| 国产激情综合五月久久| 中文字幕一区日韩电影| 欧美重口另类videos人妖| 国产成人精品视频| 日韩视频在线观看免费| 久久久999精品免费| 欧美日韩在线看| 欧美孕妇性xx| 色偷偷亚洲男人天堂| 国产成人精品综合| 中文字幕不卡在线视频极品| 亚洲女人天堂av| 日韩av电影在线免费播放| 亚洲国产欧美日韩精品| 久久国内精品一国内精品| 欧洲亚洲女同hd| 亚洲一区二区福利| 日韩av电影免费观看高清| 色www亚洲国产张柏芝| 国产精品黄色av| 精品久久久久久久久中文字幕| 国产成一区二区| 国产精品扒开腿做| 欧美风情在线观看| 91黑丝高跟在线| 97视频免费观看| 亚洲一区二区三区乱码aⅴ| 欧美性猛交xxxx黑人猛交| 欧美日韩福利电影| 在线观看国产精品91| 久久久精品中文字幕| 日韩中文字幕国产| 大桥未久av一区二区三区| 黑人巨大精品欧美一区二区免费| 亚洲精品久久久久国产| 国产精品福利网站| 欧美日韩国产二区| 日韩在线免费av| 欧美日韩在线影院| 国产成人在线精品| 日韩极品精品视频免费观看| 97精品国产97久久久久久免费| 午夜精品99久久免费|