与空集比较

时间:2018-10-04 01:23:44

标签: mysql sql

我有两个关系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()如果存在空集,将考虑NULL值。在这种情况下,外部查询的where子句中的谓词应求值为UNKNOWN,从而消除了from子句返回的所有元组。

但是,查询正在返回关系A的所有元组作为输出。

请说明all()函数如何处理空集。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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,因为子查询不返回任何行。因此,在这种情况下,此操作不返回任何行。当您的子查询返回任何行时,结果都是相同的。