您好,登錄后才能下訂單哦!
1、exists 字面意思存在。
EXISTS里的子查詢結(jié)果集非空,EXISTS()子句的值就是true。
EXISTS里的子查詢結(jié)果集為空,EXISTS()子句的值就是false。
SELECT * FROM SCOTT.EMP WHERE EXISTS(SELECT SYSDATE FROM DUAL);
此句將查出scott.emp表所有內(nèi)容.
SELECT * FROM SCOTT.EMP WHERE EXISTS(SELECT * FROM scott.salgrade where 1=2) ;
返回空結(jié)果集
參考一下論述:
帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true”或邏輯假值“false”。
使用存在量詞EXISTS后,若內(nèi)層查詢結(jié)果非空,則外層的WHERE子句返回真值否則返回假值。
由EXISTS引出的子查詢,其目標(biāo)列表達(dá)式通常都用*,因為帶EXISTS的子查詢只返回真值或假值,
給出列名無實際意義。
2、用exists的相關(guān)子查詢
明白相關(guān)子查詢:
子查詢的查詢條件依賴于外層父查詢的某個屬性值,稱這類查詢?yōu)橄嚓P(guān)子查詢。
求解相關(guān)子查詢不能像求解不相關(guān)子查詢那樣,一次將子查詢求解出來,然后求解父查詢。
內(nèi)層查詢由于與外層查詢有關(guān),因此必須反復(fù)求值。
弄清相關(guān)子查詢處理過程:
從概念上講,相關(guān)查詢的一般處理過程是:
首先去外層查詢中表的第1個元組,根據(jù)它與內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢,
若WHERE子句返回值為真,則取此元組放入結(jié)果表;然后再取表的下一個元組;
重復(fù)這個過程直到外層表全部檢查完為止。
SQL> select a.ENAME from scott.emp a
where exists(select * from scott.dept b where b.deptno=a.deptno);
ENAME
----------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
查詢到14記錄.
相當(dāng)于下sql:
select a.ENAME from scott.emp a
where a.deptno in (select b.deptno from scott.dept b );
exists子查詢實際是通過關(guān)聯(lián)別的表安某種條件縮小主查詢的范圍。
3、not exists 簡單的理解就是 not exists= not in
實際not exists 取得是不屬于exists限制條件的主表的數(shù)據(jù)集
SQL> select a.ENAME from scott.emp a
where exists(select * from scott.dept b where b.deptno=a.deptno and b.deptno=10);
ENAME
----------
CLARK
KING
MILLER
select a.ENAME from scott.emp a
where not exists(select * from scott.dept b where b.deptno=a.deptno and b.deptno=10)
ENAME
----------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
SCOTT
TURNER
ADAMS
JAMES
FORD
查詢到11記錄.
4 、exists和in
in子句通常用在不相關(guān)子查詢中。通常先執(zhí)行子查詢,將子查詢的結(jié)構(gòu)用于父查詢。
子查詢的查詢條件不依賴于父查詢,這類子查詢稱為不相關(guān)子查詢。
關(guān)鍵字: 在Oracle SQL中取數(shù)據(jù)時in 和 exists 的區(qū)別?
在Oracle SQL中取數(shù)據(jù)時有時要用到in 和 exists 那么他們有什么區(qū)別呢?
1 性能上的比較
比如Select * from T1 where x in ( select y from T2 )
執(zhí)行的過程相當(dāng)于:
select *
from t1, ( select distinct y from t2 ) t2
where t1.x = t2.y;
相對的
select * from t1 where exists ( select null from t2 where y = x )
執(zhí)行的過程相當(dāng)于:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x ) )
then
OUTPUT THE RECORD
end if
end loop
表 T1 不可避免的要被完全掃描一遍
分別適用在什么情況?
以子查詢 ( select y from T2 )為考慮方向,如果子查詢的結(jié)果集很大需要消耗很多時間,
但是T1比較小執(zhí)行( select null from t2 where y = x.x )非???,那么exists就比較適合用在這里。
相對應(yīng)得子查詢的結(jié)果集比較小的時候就應(yīng)該使用in.
5、問題: 我創(chuàng)建了一個表來存放客戶信息,我知道可以用 insert 語句插入信息到表中,
但是怎么樣才能保證不會插入重復(fù)的記錄呢?
答案: 可以通過使用 EXISTS 條件句防止插入重復(fù)記錄。
示例一:插入多條記錄
假設(shè)有一個主鍵為 client_id 的 clients 表,可以使用下面的語句:
INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);
個人批注:not exists不存在,也就是說后面的括號中只要返回了數(shù)據(jù)那么這個條件就不存在了,
可以理解為括號前的notexists是一個左表達(dá)式 ,括號后的查詢是一個右表達(dá)式,
只有當(dāng)右表達(dá)式返回的也是not exists(即后面的查詢出來的結(jié)果是非空的)時,等式才成立。
示例一:插入單條記錄
Code:
INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);
使用 dual 做表名可以讓你在 select 語句后面直接跟上要插入字段的值,即使這些值還不存在當(dāng)前表中。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。