转换关系代数

时间:2016-02-06 14:57:15

标签: relational-algebra

我有一个表作为外连接的结果,我想在一个属性上使用SUM,但是该属性中的一些元组是NULL。如何将NULL转换为适当的值(在本例中为0)?

我正在阅读的书并没有真正地关注关系代数中的NULL类型,所以我将假设聚合函数不会尝试做“正确的事情”并将null解释为单元。

3 个答案:

答案 0 :(得分:1)

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

SUM,作为其他聚合运算符,忽略NULL值,因此实际上对具有空值的列求和相当于对所有非空值求和,这很可能等同于将NULL视为0。同样,如果您尝试计算数字列的平均值,则只计算非空值,而将总数除以非空值的数量(不是所有值)。

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

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

SELECT AVG(column)
FROM table

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

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

好吧,我解决了。诀窍是使用扩展投影运算符以及选择和并集。

在我的特定情况下,我们想将空值转换为0,我们在这里:

假设关系R

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

在联合的LHS上,我们从R中删除所有出现的q = null。 在RHS上,我们获取q = null的所有元组,并将它们作为pn投影,所有q列值都为0.

袋子语义中的联合可以被认为是加号。