代表关系代数中的子查询

时间:2010-10-03 17:36:58

标签: sql relational-algebra

如何在关系代数中表示子查询?我是否将新选择置于先前的选择条件下?

SELECT number
FROM collection
WHERE number = (SELECT anotherNumber FROM anotherStack);

3 个答案:

答案 0 :(得分:8)

您只需将其重写为join

我不确定我在关系代数中学到的语法有多广泛使用。

  1. anotherNumber
  2. 预测anotherStack
  3. 从步骤1的结果中将anotherNumber重命名为number
  4. 自然将第2步的结果加入collection
  5. 从第3步的结果中对number进行最终预测

答案 1 :(得分:1)

答案取决于你的代数包含哪些运算符。半连接运算符在这里最有用。

如果公共属性在两个关系中都被命名为number,则它将是半连接,然后是number的投影。假设一个名为MATCHING的sem-join运算符,按Tutorial D

( collection MATCHING anotherStack ) { number }

发布后,首先需要重命名该属性:

( collection MATCHING ( anotherStack RENAME { anotherNumber AS number } ) { number }

如果可以考虑标准SQL(SQL-92)JOIN,松散地说,关系运算符那么SQL就没有没有半连接。但是,它有几个比较谓词可用于编写半连接运算符,例如MATCH

SELECT number
  FROM collection
 WHERE MATCH (
              SELECT * 
                FROM collection
               WHERE collection.number = anotherNumber.anotherStack
             );

但是,MATCH在现实生活中的SQL产品中并未得到广泛支持,因此半连接通常使用IN (subquery)EXISTS (subquery)编写(我怀疑这就是您命名的原因 - 在你的问题中检查了“子查询”,即术语半连接在SQL从业者中并不为人所知。)


另一种方法是使用交叉运算符(如果可用)。

像(伪代码):

( collection project number ) 
intersect 
( ( anotherStack rename anotherNumber as number ) project number )

在SQL中:

SELECT number
  FROM collection
INTERSECT
SELECT anotherNumber
  FROM anotherStack;

这在现实生活中得到了很好的支持(SQL Server,Oracle,PostgreSQL等,但特别是MySQL)。

答案 2 :(得分:0)

根据this pdf,您可以轻松地将子查询转换为关系代数表达式。

首先,您必须从表单转换整个查询

SELECT Select-list FROM R1 T1, R2 T2, ...
WHERE
some-column = (
    SELECT some-column-from-sub-query from r1 t1, r2 t2, ...
    WHERE extra-where-clause-if-needed)

SELECT Select-list FROM R1 T1, R2 T2, ...
WHERE
EXISTS (
    SELECT some-column-from-sub-query from r1 t1, r2 t2, ...
    WHERE extra-where-clause-if-needed and some-column = some-column-from-sub-query)

然后,您必须先将子查询转换为关系代数。为此,请针对上面给出的子查询:

PI[some-column-from-sub-query](
    SIGMA[extra-where-clause-if-needed 
        ^ some-column = some-column-from-sub-query
        ](RO[T1](R1) x RO[T2](R2) x ... x RO[t1](r1) x RO[t2](r2) x ...)
)

R1, R2...是上下文关系,r1, r2...是子查询关系。

由于语法在堆栈溢出中非常糟糕,请转到that pdf以获取有关如何将子查询转换为关系代数的广泛概述。