2

假设有以下两个表:

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

一条 SQL 语句:

SELECT *
FROM Table1,Table2

导致

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

鉴于查询的以下语义,我不明白为什么:

Table1 x Table2

以及笛卡尔积的定义。

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

这不是家庭作业,我查找了这个没有成功,我提前感谢谁会回答我。

4

1 回答 1

2

"一条 SQL 语句:SELECT * FROM Table1,Table2

导致

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

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

(PK1、Attr1、PK2、Attr1)

仔细注意差异。在 SQL 中,这些点限定符及其前面的内容不是结果中属性/列名的一部分。它们是所谓的范围变量的名称,这些变量只存在于它们出现的 SELECT 语句中。一旦 SELECT 语句“终止”,这些范围变量就会消失。您可以通过尝试测试/验证这一点

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

任何符合标准的引擎都应该对此提出错误。一些引擎可能会接受这些东西,因为作者认为这样做是合适的,但您应该意识到,您不能期望任何随机引擎都表现得像这样。

你也可以试试

SELECT Attr1 FROM(您在这里加入);

但是现在每个引擎都应该抱怨列引用不明确。

所以我们回到:该 SQL 语句导致 [带有标题的表]

(PK1、Attr1、PK2、Attr1)。

这绝对不是关系,因此没有任何关系代数的运算可以产生这个东西,因此根本不存在任何与您的 SQL 运算等效的关系代数公式。

于 2013-10-22T13:00:15.360 回答