SQL中EXISTS自己的一些用法和理解。

2021-06-26 06:45:24 字數 2901 閱讀 9561

exists 是判斷是否存在,和in類似,但效率要比in高。

平常專案中,用到最平常的地方,就在於判斷檢視,表,儲存過程是否存在。

例如:其還應用於查詢中的匹配,

select * from aaa where exists(aaa中的一些條件,跟相關表進行匹配,最後返回結果集,而exists判斷有無結果解,有就返回true,無就false,從而來帥選aaa的值)

比如在northwind資料庫中有乙個查詢為

select c.customerid,companyname from customers c

where exists(

select orderid from orders o where o.customerid=c.customerid) 

這裡面的exists是如何運作呢?子查詢返回的是orderid欄位,可是外面的查詢要找的是customerid和companyname欄位,這兩個字段肯定不在orderid裡面啊,這是如何匹配的呢? 

exists用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值true或false

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

語法: exists subquery

引數: subquery 是乙個受限的 

select 語句

(不允許有 compute 子句和 into 關鍵字)。

結果型別: boolean 如果子查詢包含行,則返回 true ,否則返回 flase 。

例表a:tablein

例表b:tableex

(一). 在子查詢中使用 null 仍然返回結果集

select * from tablein where exists(select null)

等同於: select * from tablein

(二). 比較使用 exists 和 in 的查詢。注意兩個查詢返回相同的結果。

(三). 比較使用 exists 和 = any 的查詢。注意兩個查詢返回相同的結果。

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 給自己

當需要用到如果資料庫存在就更新,不存在就儲存的情況,可以使用下面這個關鍵字。on duplicate key update 如何判斷這個資料是存在的呢?看這個關鍵字,起初我以為是根據主鍵key來判斷是否存在同乙個資料的,看了一些部落格也是這麼說的。但是在我自己的測試中,我給id設定了主鍵,但是在我希...

SQL中的一些索引

alter table stu modify name varchar 20 unique 改變表中狀態,給表去加個約束 desc stu 檢視表的結構 唯一約束,人稱唯一索引,想要去除唯一約束需要 alter table stu drop index name 去除掉唯一索引 但是增加唯一索引可以...

自己的一些感想

其實寫技術部落格和使用linux系統是自己上大學學習程式設計以來就想開始的兩件事,但一直也沒有下決心去做。剛好現在這兩件事同時發生了,希望自己可以重新開始,把以前想做但沒有做的事情都補上。本來一開始是想在csdn上寫部落格,但是發現註冊的時候我的yahoo郵箱啟用郵件無法收到,無奈只能註冊,後來又發...