EXISTS subquery
subquery
是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。有关更多信息,请参见 Select 中有关子查询的讨论。
Boolean
如果子查询包含行,则返回 TRUE。
说明
EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT ... FROM...), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。
一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。
Exists是子查询的一种条件形式,通过判断Exists的选择表达式(括号内的部分)的结果,如果存在一行或多行结果记录,则Exists整个子查询结果为真,否则为假。由于我们采用Exists来实现子查询,只需要关心是否存在满足条件的记录,所以选择表达式的选择列表采用*来实现,当然,你也可以在选择列表指明具体的某些列,但这些列将在整个搜索过程中被忽略。
Exists实例
![](//pubimage.360doc.com/wz/default.gif)
select Resc_id from dbo.Res_Coach
where EXISTS (select * from Res_Coach where Resc_id is null)![](//pubimage.360doc.com/wz/default.gif)
查询原理:
遍历dbo.Res_Coach每一条,同时处理where条件(EXISTS (select * from Res_Coach where Resc_id=0) 判断结果为true或者false),为true时拿出该条,false时,放弃该条记录。
![](//pubimage.360doc.com/wz/default.gif)
-- 1、 where条件中的子查询和主查询没关系![](//pubimage.360doc.com/wz/default.gif)
select Resc_id![](//pubimage.360doc.com/wz/default.gif)
from dbo.Res_Coach![](//pubimage.360doc.com/wz/default.gif)
where EXISTS (select Rese_id from dbo.Res_Excellent where Rese_id Is null )![](//pubimage.360doc.com/wz/default.gif)
![](//pubimage.360doc.com/wz/default.gif)
-- 2、 where条件中得子查询和主查询有关系![](//pubimage.360doc.com/wz/default.gif)
select Resc_id![](//pubimage.360doc.com/wz/default.gif)
from dbo.Res_Coach![](//pubimage.360doc.com/wz/default.gif)
where EXISTS (select Resc_id from dbo.Res_Coach where Resc_id Is null )![](//pubimage.360doc.com/wz/default.gif)
![](//pubimage.360doc.com/wz/default.gif)
实例备注:不管where条件中得子查询和主查询有没有关系,遍历主查询中得每一条时,判断where条件,exists结果为真,where条件返回true,拿出该条记录,where条件返回false, 不返回该记录。
Exists 和 In 的选择
如果查询的两个表大小相当,那么用in和exists差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in
联系客服