null扩展在关系查询中意味着什么?

时间:2010-02-16 23:47:07

标签: sql

我正在阅读a paper on SCOPE,它讨论SQL,就像大数据应用程序的查询语义一样。它不遵循SQL如何处理空值并讨论“空扩展”变量,这是我以前没有遇到过的。考虑伪查询

SELECT * FROM DATA WHERE A != B

“对于在B上为空值扩展的行,谓词A!= B是否满足”是什么意思?

1 个答案:

答案 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只有在ScNULL时才能为真 - 否则,Sc将相等到Rc,因为它是如何加入的。换句话说,条件Rc != Sc只能对M2M1的行SQ使用SQ中的列进行空扩展,因为它与任何行都不匹配在{{1}}。

希望能够解决一些困惑。