2016-11-23 33 views
1

我有以下SQL查询:这个SQL查询是否等价于这个关系代数语句?

SELECT foo.a, bar.b, baz.c FROM foo 
INNER JOIN bar ON bar.id = foo.bar_id 
INNER JOIN baz ON baz.id = foo.baz_id 
WHERE foo.z = 50; 

我想知道这是否是相当于这个关系代数语句。

π foo.a, bar.b, baz.c (foo) ⋈ bar.id = foo.bar_id (bar) ⋈ baz.id = foo.baz_id (baz) σ foo.z = 50 
+0

是的。 [这是一组幻灯片](http://www.cs.cornell.edu/projects/btr/bioinformaticsschool/slides/gehrke.pdf),您可以使用它将您的SQL转换为关系代数。 –

+0

“关系代数”有很多种版本。根据我所见过的任何代数,你没有正确使用项目或进行限制。如何在您应该使用的项目中定义项目,限制和连接?请为您的版本提供参考。关系代数的大多数演示都限制和加入了关于*任何关系值*的工作。即没有点。但是dot需要关系变量或常量的名称(例如,您的答案和接受的答案)或其他值以及临时名称(例如SQL)。 – philipxy

+0

你给了那个代数表达式,还是你产生了它? – philipxy

回答

-1

是的,(你的SQL查询)为您的关系声明的表示。

+0

再看看所谓的relatonal代数表达式。看到我的答案。 – philipxy

0
π foo.a, bar.b, baz.c (foo) ⋈ bar.id = foo.bar_id (bar) ⋈ baz.id = foo.baz_id (baz) σ foo.z = 50 

该代数表达式根据关系代数任何共同的版本不被写入。所以我们不能说SQL是等价的。这似乎是你所创造的,而不是你所得到的。

通常我们写:

π attributes (relation) 
σ condition (relation) 

和代数表达式应该被嵌套其中:

π attributes (σ condition (relation)) 

你被允许什么样的条件来写,你是否可以在任何的使用与属性名点你的操作符调用取决于你的代数是如何定义的。使用点要求伴随着传递给操作员的关系值。

直到您给出对您应该使用的代数的引用或描述之后,才能完全回答您的问题。

看来你可能认为你所要做的就是用π替换SELECT,用⋈替换SELECT,用σ替换WHERE。那是错的。