Sql EXISTS如何返回除所有行或无行之外的内容?

Sql EXISTS如何返回除所有行或无行之外的内容?,sql,sql-server,Sql,Sql Server,我是一个开始SQL程序员-我得到了大多数东西,但不存在 在我看来,从文档来看,整个EXISTS语句返回一个布尔值 但是,我看到了一些具体的示例,其中可以使用它并返回表的一部分,而不是全部或全部 SELECT DISTINCT PNAME FROM P WHERE EXISTS ( SELECT * FROM SP Join S ON SP.SNO = S.SNO WHERE SP.PNO = P.PNO AND S.STATUS > 25 ) 此查

我是一个开始SQL程序员-我得到了大多数东西,但不存在

在我看来,从文档来看,整个EXISTS语句返回一个布尔值

但是,我看到了一些具体的示例,其中可以使用它并返回表的一部分,而不是全部或全部

SELECT DISTINCT PNAME
FROM P    
WHERE EXISTS
(
    SELECT *
    FROM SP Join S ON SP.SNO = S.SNO
    WHERE SP.PNO = P.PNO
    AND S.STATUS > 25
)
此查询向我返回一个值,即满足条件(S.Status>25)的值

但是,对于其他查询,如果EXISTS子查询中的一行为true,它似乎会返回我正在选择的整个表


如何控制这一点?

主查询的where子句中的条件

从p中选择不同的PNAME

依赖于生存,, 如果子查询返回任何行, 然后exists返回true,否则返回false
主查询where子句返回p中的所有记录,如果存在,则返回true;如果返回false,则返回nothing

您实际上创建了一个
相关子查询
Exists
谓词接受子查询作为输入,如果子查询返回any行,则返回TRUE,否则返回FALSE

针对表
p
的外部查询没有任何筛选器,因此将考虑EXISTS谓词返回TRUE的该表中的所有行

SELECT DISTINCT PNAME -- Outer Query
FROM P
现在,如果表
p
中的当前行在SP.SNO=S.SNO上的SP Join S中有相关行,则
EXISTS
谓词返回
TRUE
,其中
S.STATUS>25

SELECT *
FROM SP Join S ON SP.SNO = S.SNO
WHERE SP.PNO = P.PNO -- Inner query
AND S.STATUS > 25

使用
EXISTS
谓词的好处之一是,它允许您直观地表达类似英语的查询。例如,此查询可以像您在普通英语中所说的那样阅读:从表
P
中选择所有
unique PNAME
,其中至少存在一行
PNO
等于表SP中的
PNO
,以及表S>25中的
状态,提供的表
SP
S
基于
SNO

子查询(如with EXISTS)进行连接,这些子查询可以是相关的,也可以是非相关的

在您的示例中,您使用了一个相关子查询,这通常是EXISTS的情况。在SP中查找给定P.PNO的记录,即查找每个P记录


如果没有
SP.PNO=p.PNO
,您将有一个不相关的子查询。即子查询不再依赖于P记录。它将为任何P记录返回相同的结果(状态>25或根本不存在)。大多数情况下,这种情况是错误的(人们忘记了将子查询与相关记录关联),但有时需要这样做。

您使用的是哪种SQL语言

要么EXISTS始终返回true或false,要么它始终返回行,但在WHERE EXISTS。。。它将检查返回的行是否大于0(=>true)

Oracle、MySQL、PostreSQL:

EXISTS条件与子查询结合使用,如果子查询返回至少一行,则视为“满足”。 ()


您在Exists块中使用了P.PNO,这意味着您要对SP的每一行进行比较。如果删除此where条件,则它将返回所有数据,即使Exists包含一行,但它将返回true。Exists将评估下一个查询,如果它返回至少一条记录,则它将返回true,否则它将返回false,因此,这取决于您在exists关键字之后的查询,您可以发布使您困惑的其他查询,以解释它如何用于该特定查询。请发布返回整个表数据的
其他查询。。