SQL 到关系代数 - 一个特殊案例

标签 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

以及笛卡尔积的定义。

我还想知道关系代数等价表达式(如果有的话)。

这不是作业,我查了一下没有成功,我提前感谢任何愿意回答我的人。

最佳答案

“一条 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/

相关文章:

ruby-on-rails - 当且仅当查询不适用于 Rails 和 Postgres 时,如果包含,则全部关闭

mysql - mysql中如何根据另一个表从一个表中进行select

mysql - 如何引用mysql中同一行的值?

sql - 数据库设计 : replace a boolean column with a timestamp column?

database - 删除相关对象时如何维护外键?

c# - 我的 SQLite 数据库是在哪里创建的?

SQL Server 2008 地理空间查询

数据库 |选择不同的记录

mysql - 选择与另一列的最大/最小值相对应的列(无连接)

arrays - hadoop pig 加入任何匹配的元组值