子查询中SQL运算符EXISTS的解释



我正在参加一个关于数据库的在线课程。现在我理解了以下查询

SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);

有点像

SELECT column1 FROM t1 WHERE 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 c1.name,c1.state 
FROM College C1,
College C2 
WHERE C1.state = C2.state and C1.name != C2.name

SQL Fiddle

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

点击!

我不知道你为什么认为你应该得到所有的行,但我会试着更好地解释EXISTS,因为你似乎认为它所做的只是返回true?

EXISTS运行其查询,如果返回ANY行则返回true,如果返回0行则返回false*。在你的情况下,你的查询是询问在该州拥有多所学校的所有大学。所以,这就是为什么它不包括麻省理工学院(它只有一所学校)。我之所以将您的查询总结为上述含义,是因为您将每一行都与同一个表进行交叉引用,除了这次包括具有相同状态的学校,然后排除当前被检查的学校。

*事实上,select语句是SQL的工件,甚至不会被执行。你经常会看到人们做SELECT 1

SELECT name,state 
FROM College C1
WHERE EXISTS (SELECT * FROM College C2 
              WHERE C1.state = C2.state and C1.name != C2.name);

在英语中大致是

从大学表中选择列名称和州,其中有一所大学处于同一州,但名称不同。

所以这个结果很有道理。

要获得该州有多所大学的名称,我会这样做。

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

相关内容

  • 没有找到相关文章

最新更新