【问题标题】:Relational algebra - recode column values关系代数 - 重新编码列值
【发布时间】:2016-02-03 10:42:27
【问题描述】:

假设我有一个表“动物”,其行代表不同的动物,并且有一列物种可能具有“猫”、“狗”、“马”、“牛”等值。假设我只对该动物是否是狗。在 sql 中(至少在 MySQL 中),我可以进行类似 select (species='dog') as isDog from animals 的查询,为狗返回 1,否则返回 0。我如何在 RA 中表达这一点?它没有选择,因为我们没有限制行。即使我的表达式 (species='dog') 本身不是属性,我可以使用项目运算符吗?或者我应该如何处理这个?

编辑: 我想通过在不存在但基于语句的真值的列上使用项目运算符来实现结果。例如,表动物包含只有一列“物种”的行:猫、狗、马、牛。我需要可以重命名为“isDog”的布尔值,这将导致值 0,1,0,0(1=true,0=false)。我通过选择 (species='dog') as isDog 在 MySQL 中获取此信息,我想知道使用带有 (species='dog') 的项目操作符来选择这样一个动态创建的列是否是有效的 RA,或者是否存在其他方式来处理这个?

【问题讨论】:

  • “关系代数”有很多版本,请给你的参考。
  • 好的,我的实际数据是机密的,我已经为我正在处理的项目创建了 SQL 查询。但现在我应该在报告中报告结果,避免使用“SQL 代码”。更紧凑的数学格式是可以的,所以关系代数应该是可以接受的。但是动物的例子在指出我的问题时仍然有效。我想通过在不存在的列上使用项目运算符来实现结果,而该列是语句的真值的结果。

标签: relational-algebra


【解决方案1】:

TL;DR 要将特定值引入关系代数表达式,您必须有一种编写表文字的方法。通常必要的运算符没有明确表示,但另一方面,代数练习经常使用 some 类型的符号来表示示例值。

对于您使用最简单的附加关系的情况(使用类似于 SQL VALUES 的临时表文字表示法):

    (restrict SPECIES=dog Animals) natural join TABLE{ISDOG}{<1>}
union (restrict SPECIES<>dog Animals) natural join TABLE{ISDOG}{<0>}

如果您想参考带有用于一般计算的运算符的关系代数,请参阅作者 Chris Date 的 EXTEND 运算符和他的经典教科书 An Introduction to Database Systems, 8th Edition。


(更一般地说:要输出包含新列的行的表,其值是输入行中值的任意函数,我们必须能够访问与运算符相对应的表。要么我们使用表文字,要么我们假设一个布尔函数并将其名称用作表名。)

但事实证明,关系模型是这样设计的:

  • 每个代数运算符对应一个特定的逻辑运算符。
    NATURAL JOIN & AND
    RESTRICTtheta & AND@ 987654330@
    UNION & OR
    MINUS & AND NOT
    PROJECTall butC & EXISTS Cetc

  • 每个嵌套代数表达式都对应于某个嵌套逻辑表达式。
    Animals &
    "animal named NAME is AGE years old ... and is of species SPECIES"
    restrict SPECIES=dog Animals&
    "animal named NAME is AGE years old ... and is of species SPECIES" AND SPECIES=dog

  • 命题是一个陈述。 谓词是一个语句模板。如果每个基表都包含从由其列参数化的谓词得出真命题的行,那么查询将保存从由其列参数化的相应谓词得出真命题的行。

    -- table of rows where
        animal named NAME is AGE years old ... and is of species SPECIES
     Animals
    
    -- table of rows where
            animal named NAME is AGE years old ... and is of species SPECIES
        AND if SPECIES=dog then ISDOG=1 ELSE ISDOG=0
    -- ie rows where
            animal named NAME is AGE years old ... and is of species SPECIES
        AND (SPECIES=dog AND ISDOG=1 OR SPECIES<>DOG AND ISDOG=0)
    -- ie rows where
            animal named NAME is AGE years old ... and is of species SPECIES
        AND SPECIES=dog AND ISDOG=1
     OR     animal named NAME is AGE years old ... and is of species SPECIES
        AND SPECIES<>dog AND ISDOG=0
        (restrict SPECIES=dog Animals) natural join TABLE{ISDOG}{<1>}
    union (restrict SPECIES<>dog Animals) natural join TABLE{ISDOG}{<0>}
    
  • 因此,您可以只使用逻辑、工程(包括软件)、科学(包括计算机)和数学中的精确语言来描述您的结果表。

    -- table of rows where
        animal named NAME is AGE years old ... and is of species SPECIES
    AND ISDOG=(if SPECIES=dog then 1 else 0)
    
  • 因此,您可以在规范中使用表格表达式和/或逻辑表达式,以(子)表达式逐个(子)表达式为基础,以更清晰者为准。

        Animals
    natural join
        table of rows where if SPECIES=dog THEN ISDOG=1 ELSE ISDOG=0
    

    (该IF表达式对应的表中每个字符串都有一行,而'dog'行是唯一带1的行。)

    (Nb SQL ON & WHERE 左侧有这种形式的表,右侧有带有函数的谓词。)

  • 代数表达式计算满足其对应逻辑表达式的行。

你可能不清楚是什么 等价关系表达式对应于什么等价逻辑表达式,反之亦然。但重要的是您的客户了解规范中的代数和/或逻辑,并且您的程序员可以编写等效的 SQL 表达式。

  • 与其如此自然地将表示参数的表连接到表示函数的表,您可以 1) 交叉连接每个保存函数结果的单行表,以将参数表限制为给出该结果的行,然后 2)联合交叉连接。

        (restrict SPECIES=dog Animals) natural join TABLE{ISDOG}{<1>}
    union (restrict SPECIES<>dog Animals) natural join TABLE{ISDOG}{<0>}
    

另请参阅:Is multiplication allowed in relational algebra?
重新关联查询:Relational algebra for banking scenario
重新理解关系代数和 SQL 的语义(加上更多链接):Is there any rule of thumb to construct SQL query from a human-readable description?

PS SQL SELECT 做了投影所做的事情,但它也做其他不是投影的事情,这些事情在代数中通过重命名、连接和/或表文字完成。你想要的不是投影。作者 Chris Date 将其称为 EXTEND。我建议任何人使用/参考 Date 的代数。尽管在任意逻辑表达式(wffs 和术语)上添加 RESTRICT/WHERE 和 EXTEND 会引发人们如何以代数方式处理逻辑表达式的问题。该答案解释了/如何始终以代数方式表达给定文字和/或运算符表的逻辑表达式。

【讨论】:

  • 谢谢,很好的回答!我非常想使用选择运算符来 ISDOG=(if SPECIES=dog then 1 else 0) 表达式,我认为这很容易阅读。但我需要得到正确的参考。我打算参考 Elmasri & Navathe: Fundamentals of Database Systems 第 6 版,我在其他地方遵循它的符号。我想我不得不提到这个扩展(并参考 C.J. 日期:数据库系统简介第 8 版)来解释扩展动物添加(如果 SPECIES=dog 则 1 否则 0)AS isDog。或者也许我应该参考 C.J. Dates book..
  • 好的,我会参考Date的Extend。已接受答案,再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2021-07-16
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多