查看: 2121|回复: 0

[Oracle数据库] oracle 中的exists

发表于 2018-1-10 08:00:01

大家好,第一次发文章。以后会多多记录自己的点滴生活。多积累,多学习。
今天给大家分享一篇自己学的的 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



回复

使用道具 举报