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

2021-08-14 09:13:33 字數 5142 閱讀 5155

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="小明")

php 中同時批量執行sql查詢

那就一條一條的寫不就行了啊,一條一條的執行唄 給你貼個查詢語句大全看看有沒有幫助 sql查詢語句大全 語句 功能 1 資料操作 select 從資料庫表中檢索資料行和列insert 向資料庫表新增新資料行delete 從資料庫表中刪除資料行update 更新資料庫表中的資料2 資料定義 create...

SQL查詢資料語句問題,SQL查詢資料語句問題

取n到m行 1.select top m from tablename where id not in select top n id from tablename order by id asc desc 2.select top m into 臨時表 或表變數 from tablename or...

sql查詢指定記錄的條數,sql語句查詢表內資料條數?

sql 使用 count可以統計指定記錄的條數 結合group by 可以統計不同分類的條目數 例子 id name 1 xk 2 kl 3 xk 統計name xk 的條數 select count number from table where name xk 結果number2 關注 upda...