与空集比较

brccelvz  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(291)

我有两个关系a和b
表a

Name   Age
------------
Arun    60 
Shreya  24 
Rohit   11

表b

Name    Age
------------
Hari     40
Rohit    20
Karthik  18

select *
from A
where A.Age > all(select B.Age from B where B.Name = 'Arun');

我知道子查询将返回一个空集。我知道 all() 如果存在空集,则将考虑空值。在这种情况下,外部查询的where子句中的 predicate 应计算为unknown,从而消除from子句返回的所有元组。
但是,查询将从关系a返回所有元组作为输出。
请解释all()函数是如何处理空集的。
谢谢你的帮助!

ie3xauqp

ie3xauqp1#

这个 ALL 就是照上面说的做。这是比较 A.age 查询返回的每个值。过滤器通过,如果 A.age 大于的所有值 B.age .
没有值,所以这是真的。
您将空结果集与包含行的结果集混淆 NULL . 这些是不同的东西。
顺便说一句,我通常把这个逻辑写成:

select *
from A
where A.Age > (select max(B.Age) from B where B.Name = 'Arun');

在这种情况下,比较不是一个集合;与标量值进行比较。标量值是 NULL 因为子查询不返回任何行。因此,在这种情况下不返回任何行。当子查询返回任何行时,结果都是相同的。

相关问题