SQL的关系代数等价物;不在「;
在中是否存在SQL表达式的关系代数等价物SQL的关系代数等价物;不在「;,sql,relational-algebra,Sql,Relational Algebra,在中是否存在SQL表达式的关系代数等价物 例如,如果我有以下关系: A1 | A2 ---------- x | y a | b y | x 我想删除关系中A1在A2中的所有元组。在SQL中,我可能会查询: SELECT * FROM R WHERE R.A1 NOT IN ( SELECT A2 FROM R ) / 真正困扰我的是如
例如,如果我有以下关系:
A1 | A2
----------
x | y
a | b
y | x
我想删除关系中A1在A2中的所有元组。在SQL中,我可能会查询:
SELECT
*
FROM
R
WHERE
R.A1 NOT IN
(
SELECT
A2
FROM
R
)
/
真正困扰我的是如何在关系代数选择运算符中进行子查询,这可能吗
σ在关系代数中,您可以使用carthesian乘积来实现某些子查询。比如:
R-ρa1,a2(πa11,a21(σa11=A22)(ρa11,a21(R)xρa12,A22(R)))
- 将R、f.e.列从a1重命名为a11(左侧)和a12(右侧)
- 取R与重命名列的叉积
- 选择a11等于a22的行
- 突出a12和a22,保留a11和a21
- 重命名为a1和a2
这将为您提供匹配的行。从R中减去这个,找出不匹配的行。开头的问题让我们产生了错误的想法。应该是:
是否存在SQL表达式R的关系代数等价物,其中。。。S中的[非]
(也就是说,答案是两个关系之间的某种操作,而不是某种过滤器。)
答案是肯定的,它是(自然的)JOIN
aka领结操作符⋈代码>
为了了解原因,让我们首先整理一下给出的SQL解决方案。如图所示,它正在查找属性A1,而不是在与单个属性A2
的关系中。这确实是属性名称中的错误匹配。SQL还允许在where条件中使用NOT
。此SQL使逻辑结构更清晰:
SELECT * FROM R
WHERE NOT (A1 IN (SELECT A2 AS A1 FROM R) )
现在我们可以看到投影和重命名。(根据第一个答案,周围的不是
我们可以实现为set-减号。)因此等效的RA为:
R-(R)⋈ ρ
A1/A2(π
A2(R))
出于兴趣,教程D为:
R MINUS (R JOIN (R {A2} RENAME A2 AS A1))
在提出问题的方式中,存在着SQL思维的后遗症。SQL的WHERE
强制您进入行级“模式”。这是contra Codd的规则7,要求每次设置运算符
一般来说,SQL的WHERE
和RA的σ
及其行级过滤器可以更简洁地实现为(自然的)JOIN
和set-at-a-time逻辑。(例如,Date&Darwen在他们的A代数中就是这样做的。)一个更一般问题的直接答案:
SELECT
*
FROM
R
WHERE
R.A1 NOT IN
(
SELECT
A2
FROM
S
);
答案是:
R-R "bowtie" [R.A1=S.A2] ("pi" [A2] S )
你能解释一下这是怎么回事吗。。。也许扩大省略号点。我很难理解叉积的结果,在R中只有两个字段,那么如何将pi运算符与两个以上的参数放在一起?如果只有两列,可以省略省略号点。答案在应该使用RHO的地方也使用了PI,不确定这是在编辑中还是在原始答案中。