关系代数中 GroupBy 和 Have 子句的等价物

Posted

技术标签:

【中文标题】关系代数中 GroupBy 和 Have 子句的等价物【英文标题】:Equivalent of GroupBy and Having clause in Relational Algebra 【发布时间】:2011-10-11 14:52:35 【问题描述】:

我正在做一项作业,我必须将 SQL 查询转换为关系代数查询。我被困在转换 group by 子句中。

谁能告诉我 group by 子句如何写成关系代数?

例如:

SELECT job, sal 
  FROM emp
 GROUP BY job
       ;

谢谢!

【问题讨论】:

那不是有效的 SQL。 sal 需要包含在 GROUP BY 或聚合中。 这将有效地为您提供与离开 group by 相同的效果... 另见***.com/questions/7604969/… @Ben: 不一样:SELECT job, sal FROM emp GROUP BY job, sal; 等价于SELECT DISTINCT job, sal FROM emp;,即注意DISTINCT 关键字。 【参考方案1】:

注意你想得到工资的总和,在Tutorial D:

SUMMARIZE emp BY  job  ADD ( SUM ( sal ) AS total_sal )

注意聚合不是关系运算符,因此不会构成关系代数的一部分。

至于HAVING,是不是历史异常。在 SQL-92 标准之前,不可能在 FROM 子句(也称为派生表)中编写 SELECT 表达式,即您必须在一个 SELECT 表达式中完成所有工作。由于 SQL 的严格评估顺序,在评估 WHERE 子句之后聚合值不存在,即不可能基于聚合值应用限制。 HAVING 被引入来解决这个问题。

但即使使用HAVING,在引入派生表之前,关于 Codd 的 SQL 在关系上仍然不完整。派生表呈现 HAVINGredundant 但使用 HAVING 仍然很流行(如果 *** 可以通过的话):人们似乎仍然喜欢在可能的情况下使用单个 SELECT 以及 SQL 在评估顺序方面的上述刚性(投影是与HAVING 相比,在SELECT 表达式中最后执行)使得派生表的使用非常冗长。

【讨论】:

@Martin Smith:我确实认为HAVING 可能会加剧这种情况,所以我猜这是弗洛伊德的失误:) 现在更正了。【参考方案2】:

首先,您的查询是错误的,除非您使用聚合,否则您无法选择未分组的内容。我假设你想得到萨尔的总和。

job F sum(sal), job(emp).

【讨论】:

是的,我很抱歉。我确实想得到薪水的总和

以上是关于关系代数中 GroupBy 和 Have 子句的等价物的主要内容,如果未能解决你的问题,请参考以下文章

Group By 和 Have 子句描述

LINQ to Sql 左外连接与 Group By 和 Have 子句

计算在JPA中使用“group by”和“have”过滤的行数

SQL Group By and Have 子句和 exists 子句

SQL - 如何在have子句中对结果进行分组和筛选后,如何汇总列?

4.6(select 语句介绍)(简单查询)