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不存在和子查询的主要内容,如果未能解决你的问题,请参考以下文章