作用
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)