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查詢語句大全 語句 功能 1 資料操作 select 從資料庫表中檢索資料行和列insert 向資料庫表新增新資料行delete 從資料庫表中刪除資料行update 更新資料庫表中的資料2 資料定義 create... 取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 使用 count可以統計指定記錄的條數 結合group by 可以統計不同分類的條目數 例子 id name 1 xk 2 kl 3 xk 統計name xk 的條數 select count number from table where name xk 結果number2 關注 upda...php 中同時批量執行sql查詢
SQL查詢資料語句問題,SQL查詢資料語句問題
sql查詢指定記錄的條數,sql語句查詢表內資料條數?