我正在阅读a paper on SCOPE,它讨论SQL,就像大数据应用程序的查询语义一样。它不遵循SQL如何处理空值并讨论“空扩展”变量,这是我以前没有遇到过的。考虑伪查询
SELECT * FROM DATA WHERE A != B
“对于在B上为空值扩展的行,谓词A!= B是否满足”是什么意思?
答案 0 :(得分:3)
术语“null extended”通常用于指代现代DBMS中的集合代数。也就是说,它通过引入NULL
值或者更确切地说是单个通用NULL
值来“扩展”常规关系代数。涉及NULL
的每个谓词都有一个定义的结果,该结果在逻辑上与代数的其余部分一致。
我也看到过这个术语用来指外连接。例如,此查询:
SELECT A.id, A.name AS NameA, B.name AS NameB
FROM A
LEFT JOIN B
ON B.id = A.id
可能会给你以下结果:
id | NameA | NameB
------+-----------+-----------
10 | John | Smith
11 | Jane | Doe
12 | Bob | NULL
这里发生的是,对于id 12,A与来自B的列进行“空扩展”,因为B中没有可用的值。通常,当您对A和B这两个关系执行连接时,如果要在A中包含在B(外连接)中没有匹配元组的元组,那么A必须使用B的属性进行空值扩展形成完整的结果集。
您在引号中输入的这一特定行:
谓词A!= B仅对在B
上为空值扩展的行感到满意
...脱离背景时没有意义。你必须看看整个事情:
SQ = SELECT DISTINCT Sc FROM S WHERE Sa < 20;
M1 = SELECT Ra, Rb, Rc FROM R WHERE Rb < 100;
M2 = SELECT Ra, Rb, Rc, Sc
FROM M1 LEFT OUTER JOIN SQ ON Rc == Sc;
Q = SELECT Ra, Rb FROM M2
WHERE Ra > 5 OR Rc != Sc;
稍后:
未与SQ中的任何行连接的M1行在Sc上为空值扩展。第四个选择(Q)通过应用引用子查询的谓词来计算最终结果。请注意,仅对Sc上为空值扩展的行满足谓词Rc!= Sc。
现在有了一些背景,更容易理解他们想说的话。由于M2中的连接条件为Rc == Sc
,因此条件Rc != Sc
只有在Sc
为NULL
时才能为真 - 否则,Sc
将相等到Rc
,因为它是如何加入的。换句话说,条件Rc != Sc
只能对M2
中M1
的行SQ
使用SQ
中的列进行空扩展,因为它与任何行都不匹配在{{1}}。
希望能够解决一些困惑。