查询1
select ename,deptno
from emp1
where exists
(select deptno from dpt where dpt.deptno=emp1.deptno AND deptno>20);
返回对应于子查询中deptno字段强加的条件的ename
查询2
select ename,deptno
from emp1
where exists
(select deptno from dpt where deptno>20);
但在查询2中,结果包含字段ename和deptno的所有值
哪些更改了两个查询中的结果集?是否因为加入?实际上,联接如何在查询1中引入不同的结果集?为什么在查询1中而不是在查询2中考虑where条件?
legends:
empname is employee name in the table emp,
deptno is department no. which is the common field in emp and dept tables.
答案 0 :(得分:4)
第一个查询是相关子查询:
Correlated Subquery是一个使用外部值的子查询 查询。 在这种情况下,必须为每一行执行内部查询 外部查询。
select ename,deptno
from emp1
where exists
(select deptno from dpt where dpt.deptno=emp1.deptno AND deptno>20);
您可以将其重写为:
select e.ename, e.deptno
from emp1 e
join dpt d
on d.deptno = e.deptno
where d.deptno > 20;
第二个查询(非相关/简单子查询):
非相关子查询是子查询,独立于外部 查询,它可以独立执行,而不依赖于主外部 查询。
select ename,deptno
from emp1
where exists
(select deptno from dpt where deptno>20);
等同于(如果存在某些子查询):
select ename,deptno
from emp1
where 1 = 1
或者(如果子查询没有返回):
select ename,deptno
from emp1
where 1 = 0