子查询中是否存在SQL运算符的解释?

子查询中是否存在SQL运算符的解释?,sql,subquery,correlated-subquery,Sql,Subquery,Correlated Subquery,我正在上一门关于数据库的在线课程。 现在我明白了下面的问题 SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2); 这有点像 从t1中选择第1列,其中为TRUE 但是在谈到EXISTS的子查询时,我陷入了困惑 (学院以(名称、州)为重点。) 以下查询查找在同一州有其他学院的学院的名称 SELECT name,state FROM College C1 WHERE EXISTS (SELECT * FROM College C2

我正在上一门关于数据库的在线课程。 现在我明白了下面的问题

SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
这有点像

从t1中选择第1列,其中为TRUE

但是在谈到EXISTS的子查询时,我陷入了困惑

(学院以(名称、州)为重点。) 以下查询查找在同一州有其他学院的学院的名称

SELECT name,state 
FROM College C1
WHERE EXISTS (SELECT * FROM College C2 
              WHERE C1.state = C2.state and C1.name != C2.name);
子查询将返回一个关系,对吗?因为它位于括号内,所以首先计算它

由于我的工件设计表,返回的关系实际上存在。 因此EXISTS操作符总是返回TRUE,结果是一个包含选定列的完整表

编辑: 对不起,演示不好。这是我的亲戚

Standford CA
Berkley CA
MIT MA
真正的结果是

Standford CA
Berkley CA
但我认为应该是这样

Standford CA
Berkley CA
MIT MA
显然,我的推理有缺陷。
你能告诉我它在哪里以及需要更正的地方吗。

要获得州内不止一所大学的名称,我会这样做

select name, state, records -1 others
from college c1
join (select state st, count(*) records
from college
group by state
having count(*) > 1) temp on state = st

我认为在这种情况下不需要相关子查询或类似的东西。你只需在各州相同而各学院不同的地方加入学院:

SELECT c1.name,c1.state 
FROM College C1,
College C2 
WHERE C1.state = C2.state and C1.name != C2.name

如果您想阅读相关子查询,这里有一个很好的资源:


我不确定您为什么认为应该获取所有行,但我将尝试更好地解释
存在的原因,因为您似乎认为它所做的一切都返回true

EXISTS
运行其查询,如果返回任何行,则返回true;如果返回0行,则返回false*。在您的案例中,您的查询是询问在该州拥有多所学校的所有大学。所以,这就是为什么它不包括麻省理工学院(它只有一所学校)。我将您的查询汇总为上述内容的原因是,您正在对同一个表进行每一行和交叉引用,但这次包括具有相同状态的学校,然后排除正在检查的当前学校

*事实上,select语句是SQL的一个工件,甚至没有执行。通常您会看到人们执行
选择1

SELECT name,state 
FROM College C1
WHERE EXISTS (SELECT * FROM College C2 
              WHERE C1.state = C2.state and C1.name != C2.name);
在英语中是大致相同的

从college表中选择列name和state,其中存在处于相同状态但名称不同的college


所以结果很有道理。

我觉得很好。我假设您已验证是否存在没有其他学院处于相同状态的学院?您正在通过加入C1和C2执行相关子查询,这意味着每行C1执行一次exists查询,这证明这应该与添加演示关系和结果一样有效,谢谢,我可能在安德鲁提供的链接中找到了我问题的答案,所以我把答案归于他。起初,我确实认为子查询是一个独立的一次性查询(就像在操作符中接收来自一次性独立查询的关系一样)。但是,通过链接的资源,实际上相关子查询不像是一次性查询,它更像是逐行检查条件是否存在。