oracle 中的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

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐