2

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

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

例如:

SELECT job, sal 
  FROM emp
 GROUP BY job
       ;

谢谢!

4

2 回答 2

3

注意你想得到工资的总和,在教程 D中:

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

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

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

但是即使有了HAVING,在引入派生表之前,关于 Codd 的 SQL 在关系上仍然是不完整的。派生表变得HAVING多余但使用HAVING仍然很流行(如果 Stackoverflow 可以通过的话):人们似乎仍然喜欢SELECT在可能的情况下使用单个表,并且 SQL 前面提到的关于评估顺序的刚性(投影在SELECT表达式中最后执行)使得派生表与HAVING.

于 2011-10-13T13:13:04.953 回答
1

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

工作 F 总和(sal),工作(emp)。

于 2011-10-11T15:07:44.573 回答