1樓:
在用in的子查詢中只能返回一列值,比如 where 成績 in(select 成績,學號 from 成績表) 這種用法是不允許的。exists是一個函式,是根據子查詢有無記錄返回判斷條件的成立,如果子查詢有記錄返回,那麼條件成立,否則不成立,所以子查詢中給出列名無意義的,因此子查詢通常用*返回所有列。還有,就是in的子查詢不需要關聯外部表,exists子查詢通常要關聯外部表。
2樓:匿名使用者
在sql中,同樣的查詢很多情況下,既可以用in的用法來寫,也可以用exists來寫。in寫法比exists的寫法要容易讀,好理解,但是當資料量大的時候,exists的效率要遠高於in的寫法。
3樓:匿名使用者
in是集合查詢,查詢當前記錄的屬性值是否在一個集合中(集合或子查詢)
exist是存在查詢,查詢與當前記錄關聯的集合(子查詢)是否存在記錄
sql查詢中in和exists的區別分析
4樓:匿名使用者
通俗的說
exists是存在於哪張表, 一般都是與子查詢一起使用exists 右邊是單值
in 是把滿足條件的都查出來
in 右邊是單值也可以是多個值
如果不知道什麼時候該用哪個就這樣理解.
5樓:
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的區別? 6樓:匿名使用者 in 確定給定的值是否與子查詢或列表中的值相匹配。 exists 指定一個子查詢,檢測行的存在。 比較使用 exists 和 in 的查詢 exists()後面的子查詢被稱做相關子查詢 他是不返回列表的值的.只是返回一個ture或false的結果,其執行方式是先執行主查詢一次 再去子查詢裡查詢與其對應的結果 如果是ture則輸出,反之則不輸出.再根據主查詢中的每一行去子查詢裡去查詢. in()後面的子查詢 是返回結果集的,換句話說執行次序和exists()不一樣.子查詢先產生結果集,然後主查詢再去結果集裡去找符合要求的欄位列表去.符合要求的輸出,反之則不輸出. 7樓: 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) 8樓:綉乞群群 in 是把外表和內表作hash 連線 exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。 那些認為exists比in效率高的人,是不準確的。 如果查詢的兩個表大小相當,那麼用in和exists差別不大。 9樓:匿名使用者 in 的物件是值 exists 不返回值,只驗證 10樓:匿名使用者 md001有空值 試試如下 select mc001 from bommc where mc001 not exists (select md001 from bommd and md001 is not null) 11樓:趙飆茂俊艾 in和exists一般用於select語句的where子句中作為記錄篩選的條件. in的一般語法格式為:列(或表示式) in(子查詢),帶in的子查詢只能返回一列值,如果in前面的列(或表示式)和子查詢返回的集合中的一個或一個以上的值相等,則條件為真;如果in前面的列(或表示式)和子查詢返回的集合中的所有值均不相等,則條件為假. exists子查詢的一般格式為exists(子查詢),如果子查詢包含任何行(有記錄返回),則條件為真;如果子查詢不包含任何行(無記錄返回),則條件為假.由於exists是判斷記錄的有無確定條件是否成立,並不關心返回的是什麼值,因此exists子查詢的目標列通常為*. select f1 from table1的結果集做為查詢條件迴圈查詢。如 set a select f1 from table1foreach a sql 語句是對資料庫進行操作的一種語言。結構化查詢語言 structured query language 簡稱sql,結構化查詢語言是一種資料庫查... 語法錯誤 bai你在from後面的是一串dusql語句,所以語zhi句後是要加別名的。試試 daoselect sum 總額 回 from select distinct 合同,總額 from table where 專案 aa and型別答 a as tab select sum 總額 from ... 你那個 test 表有 設 主鍵 欄位沒有如果沒有 我就不會搞了 因為如果沒設主鍵 select from test 的顯示順序是 按記錄的插入時間 排的 先插入的排在前面 如果設了主鍵 是按主鍵欄位 升序來 排的 如果有設主鍵 假設為 tid 試下這條語句 select from test sel...sql語句,sql怎麼迴圈查詢,把list中的所有值當做查詢條件,查詢符合這個list的所有的資料
C解析sql語句,C 中 SQL 查詢語句
SQL查詢問題,SQL查詢問題