開啟主選單

求真百科

Exists
圖片來自4

計算機語言術語

Exists:如果在 Dictionary 對象中指定的記錄存在,返回 True,若不存在,返回 False。語法object.Exists(key)Exists 有如下幾部分:部分描述Object必需的,始終是一個 Dictionary 對象的名字,Key必需的,在 Dictionary 對象中搜索的 Key 值。

  • 中文名:Exists
  • 外文名:Exists
  • 作 用:檢驗查詢是否返回數據
  • 定 義:存在True,不存在False
  • 與IN的區別:IN是不對NULL進行處理

目錄

作用

EXISTS在SQL中的作用是:檢驗查詢是否返回數據。

使用舉例

select a.* from tb a where exists(select 1 from tb where name =a.name)

返回真假, 當 where 後面的條件成立,則列出數據,否則為空。

exists強調的是是否返回結果集,不要求知道返回什麼。

比如:select name from student where sex = 'm' and mark exists(select 1 from grade where ...)

只要exists引導的子句有結果集返回,那麼exists這個條件就算成立了,大家注意返回的字段始終為1,如果改成「select 2 from grade where ...」,那麼返回的字段就是2,這個數字沒有意義。所以exists子句不在乎返回什麼,而是在乎是不是有結果集返回。

具體效果與使用IN相似

SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND EXISTS (SELECT 『X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = 『MELB')

SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = 『MELB')

這兩句效果一樣。

主要區別

與關鍵詞」IN「的區別

對於IN和EXISTS的性能區別

如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應用in,反之如果外界的主查詢較少,子查詢中的表大,又有索引時使用EXISTS。

其實我們區分IN和EXISTS主要是造成了驅動順序的改變(這是性能的關鍵),如果是EXISTS,那麼以外的外層表為驅動表,先被訪問,如果是IN,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引到索引及結果集的關係了。

另外IN是不對NULL進行處理。

IN:確定給定的值是否與子查詢或列表中的值相匹配。

EXISTS:指定一個子查詢,檢測行的存在。

exist 相當於存在量詞:表示集合存在,也就是集合不為空只作用一個集合。例如 exist P 表示P不空時為真;not exist P表示p為空時為真,in表示一個標量和一元關係的關係。例如:s in P表示當s與P中的某個值相等時 為真; s not in P 表示s與P中的每一個值都不相等時 為真。

in 是把外表和內表作hash join,而exists是對外表作loop,每次loop再對內表進行查詢。

絕對的認為exists比in效率高的說法是不準確的。這要看關聯表的數據量大小。

如果查詢的兩個表大小相當,那麼用in和exists差別不大。

如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。

比較使用 EXISTS 和 IN 的查詢

例如:表A(小表),表B(大表)

1:

select * from A where cc in (select cc from B)

效率低,用到了A表上cc列的索引;

select * from A where exists(select cc from B where cc=A.cc)

效率高,用到了B表上cc列的索引。

相反的

2:

select * from B where cc in (select cc from A)

效率高,用到了B表上cc列的索引;

select * from B where exists(select cc from A where cc=B.cc)

效率低,用到了A表上cc列的索引。

not in 和not exists

如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;

而not exists 的子查詢依然能用到表上的索引。

所以無論哪個表大,用not exists都比not in要快。

in 與 =的區別

select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao';

的結果是相同的。

示例:查詢表1中在表2中是否按FID是否存在。

select * from 表名 T1

where exists

(select FID from 表名 T2 where T1.fid=T2.fid);

視頻

09-exists用法__rec

嗶哩嗶哩

參考文獻