sql - 将某个 SQL 查询转换为关系代数

标签 sql database relational-algebra

正在为我的数据库类(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/

相关文章:

sql - Snowflake 中的断言

c# - 如何防止组合框选择更改事件的重复方法?

SQL 到关系代数 - 一个特殊案例

java - 为什么我的方法没有删除存在的表?

用于查找数据匹配或实体解析误报的 SQL 查询

sql - 是否有将数据库模式(SQL DDL)转储为 XML 的工具?

java - 将ResultSet放入HashMap?

mysql - 如何连接两个表并按第三个表排序?

ruby-on-rails - AREL 代表什么?

sql - 将 sql View 查询更改为关系代数?