jsj*_*jsj 5 sql relational-algebra
是否存在与SQL表达式等价的关系代数NOT IN?
例如,如果我有关系:
A1 | A2
----------
x | y
a | b
y | x
Run Code Online (Sandbox Code Playgroud)
我想删除A1在A2中的关系中的所有元组.在SQL中我可能会查询:
SELECT
*
FROM
R
WHERE
R.A1 NOT IN
(
SELECT
A2
FROM
R
)
/
Run Code Online (Sandbox Code Playgroud)
真正让我感到困惑的是如何在关系代数选择算子中进行子查询,这可能吗?:
?这里有一些子查询 R.
在关系代数中,您可以使用carthesian产品来完成此操作.就像是:
R - ?a1,a2(?a11,a21(?A11 = A22(?a11,a21(R)x?a12,a22(R))))
这为您提供了匹配的行.从R中减去此值以查找不匹配的行.
开头的问题让我们产生了错误的想法。它应该是:
\n\n是否存在与 SQL 表达式等价的关系代数R WHERE ... [NOT] IN S?
(也就是说,答案是两个关系之间的某种操作,而不是某种过滤器。)
\n\n答案是肯定的,它是(自然)JOIN又名领结运算符\xe2\x8b\x88。
要了解原因,我们首先整理一下给出的 SQL 解决方案。如图所示,它正在寻找A1 NOT IN与单个 attribute 的关系的attribute A2。这确实是属性名称不匹配。SQL 还允许NOT使用 where 条件。这条SQL让逻辑结构更加清晰:
SELECT * FROM R\nWHERE NOT (A1 IN (SELECT A2 AS A1 FROM R) )\nRun Code Online (Sandbox Code Playgroud)\n\n现在我们可以看到投影和重命名。NOT(根据第一个答案,我们可以将周围环境实现为集合 MINUS。)因此,等效的 RA 是:
R - (R \xe2\x8b\x88 \xcf\x81A1\xe2\x81\x84A2 (\xcf\x80A2(R)))
为了感兴趣,教程 D 是:
\n\nR MINUS (R JOIN (R {A2} RENAME A2 AS A1))\nRun Code Online (Sandbox Code Playgroud)\n\n从问题的提出方式来看,存在 SQL 思维的后遗症。SQLWHERE强制您进入行级“模式”。这与 Codd 规则 7 的要求相反,要求设置一次操作符。
一般来说,带有行级过滤器的SQLWHERE和 RA可以通过一次设置逻辑更简洁地实现为(自然)。(例如,这就是 Date 和 Darwen 在他们的A代数中所做的事情。)\xcf\x83JOIN