关系代数等价于SQL" in"

时间:2014-06-24 18:09:18

标签: sql relational-algebra

SQL中表达式IN的等效关系代数是什么? 我试图翻译这个SQL查询:

SELECT rol, nota FROM notas WHERE rol IN ( SELECT rol FROM estudiantes WHERE ID = 1)

2 个答案:

答案 0 :(得分:1)

如果您正在讨论内部子查询,如下所示

SELECT rol FROM estudiantes WHERE ID = 1

等效关系代数将如下所示

∏rol(σ ID = 1 (estudiantes))

σ ID = 1 (estudiantes)将选择条件为ID = 1的所有行,其中您正在投影列的子集rol

修改

如果您想模拟IN运营商,那么您可以选择equi Join 名为notas的列上的estudiantesrol表。

SELECT rol, nota FROM notas WHERE rol IN 
( 
SELECT rol FROM estudiantes WHERE ID = 1
)

注意事项:显式限定rol列,因为两个关系具有相同的名称。

nota (equi join) estudiantes = 

project notas.rol,nota
(notas equijoin notas.rol = estudiantes.rol select ID = 1(estudiantes))

PS:不知何故,我无法打印像(项目,选择,等连接等)的符号。所以最后把它们写成文本。

答案 1 :(得分:0)

您可以使用join执行此操作。为了简单起见,我使用自然连接。

SELECT rol, nota FROM notas WHERE rol IN ( SELECT rol FROM estudiantes WHERE ID = 1)

这可以表示为使用联接的以下SQL。一旦更改为这种形式,就很容易在关系代数中表示。

SELECT rol, nota FROM (SELECT * from notas NATURAL JOIN estudiantes where ID=1) 

可以在关系代数中用

表示
π rol, nota ((σ ID = 1 (estudiantes)) ⋈  notas)

很抱歉,我无法在需要的地方使用下标。

过程

让我们假设关系包含以下属性     notas(rol,nota,nota2,nota3,...)     estudiantes(id,rol,estudiantes1,estudiantes2,...)

1)将子查询更改为关系代数。我们可以投影rol,但这不是必需的,因为可以使用自然联接而无需投影。

SELECT rol FROM estudiantes WHERE ID = 1
π rol σ ID=1(estudiantes)

2)用notas自然连接新生成的关系(在步骤1中)。如果属性名称不同,则可以使用任何其他联接

(π rol σ ID=1(estudiantes)) ⋈ notas

由于两个关系都包含具有相同名称rol的属性,它将生成如下关系:

(id, rol, nota, notas2, notas3, estudiantes1, estudiantes2, ...)

关系notas与1中的关系相连,该关系仅包含带有id=1的元组。所得关系具有值为rol的公共属性id1的所有属性。

3)生成的关系包含两个表中的所有值,因此您可以简单地投影必需的属性

π rol, nota ( relation containing all values with id=1)

因此我们得到以下关系代数。

π rol, nota ((σ ID = 1 (estudiantes)) ⋈  notas)

希望有帮助。