假设有以下两个表:
Table1 ( PK1, Attr1 )
Table2 ( PK2, Attr1 )
SQL 语句:
SELECT *
FROM Table1,Table2
结果
(PK1、Table1.Attr1、PK2、Table2.Attr1)。
考虑到查询的以下语义,我无法理解为什么:
Table1 x Table2
以及笛卡尔积的定义。
我还想知道关系代数等价表达式(如果有的话)。
这不是作业,我查了一下没有成功,我提前感谢任何愿意回答我的人。
最佳答案
“一条 SQL 语句: 选择 * 从表1,表2
结果
(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 操作等效的关系代数公式。
关于SQL 到关系代数 - 一个特殊案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19504662/