SQL中表达式IN的等效关系代数是什么? 我试图翻译这个SQL查询:
SELECT rol, nota FROM notas WHERE rol IN ( SELECT rol FROM estudiantes WHERE ID = 1)
答案 0 :(得分:1)
如果您正在讨论内部子查询,如下所示
SELECT rol FROM estudiantes WHERE ID = 1
等效关系代数将如下所示
∏rol(σ ID = 1 (estudiantes))
σ ID = 1 (estudiantes)
将选择条件为ID = 1
的所有行,其中您正在投影列的子集rol
。
修改强>
如果您想模拟IN
运营商,那么您可以选择equi Join
名为notas
的列上的estudiantes
和rol
表。
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
的公共属性id
和1
的所有属性。
3)生成的关系包含两个表中的所有值,因此您可以简单地投影必需的属性
π rol, nota ( relation containing all values with id=1)
因此我们得到以下关系代数。
π rol, nota ((σ ID = 1 (estudiantes)) ⋈ notas)
希望有帮助。