假设我有一张桌子'动物'它的行代表不同的动物,并且有一些列物种可能具有类似“猫”,“狗”,“马”,“牛”等#39;' cow' ;假设我只对动物是否是狗感兴趣。在sql中(至少在MySQL中),我可以像 select(species =' dog')一样进行查询,如动物的isDog ,为狗返回1,否则返回0。我怎样才能在RA中表达这一点?它没有选择,因为我们不限制行。即使我的表达式(species =' dog')不是这样的属性,我可以使用项目运算符吗?或者我该如何处理?
编辑: 我希望通过在不存在的列上使用项目运算符而实现的结果,而不是基于语句的真值。例如,表动物包含仅有一列“物种”的行。有行:猫,狗,马,牛。我需要可以重命名为' isDog'的布尔值。这将导致值0,1,0,0(1 =真,0 =假)。我通过选择(species =' dog')作为isDog来获取MySQL中的这些信息,我想知道使用项目运算符(物种='狗')是否有效RA选择这样一个动态创建的列,还是有其他方法来处理这个?
答案 0 :(得分:1)
TL; DR 要将特定值引入关系代数表达式,您必须有办法编写表格文字。通常,必要的操作符不是明确的,但另一方面,代数练习经常使用某些类型的符号作为示例值。
对于使用最简单的附加关系(使用类似于SQL VALUES的特殊表文字表示法)的情况:
(restrict SPECIES=dog Animals) natural join TABLE{ISDOG}{<1>}
union (restrict SPECIES<>dog Animals) natural join TABLE{ISDOG}{<0>}
如果您希望使用运算符引用关系代数进行一般计算,请参阅作者Chris Date的EXTEND运算符及其经典教科书“数据库系统简介”,第8版。
(更一般地说:要输出一个包含新列的行的表,其值是输入行中值的任意函数,我们必须能够访问对应于运算符的表。要么我们使用表文字,要么我们假设一个布尔函数并使用其名称作为表名。)
但事实证明,关系模型的设计是为了:
每个代数运算符对应一个逻辑运算符
NATURAL JOIN
&amp; AND
RESTRICT
theta
&amp; AND
theta
UNION
&amp; OR
MINUS
&amp; AND NOT
PROJECT
all but
C
&amp; EXISTS C
etc
每个嵌套代数表达式都对应于某个嵌套逻辑表达式
Animals
&amp;
"animal named NAME is AGE years old ... and is of species SPECIES"
restrict SPECIES=dog Animals
&amp;
"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&amp; 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&amp; terms)上添加RESTRICT / WHERE和EXTEND会引发如何以代数方式处理逻辑表达式的问题。这个答案解释了/如何总是以代数方式表达给定文字和/或运算符表的逻辑表达式。