好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > SQL查詢中in和exists的區別分析

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

熱門標簽:貴州外呼回撥系統是什么 安陽天音防封電銷卡 智能語音車載電話機器人 智能外呼系統需要多少錢 陽光創信ai外呼獲客系統助力 云南全自動外呼系統公司 衛星地圖標注距離 外呼系統的話術 競圣地圖標注服務

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;iA.length;i++) {
   for(int j=0;jB.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;iA.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)。

您可能感興趣的文章:
  • MySQL exists 和in 詳解及區別
  • mySQL中in查詢與exists查詢的區別小結
  • 安裝mysql出錯”A Windows service with the name MySQL already exists.“如何解決
  • MYSQL IN 與 EXISTS 的優化示例介紹
  • mysql insert if not exists防止插入重復記錄的方法
  • 詳解sql中exists和in的語法與區別

標簽:湘潭 鄂爾多斯 欽州 周口 預約服務 營口 寧夏 河源

巨人網絡通訊聲明:本文標題《SQL查詢中in和exists的區別分析》,本文關鍵詞  SQL,查詢,中,和,exists,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL查詢中in和exists的區別分析》相關的同類信息!
  • 本頁收集關于SQL查詢中in和exists的區別分析的相關信息資訊供網民參考!
  • 推薦文章