sql - 为什么在这些查询中选择的元组数量不同
问题描述
我是 DBMS 和 SQL 的新手。在练习一些基本查询时,我遇到了这个疑问。
假设此查询的结果为空:select * from table2 b where b.age>50;
即 table2 中没有年龄大于 50。
为什么像select * from table1 a where a.age> all(select b.age from table2 b where b.age>50);
选择所有元组这样的查询table1
而查询:select * from table1 a where a.age> any(select b.age from table2 b where b.age>50);
选择 0 个元组。
这些背后的逻辑是什么(可能从 SQL 解释器的角度来看)?
解决方案
这是记录在案的行为。
对于ANY
(或SOME
),强调添加:
将值与列表中的每个值或查询返回的值进行比较。必须以 =、!=、>、<、<=、>= 开头。后面可以跟任何返回一个或多个值的表达式或子查询。
如果查询不返回任何行,则评估为 FALSE。
对于ALL
:
将值与列表中的每个值或查询返回的值进行比较。必须以 =、!=、>、<、<=、>= 开头。后面可以跟任何返回一个或多个值的表达式或子查询。
如果查询不返回任何行,则评估为 TRUE。
由于子查询没有得到任何行,因此预计ANY
版本的计算结果为 false,因为
select * from table1 a where a.age> all(select b.age from table2 b where b.age>50);
评估为(忽略您不能明确具有真/假):
select * from table1 a where false; -- or more legally: where 1=0
因此不返回任何行;
但是ALL
条件评估为真,因为
select * from table1 a where true; -- or more legally: where 1=1
因此返回所有行。
推荐阅读
- excel - 单击定义为带有 SVG 的 DIV 的按钮,该 SVG 链接到带有 VBA 的路径
- java - 运行 swt java 应用程序时出错
- php - Laravel REST API 请求对象为空
- python - 如何使用pyqt4更改QScrollarea中的滚动条颜色
- firebase - Firebase 列表未在设置状态下更新
- r - 如何根据(元素)选定的相邻列计算重复的行数
- c# - ITextSharp 在词尾添加三个点
- java - 你能用注解构建一个FilterChain吗?
- javascript - Angular build .js 文件的导入与 React .js 冲突
- continuous-integration - 如何在 Cypress 中更改 CI 的环境变量?