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

2021-08-14 09:13:34 字數 5142 閱讀 5845

1樓:匿名使用者

通俗的說

exists是存在於哪張表, 一般都是與子查詢一起使用exists 右邊是單值

in 是把滿足條件的都查出來

in 右邊是單值也可以是多個值

如果不知道什麼時候該用哪個就這樣理解.

2樓:

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

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

}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)。

sql查詢中in和exists有什麼區別?

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

sql關於in和exists的區別?

3樓:匿名使用者

in 確定給定的值是否與子查詢或列表中的值相匹配。

exists

指定一個子查詢,檢測行的存在。

比較使用 exists 和 in 的查詢

exists()後面的子查詢被稱做相關子查詢 他是不返回列表的值的.只是返回一個ture或false的結果,其執行方式是先執行主查詢一次 再去子查詢裡查詢與其對應的結果 如果是ture則輸出,反之則不輸出.再根據主查詢中的每一行去子查詢裡去查詢.

in()後面的子查詢 是返回結果集的,換句話說執行次序和exists()不一樣.子查詢先產生結果集,然後主查詢再去結果集裡去找符合要求的欄位列表去.符合要求的輸出,反之則不輸出.

4樓:

in 其實與等於相似,比如in(1,2) 就是 = 1 or = 2的一種簡單寫法,所以一般在元素少的時候使用in,如果多的話就用exists

exists的用法跟in不一樣,一般都需要和子表進行關聯,而且關聯時,需要用索引,這樣就可以加快速度。

你的sql語句用not exists可以寫成select mc001 from bommc where not exists (select md001 from bommd where bommc.mc001 = bommd.md001)

5樓:綉乞群群

in 是把外表和內表作hash 連線

exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。

那些認為exists比in效率高的人,是不準確的。

如果查詢的兩個表大小相當,那麼用in和exists差別不大。

6樓:匿名使用者

in 的物件是值

exists 不返回值,只驗證

7樓:匿名使用者

md001有空值

試試如下

select mc001 from bommc where mc001 not exists (select md001 from bommd and md001 is not null)

8樓:趙飆茂俊艾

in和exists一般用於select語句的where子句中作為記錄篩選的條件.

in的一般語法格式為:列(或表示式)

in(子查詢),帶in的子查詢只能返回一列值,如果in前面的列(或表示式)和子查詢返回的集合中的一個或一個以上的值相等,則條件為真;如果in前面的列(或表示式)和子查詢返回的集合中的所有值均不相等,則條件為假.

exists子查詢的一般格式為exists(子查詢),如果子查詢包含任何行(有記錄返回),則條件為真;如果子查詢不包含任何行(無記錄返回),則條件為假.由於exists是判斷記錄的有無確定條件是否成立,並不關心返回的是什麼值,因此exists子查詢的目標列通常為*.

sql語句中 in和exist區別

9樓:匿名使用者

in 和 exists也是很好區別的.

in 是一個集合運算子.

a in

這個運算中,前面是一個元素,後面是一個集合,集合中的元素型別是和前面的元素一樣的.

而exists是一個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.

in 運算用在語句中,它後面帶的select 一定是選一個欄位,而不是select *.

比如說你要判斷某班是否存在一個名為"小明"的學生,你可以用in 運算:

"小明" in (select sname from student)

這樣(select sname from student) 返回的是一個全班姓名的集合,in用於判斷"小明"是否為此集合中的一個資料;

同時,你也可以用exists語句:

exists (select * from student where sname="小明")

sql執行錯誤當沒有用EXISTS引入子查詢時在選擇列表中只能指定表示式

因為set fnote 這後面是隻能給一個值得。現在估計有複數個,所以有問題。解決方法如下 1 建立一個臨時表,ifobject id tempdb.tmp1 is not null drop table tmp1 create table tmp1 col1 varchar 50 col2 var...

SQL如何將查詢結果橫排顯示,sql中怎麼讓結果集橫向顯示?

這只是一個合併語句就搞定了。select floor,group contact roomid,as roomid from tablename group by floor 用二個 分隔如得到的結果是 1000 1001如果直接用group contact roomid 則是以,號分隔 如1000...

sql查詢和like的區別,sql語句中的like語句中 和 的區別

很奇怪的現象。07年的時候,資料庫是9.2.0.8,我們資料庫出過1次不可思議的問題,要like才能出來,出不來的怪現象。找了metalink,也覺得是不可能的事情,不了了之。不過,資料庫重啟後,沒有了此現象。試一下這個 where t.ct cd like a like需要萬用字元配合吧 萬用字元...