【问题标题】:Comparison with empty set与空集的比较
【发布时间】:2018-10-04 01:23:44
【问题描述】:

我有两个关系 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() 函数是如何处理空集的。

感谢您的帮助!

【问题讨论】:

  • 请仅使用您实际使用的数据库标记您的问题。

标签: mysql sql


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多