在子查询中解释SQL运算符EXISTS?

时间:2013-11-22 14:45:04

标签: sql subquery correlated-subquery

我正在上一本关于数据库的在线课程。 现在我理解以下查询

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

显然我的推理线上存在错误。 你能告诉我它在哪里以及需要纠正的地方。

4 个答案:

答案 0 :(得分:1)

在这种情况下,不需要相关的子查询或类似的东西,我不这么认为。你可以加入大学到大学,那里的州是相同的,大学不是:

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

SQL Fiddle

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

Clicky!

答案 1 :(得分:1)

我不确定你为什么认为你应该得到所有的行,但是我会尝试更好地解释EXISTS,因为你似乎认为它所做的一切都是真的?

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

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

答案 2 :(得分:1)

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

英语大致是

  
    

从学院表中选择列名称和状态,其中有一所学院处于相同状态且名称不同。

  

所以结果很有道理。

答案 3 :(得分:-1)

要获得州内有多个学院的名称,我会这样做。

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