子查询在其父查询处理前求解,它的执行不依赖于父查询的任何条件,每个子查询仅执行一次,子查询的结果集为父查询的where条件所用,这类查询叫做不相关子查询。
但在有的查询中,子查询的执行依赖于父查询的某个条件,子查询不止执行一次。这类子查询的查询条件往往依赖于其父查询的某属性值,称为相关子查询。
在相关子查询中,可使用exists测试查询是否存在返回值。
例如:select eno, ename
from employee e
where exists (select * from item where eno=e.eno);
在上例中,子查询不返回任何数据,只产生逻辑值:子查询结果非空,返回值为真(true);否则返回值为假(false)。
执行该相关子查询的过程是:从外查询的关系(employee)中依次取出一个元组,根据它的eno值在内查询中进行检查,若父查询的where子句为真,则此元组放入结果表;若为假,则舍去。这样反复处理,直至父查询关系的元组全部处理完为止。