sql不存在和子查询

Posted

技术标签:

【中文标题】sql不存在和子查询【英文标题】:sql not exists and subquery 【发布时间】:2012-01-18 07:13:12 【问题描述】:

假设有一个大学数据库

name     |  state | enrollment
=============================
Stanford | CA     | 15000
-----------------------------
Berkley  | CA     | 36000
-----------------------------
MIT      | MA     | 10000
-----------------------------
Cornell  | NY     | 21000

不使用max(),我可以使用exists 运算符和子查询获得最大入学率的大学

select name from college c1 where not exists ( select * from college c2 where c2.enrollment > c1.enrollment);

返回

 Berkeley
(1 row)

如预期的那样

不过,我还是不明白查询是如何工作的。如果子查询返回至少一条记录,则满足exists 条件。因此,在上面,只有当子查询返回一个空集时,才会满足not exists。或者我​​认为..

为了检查这个,我尝试运行子查询

select c2.name from college c2,college c1 where c2.enrollment > c1.enrollment);

但这会返回

  name   
----------
 Stanford
 Berkeley
 Berkeley
 Berkeley
 Cornell
 Cornell
(6 rows)

我在这里真的很困惑..有人可以澄清第一个查询是如何工作的以及为什么我在这里错了吗?

【问题讨论】:

【参考方案1】:
select name from college c1 where not exists ( select * from college c2 where 
c2.enrollment > c1.enrollment);

上面的查询查找可以找到注册值的记录>外部查询的当前行。

假设查询以自上而下的顺序运行

    查看斯坦福大学的招生情况并检查是否有任何其他行 招生 > 斯坦福招生。子查询将返回 2 记录(康奈尔和伯克利)。所以,这不会是一场比赛。 查看伯克利注册并检查是否有任何其他行有注册>伯克利注册。子查询将返回 0 条记录。因此,NOT EXISTS 条件将为伯克利返回 true。

【讨论】:

【参考方案2】:

这相当简单 - 查询状态是“给我找一所没有其他大学入学率更高的大学”

(注意:如果你有关系,这显然会返回多个结果)

您的查询是说:“给我找一所入学人数高于其他大学的大学”,因此,除了入学人数最低的那一行外,每一行都将被返回(它还将排除最低级别的任何联系) .

【讨论】:

【参考方案3】:

在 jour 交叉连接和应用 WHERE 表达式之后,有时您仍然有不止一行来自 c2 的一行来自 c1。实际上,您在两个查询中做了非常不同的事情。

【讨论】:

【参考方案4】:

Exists 只是测试内部查询是否返回任何行。如果是,则外部查询继续。如果不是,则外部查询不执行,整个 SQL 语句不返回任何内容。

EXISTS 的语法是:

    SELECT "column_name1" FROM "table_name1" WHERE EXISTS(SELECT * FROM "table_name2"
    WHERE [Condition])

由于子查询返回多于 0 行,EXISTS 条件为真,放置在内部查询中的条件不会影响外部查询的运行方式。

【讨论】:

【参考方案5】:

名称

斯坦福 伯克利 伯克利 伯克利 康奈尔 康奈尔

返回的比较顺序如下:

斯坦福 |加利福尼亚州 | 15000

伯克利 |加利福尼亚州 | 36000

麻省理工学院 |马 | 10000

康奈尔 |纽约 | 21000

第一个 C2 将是斯坦福大学,C1 将是所有大学一一 斯坦福不大于它自己, 斯坦福不大于伯克利, 斯坦福大于麻省理工, 斯坦福不比康奈尔大——这结束了第一个循环,给了一个斯坦福

再次在第二种情况下,c2 将是伯克利,C1 将是所有大学 给 3 伯克利 第三种情况没有 第4例单康奈尔

就是这样

【讨论】:

以上是关于sql不存在和子查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL 示例查询解决方案(按技术分组和子查询技术)

sql中的SQL连接和子查询

sql查询语句学习,多表查询和子查询以及连接查询

SQL中,多表连接查询和不相关子查询从查询效率上来说,哪种查询的效果更好?为啥 ?

SQL关联查询 直接join 和子查询的区别

sql99和sql92分别实现连接和子查询和分页查询