我是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解释器的角度来看)
答案 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)
对于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
,因此返回所有行。