我正在参加一个关于数据库的在线课程。现在我理解了以下查询
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