大家好,第一次發文章。以後會多多記錄自己的點滴生活。多積累,多學習。 今天給大家分享一篇自己學的的 oracle 中的 exists 用法,如有遺漏,錯誤和疏忽。請大家多多包涵,指正。 Where exists 首先,從網上查詢了很多資料。意思大致如下。 exists 返回值只是標記或者說一個標識的 ...
大家好,第一次發文章。以後會多多記錄自己的點滴生活。多積累,多學習。
今天給大家分享一篇自己學的的 oracle 中的 exists 用法,如有遺漏,錯誤和疏忽。請大家多多包涵,指正。
Where exists
首先,從網上查詢了很多資料。意思大致如下。
exists 返回值只是標記或者說一個標識的意思,並不會返回任何的數據。
Exists 是一個判斷條件。判斷 後續的語句 是否有返回值。有則為true。
返回為 true 的情況下 where 之前的語句則成立。
判斷 後續語句 無返回值 則為 flase
where 之前的語句不成立。也就是不返回值。
第二,用 exists 的相關子查詢
子查詢中的 查詢條件 依賴於外層父查詢的某個屬性值,稱這類查詢為相關子查詢。求解相關子查詢不能像求解不相關子查詢一樣,(這裡,我的理解是不相關子查詢是與父查詢完全獨立的查詢。)。相關子查詢,一定要一條一條,結合出父查詢中的條件,遍歷出結果。
如下為幾個例子。
empp 創建語句為
create table empp as select from emp where deptno=20;
select from emp where exists (select 1 from empp where
emp.deptno=empp.deptno);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 17-JAN-81 800 20
7566 JONES MANAGER 7839 02-MAY-81 2975 20
7788 SCOTT ANALYST 7566 19-MAY-87 3000 20
7876 ADAMS CLERK 7788 23-JUN-87 1100 20
7902 FORD ANALYST 7566 03-JAN-82 3000 20
查詢結果如我們所說。先去找父表(emp)中第一條記錄,然後匹配deptno的值。然後找emp 第二條記錄,知道遍歷完emp表所有的記錄。
這就是我理解的相關子查詢。
另外之前我一直犯傻使用的格式為如下所示,希望大家不要再犯。
select * from emp where exists (select 1 from empp,emp where
emp.deptno=empp.deptno);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 17-JAN-81 800 20
7499 ALLEN SALESMAN 7698 20-MAR-81 1600 300 30
7521 WARD SALESMAN 7698 22-MAR-81 1250 500 30
7566 JONES MANAGER 7839 02-MAY-81 2975 20
7654 MARTIN SALESMAN 7698 28-OCT-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-JUN-81 2850 30
7782 CLARK MANAGER 7839 09-JUL-81 2450 10
7788 SCOTT ANALYST 7566 19-MAY-87 3000 20
7839 KING PRESIDENT 17-DEC-81 5000 10
7844 TURNER SALESMAN 7698 08-OCT-81 1500 0 30
7876 ADAMS CLERK 7788 23-JUN-87 1100 20
7900 JAMES CLERK 7698 03-JAN-82 950 30
7902 FORD ANALYST 7566 03-JAN-82 3000 20
7934 MILLER CLERK 7782 23-FEB-82 1300 10
乍一看我覺得我寫的一點毛病沒有。但是為什麼遍歷出來了所有記錄呢,,最後思索了一下相關子查詢這幾個字。最後反應過來了。我這樣寫完了。exists中是一個完整的子查詢。單獨拿出來是完全可以執行的。因為之前已經說過。exists 是不返回具體的值的。它只負責判斷。判斷後續語句中是否有值,我這樣一寫就變成了不相關子查詢。所以就遍歷了exists前的語句。
所以相關子查詢一定要和父查詢中的條件關聯起來。
最後給一個 相關查詢為空不返回記錄的例子,用做對比。
select * from emp where exists (select 1 from empp where deptno=10);
no rows selected