正在为我的数据库类(class)做作业,我想仔细检查我的关系代数。
SQL:
SELECT dato, SUM(pris*antall) AS total
FROM produkt, ordre
WHERE ordre.varenr = produkt.varenr
GROUP BY dato
HAVING total >= 10000
关系代数:
σ total >= 10000 (
ρ R(dato, total)(
σ ordre.varenr = produkt.varenr (
dato ℑ SUM(pris*antall (produkt x ordre)
)
)
)
这是正确的吗?
最佳答案
我不知道。其他人也不可能知道。
RA 类(class)通常仅限于选择、预测和连接运算符。 RA 类(class)通常不涵盖聚合。 RA 甚至没有任何(据我所知)聚合的标准方法。
您的类(class)定义的用于对关系进行聚合的运算符是什么?该运算符为其结果生成什么类型的值?有关系吗?还有别的吗?如果还有其他情况,鉴于这些结果值不是关系,但限制仅适用于关系,您的类(class)如何解释对该结果进行关系限制?
从代数角度来说,这种情况以自然连接 (produkt x ordre) 开始。
[结果]此自然连接经过聚合操作。因此,这种自然连接将出现在您为聚合运算符指定关系输入参数的位置。指定聚合所需的其他规范是输出属性名称(总计)以及计算它们的方式(SUM(...))。这些可能会作为“注释”出现在聚合运算符符号旁边的下标中,非常类似于投影上的属性列表和限制上的限制条件。但有关此运算符的任何内容都是特定于类(class)的,因为据我所知,没有任何商定的聚合标准符号。
然后,如果您的聚合运算符定义为返回关系,您可以将聚合结果指定为条件“total>=10000”的限制的输入参数。
关于sql - 将某个 SQL 查询转换为关系代数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12438665/