Exists
Exists
Exists:如果在 Dictionary 對象中指定的記錄存在,返回 True,若不存在,返回 False。語法object.Exists(key)Exists 有如下幾部分:部分描述Object必需的,始終是一個 Dictionary 對象的名字,Key必需的,在 Dictionary 對象中搜索的 Key 值。
:檢驗查詢否返據。
.* ( =.)
返假, 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)