SQL到关系代数 - 一个特例

时间:2013-10-21 21:02:39

标签: sql join relational-database relational-algebra

假设有以下两个表:

Table1 ( PK1, Attr1 )
Table2 ( PK2, Attr1 )

SQL语句:

SELECT *
FROM Table1,Table2

结果

(PK1,Table1.Attr1,PK2,Table2.Attr1)。

考虑到查询的以下语义,我无法理解为什么:

Table1 x Table2

和笛卡尔积的定义。

我也想知道关系代数等价表达式,如果有的话。

这不是家庭作业,我没有成功地抬头看这个,我提前感谢谁回答我。

1 个答案:

答案 0 :(得分:2)

“SQL语句: 选择 * 从表1,表2

结果

(PK1,Table1.Attr1,PK2,Table2.Attr1)。“

不正确。该SQL语句导致[带有标题的表]

(PK1,Attr1,PK2,Attr1)

请注意区别。在SQL中,那些点限定符及其前面的内容是 NOT 结果中属性/列名称的一部分。它们是所谓的范围变量的名称,这些变量仅存在于的SELECT语句中。一旦SELECT语句被“终止”,那些范围变量就会消失。您可以尝试

来测试/验证这一点

SELECT Table1.Attr1 FROM(你在这里加入);

任何符合标准的引擎都应该引发错误。有些引擎可能接受这些东西,因为作者认为这样做是合适的,但你应该意识到你不能指望任何随机引擎表现得像这样。

您也可以尝试

选择Attr1 FROM(你在这里加入);

但是现在每个引擎都应该抱怨含糊不清的列引用。

所以我们回过头来:SQL语句导致[带有标题的表格]

(PK1,Attr1,PK2,Attr1)。

这绝对不是一种关系,因此没有可能产生这种东西的关系代数的运算,因此根本不存在任何与你的SQL运算等价的关系代数公式。