我正在做一项作业,我必须将 SQL 查询转换为关系代数查询。我被困在转换group by
条款中。
谁能告诉我如何用关系代数编写 group by 子句?
例如:
SELECT job, sal
FROM emp
GROUP BY job
;
谢谢!
我正在做一项作业,我必须将 SQL 查询转换为关系代数查询。我被困在转换group by
条款中。
谁能告诉我如何用关系代数编写 group by 子句?
例如:
SELECT job, sal
FROM emp
GROUP BY job
;
谢谢!
注意你想得到工资的总和,在教程 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
.
首先,您的查询是错误的,除非您使用聚合,否则您无法选择未分组的内容。我假设你想得到萨尔的总和。
工作 F 总和(sal),工作(emp)。