Exists

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

作用

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 or or or

的結果是相同的。

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

select * from 表名 T1

where exists

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

相關搜尋

熱門詞條

聯絡我們