[size=13.3333px]Where exists
首先,从网上查询了很多资料。意思大致如下。
exists 返回值只是标记或者说一个标识的意思,并不会返回任何的数据。
Exists 是一个判断条件。判断 后续的语句 是否有返回值。有则为true。
返回为 true 的情况下 where 之前的语句则成立。
判断 后续语句 无返回值 则为 flase
where 之前的语句不成立。也就是不返回值。 [size=13.3333px]第二,用 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 [size=13.3333px]
[size=13.3333px] 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
[size=13.3333px]查询结果如我们所说。先去找父表(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 [size=13.3333px]
[size=13.3333px] 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
[size=13.3333px]乍一看我觉得我写的一点毛病没有。但是为什么遍历出来了所有记录呢,,最后思索了一下相关子查询这几个字。最后反应过来了。我这样写完了。exists中是一个完整的子查询。单独拿出来是完全可以执行的。因为之前已经说过。exists 是不返回具体的值的。它只负责判断。判断后续语句中是否有值,我这样一写就变成了不相关子查询。所以就遍历了exists前的语句。
所以相关子查询一定要和父查询中的条件关联起来。
最后给一个 相关查询为空不返回记录的例子,用做对比。
select * from emp where exists (select 1 from empp where deptno=10);
no rows selected
|