在关系查询中,null是什么意思?

问题描述:

我在阅读a paper on SCOPE,它讨论了大数据应用程序的SQL查询语义。它并不遵循SQL如何处理空值,并讨论了我之前没有遇到的“空扩展”变量。考虑伪查询在关系查询中,null是什么意思?

“谓词A!= B只对B上的空扩展的行满足”是什么意思?

术语“空扩展”通常用于指现代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的属性进行null扩展以形成完整的结果集。


,你把在此报价具体线路:

谓词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)通过应用引用子查询的谓词来计算最终结果。请注意,谓词Rc!= Sc仅适用于在Sc上为空值扩展的行。

现在,在某些情况下,理解他们想说的内容会更容易。由于M2中的连接条件为Rc == Sc,因此条件Rc != Sc只有在ScNULL时才为真 - 否则,Sc将等于Rc,因为这就是它的连接方式。换句话说,条件Rc != Sc只适用于M2中的行,其中M1由于与SQ中的任何行不匹配而被从SQ的列进行空值扩展。

希望能够消除一些混淆。