首页 > 解决方案 > 为什么在这些查询中选择的元组数量不同

问题描述

我是 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 解释器的角度来看)?

标签: sqloracle11grdbms

解决方案


这是记录在案的行为

对于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

因此返回所有行。


推荐阅读