在关系代数中转换 NULL

Converting NULLs in relational algebra

由于外连接,我有一个 table,我想对一个属性求和,但该属性中的某些元组为 NULL。如何将 NULL 转换为适当的值(在本例中为 0)?

我正在阅读的这本书并没有过多地讨论关系代数中的 NULL 类型,所以我假设聚合函数不会尝试执行 "right thing" 和将 null 解释为单位。

在关系数据模型中,NULL值不是普通值,不会根据不同的运算符转换为任何特定值。

SUM 与其他聚合运算符一样,忽略 NULL 值,因此实际上对具有空值的列求和相当于对所有非空值求和,这显然相当于对待 NULL0。同样,如果您尝试计算数字列的平均值,则只会对非空值求和,然后将总数除以非空值的数量(不是所有值)。

另一方面,如果您想以特殊方式考虑空值以进行某些操作,您可以检查它并将其替换为您感兴趣的值。

例如,以下 SQL 查询计算 column 的非空值的 AVG

SELECT AVG(column)
FROM table

而下一个计算 AVGNULL 值视为 0(因此给出与前一个不同的结果):

SELECT AVG(CASE WHEN column IS NULL THEN 0 ELSE column END) 
FROM table

您可以使用MySql的IFNULL()功能:

SELECT 
    AVG(IFNULL(possibleNullValue, 0)) 
FROM 
    table

IFNULL() 将检查表达式 1 是否为空,如果是,则将您提供的值作为第二个表达式 - 在本例中为 0.

如果您不使用 mysql,请参阅其他数据库引擎的等效项 here

好的,我解决了。诀窍是使用扩展投影运算符以及 selection 和 union。

在我的特殊情况下,我们想将空值转换为 0,我们开始:

假设关系 R

R - select(q = null, R) 联合项目(pn, 0 -> q, select(q = null, R))

在并集的 LHS 上,我们从 R 中删除所有出现的 q = null。 在 RHS 上,我们采用所有 q = null 的元组并将它们投影为 pn 并且所有 q 列值均为 0.

bag 语义中的 union 可以认为是加号。