詳見:[url]
select * from a
where id in(select id from b)
以上查詢使用了in語句,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例表a:tablein
例表b:tableex
[img]" alt="" width="163" height="124" border="0[/img]
[img]" alt="" width="221" height="123" border="0[/img]
(一). 在子查詢中使用 null 仍然返回結果集
select * from tablein where exists(select null)
等同於: select * from tablein
[img]" alt="" width="163" height="124" border="0[/img]
(二). 比較使用 exists 和 in 的查詢。注意兩個查詢返回相同的結果。
select * from tablein where exists(select bid from tableex where bname=tablein.aname)
select * from tablein where aname in(select bname from tableex)
[img]" alt="" width="161" height="66" border="0[/img]
(三). 比較使用 exists 和 = any 的查詢。注意兩個查詢返回相同的結果。
select * from tablein where exists(select bid from tableex where bname=tablein.aname)
select * from tablein where aname=any(select bname from tableex)
[img]" alt="" width="161" height="66" border="0[/img]
not exists 的作用與 exists 正好相反。如果子查詢沒有返回行,則滿足了 not exists 中的 where 子句。
結論:exists(包 括 not exists )子句的返回值是乙個bool值。 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)。
在插入記錄前,需要檢查這條記錄是否已經存在,只有當記錄不存在時才執行插入操作,可以通過使用 exists 條件句防止插入重覆記錄。
insert into tablein (aname,a***)
select top 1 '張三', '男' from tablein
where not exists (select * from tablein where tablein.aid = 7)
exists與in的使用效率的問題,通常情況下採用exists要比in效率高,因為in不走索引,但要看實際情況具體使用:
in適合於外表大而內錶小的情況;exists適合於外表小而內錶大的情況。
sql in 和 exist的區別
詳見 select from a where id in select id from b 以上查詢使用了in語句,in 只執行一次,它查出b表中的所有id欄位並快取起來.之後,檢查a表的id是否與b表中的id相等,如果相等則將a表的記錄加入結果集中,直到遍歷完a表的所有記錄.它的查詢過程類似於以下...
sql in和exist的區別和聯絡
exists是用來判斷是否存在的,當exists 查詢 中的查詢存在結果時則返回真,否則返回假。not exists則相反。exists做為where 條件時,是先對where 前的主查詢詢進行查詢,然後用主查詢的結果乙個乙個的代入exists的查詢進行判斷,如果為真則輸出當前這一條主查詢的結果,否...
SQL in和exists的區別 zt
sql in和exists的區別 zt in和exists in 是把外表和內錶作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的。如果查詢的兩個表大小相當,那麼用in和exists差別不大。全文 in和ex...