日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Oralce 使用SQL中的exists 和not exists 用法详解

發(fā)布時(shí)間:2025/4/16 数据库 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oralce 使用SQL中的exists 和not exists 用法详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

exists表示() 內(nèi)子查詢返回結(jié)果不為空,說明where條件成立就會(huì)執(zhí)行sql語句;如果為空,表示where條件不成立,sql語句就不會(huì)執(zhí)行。

not exists和? exists相反,子查詢語句結(jié)果為空,則表示where條件成立,執(zhí)行sql語句,負(fù)責(zé)不執(zhí)行sql。

eg:

1.如果部門名稱中含有字母A,則查詢所有員工信息(使用exists) select * from emp where exists (select * from dept where dname like '%A%' and deptno = emp.deptno) temp and deptno=temp.deptno;結(jié)果為:EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-12月-80 800 207499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 307521 WARD SALESMAN 7698 22-2月 -81 1250 500 307566 JONES MANAGER 7839 02-4月 -81 2975 207654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 307698 BLAKE MANAGER 7839 01-5月 -81 2850 307782 CLARK MANAGER 7839 09-6月 -81 2450 107788 SCOTT ANALYST 7566 19-4月 -87 3000 207839 KING PRESIDENT 17-11月-81 5000 107844 TURNER SALESMAN 7698 08-9月 -81 1500 0 307876 ADAMS CLERK 7788 23-5月 -87 1100 20EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------7900 JAMES CLERK 7698 03-12月-81 950 307902 FORD ANALYST 7566 03-12月-81 3000 207934 MILLER CLERK 7782 23-1月 -82 1300 10已選擇14行。2.如果有平均工資不小于1500的部門信息則查詢所有部門信息(使用not exists) select * from dept where not exists (select deptno from emp where deptno = emp.deptno group by deptno having avg(sal) < 1500) and exists (select * from emp where emp.deptno = deptno);

?

?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á)式通常都用*,因?yàn)閹XISTS的子查詢只返回真值或假值,
?? 給出列名無實(shí)際意義。



2、用exists的相關(guān)子查詢
????
????? 明白相關(guān)子查詢:
????? 子查詢的查詢條件依賴于外層父查詢的某個(gè)屬性值,稱這類查詢?yōu)橄嚓P(guān)子查詢。
????? 求解相關(guān)子查詢不能像求解不相關(guān)子查詢那樣,一次將子查詢求解出來,然后求解父查詢。
????? 內(nèi)層查詢由于與外層查詢有關(guān),因此必須反復(fù)求值。
??????
?????? 弄清相關(guān)子查詢處理過程:
?????? 從概念上講,相關(guān)查詢的一般處理過程是:
?????? 首先去外層查詢中表的第1個(gè)元組,根據(jù)它與內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢,
?????? 若WHERE子句返回值為真,則取此元組放入結(jié)果表;然后再取表的下一個(gè)元組;
?????? 重復(fù)這個(gè)過程直到外層表全部檢查完為止。

SQL> select a.ENAME? from? scott.emp awhere exists(select * from? scott.dept b where b.deptno=a.deptno);ENAME----------SMITHALLENWARDJONESMARTINBLAKECLARKSCOTTKINGTURNERADAMSJAMESFORDMILLER查詢到14記錄.相當(dāng)于下sql:select a.ENAME? from? scott.emp awhere a.deptno in (select b.deptno? from? scott.dept b );


exists子查詢實(shí)際是通過關(guān)聯(lián)別的表安某種條件縮小主查詢的范圍。



3、not exists??? 簡(jiǎn)單的理解就是 not exists= not in
????? 實(shí)際not? exists? 取得是不屬于exists限制條件的主表的數(shù)據(jù)集?

SQL>? select a.ENAME? from? scott.emp awhere exists(select * from? scott.dept b where b.deptno=a.deptno and b.deptno=10);ENAME ---------- CLARK KING MILLERselect a.ENAME? from? scott.emp awhere not exists(select * from? scott.dept b where b.deptno=a.deptno and b.deptno=10)ENAME----------SMITHALLENWARDJONESMARTINBLAKESCOTTTURNERADAMSJAMESFORD查詢到11記錄.



4 、exists和in

????? in子句通常用在不相關(guān)子查詢中。通常先執(zhí)行子查詢,將子查詢的結(jié)構(gòu)用于父查詢。
????? 子查詢的查詢條件不依賴于父查詢,這類子查詢稱為不相關(guān)子查詢。
?????
????? 關(guān)鍵字: 在Oracle SQL中取數(shù)據(jù)時(shí)in 和 exists 的區(qū)別?
? 在Oracle SQL中取數(shù)據(jù)時(shí)有時(shí)要用到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 ) t2where t1.x = t2.y;


? 相對(duì)的

? select * from t1 where exists ( select null from t2 where y = x )執(zhí)行的過程相當(dāng)于:for x in ( select * from t1 )loopif ( exists ( select null from t2 where y = x.x ) )thenOUTPUT THE RECORDend ifend loop表 T1 不可避免的要被完全掃描一遍


? 分別適用在什么情況?
? 以子查詢 ( select y from T2 )為考慮方向,如果子查詢的結(jié)果集很大需要消耗很多時(shí)間,
? 但是T1比較小執(zhí)行( select null from t2 where y = x.x )非???#xff0c;那么exists就比較適合用在這里。
? 相對(duì)應(yīng)得子查詢的結(jié)果集比較小的時(shí)候就應(yīng)該使用in.

5、問題: 我創(chuàng)建了一個(gè)表來存放客戶信息,我知道可以用 insert 語句插入信息到表中,
?????????????????? 但是怎么樣才能保證不會(huì)插入重復(fù)的記錄呢?

? 答案: 可以通過使用 EXISTS 條件句防止插入重復(fù)記錄。


? 示例一:插入多條記錄

? 假設(shè)有一個(gè)主鍵為 client_id 的 clients 表,可以使用下面的語句:

? INSERT INTO clients(client_id, client_name, client_type)SELECT supplier_id, supplier_name, 'advertising'FROM suppliersWHERE not exists (select * from clientswhere clients.client_id = suppliers.supplier_id);


?????????????? 個(gè)人批注:not exists不存在,也就是說后面的括號(hào)中只要返回了數(shù)據(jù)那么這個(gè)條件就不存在了,
??????? 可以理解為括號(hào)前的notexists是一個(gè)左表達(dá)式 ,括號(hào)后的查詢是一個(gè)右表達(dá)式,
??????? 只有當(dāng)右表達(dá)式返回的也是not exists(即后面的查詢出來的結(jié)果是非空的)時(shí),等式才成立。




? 示例一:插入單條記錄

? Code:

INSERT INTO clients(client_id, client_name, client_type)SELECT 10345, 'IBM', 'advertising'FROM dualWHERE not exists (select * from clientswhere clients.client_id = 10345);


? 使用 dual 做表名可以讓你在 select 語句后面直接跟上要插入字段的值,即使這些值還不存在當(dāng)前表中。
?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的Oralce 使用SQL中的exists 和not exists 用法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。