关系代数中 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 在关系上仍然不完整。派生表呈现 HAVING
redundant 但使用 HAVING
仍然很流行(如果 *** 可以通过的话):人们似乎仍然喜欢在可能的情况下使用单个 SELECT
以及 SQL 在评估顺序方面的上述刚性(投影是与HAVING
相比,在SELECT
表达式中最后执行)使得派生表的使用非常冗长。
【讨论】:
@Martin Smith:我确实认为HAVING
可能会加剧这种情况,所以我猜这是弗洛伊德的失误:) 现在更正了。【参考方案2】:
首先,您的查询是错误的,除非您使用聚合,否则您无法选择未分组的内容。我假设你想得到萨尔的总和。
job F sum(sal), job(emp).
【讨论】:
是的,我很抱歉。我确实想得到薪水的总和以上是关于关系代数中 GroupBy 和 Have 子句的等价物的主要内容,如果未能解决你的问题,请参考以下文章
LINQ to Sql 左外连接与 Group By 和 Have 子句
计算在JPA中使用“group by”和“have”过滤的行数
SQL Group By and Have 子句和 exists 子句