为什么在这些查询中选择的元组数量不同

时间:2019-09-24 16:51:50

标签: sql oracle11g rdbms

我是DBMS和SQL的新手。在练习一些基本查询时,我遇到了这个疑问。希望我能够成功解释它。

假设此查询的结果为null:id="get_id",即表2中的年龄不大于50。

为什么像select * from table2 b where b.age>50;这样的查询会选择select * from table1 a where a.age> all(select b.age from table2 b where b.age>50);中的所有元组

查询:table1选择0个元组。

请解释这些背后的逻辑(可能是从SQL解释器的角度来看)

2 个答案:

答案 0 :(得分:1)

select * from table1 a where a.age > all(select b.age from table2 b where b.age>50);

您的第一个查询从table1获取每个记录,然后检查age是否大于子查询的 all 结果。由于子查询没有结果,因此总是如此。

select * from table1 a where a.age > any(select b.age from table2 b where b.age>50);

您的第二个查询从table1获取每个记录,然后检查age是否大于子查询的任何结果。由于子查询没有结果,因此永远不会如此。

答案 1 :(得分:1)

这是documented behaviour

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

评估为(忽略您不能明确拥有true / false):

select * from table1 a where false; -- or more legally: where 1=0 

,因此不返回任何行;

但是ALL条件的计算结果为true,因为

select * from table1 a where true; -- or more legally: where 1=1

,因此返回所有行。