我正在进行一项任务,我必须将SQL查询转换为关系代数查询。我无法转换group by
条款。
有谁能告诉我group by子句如何用关系代数编写?
e.g:
SELECT job, sal
FROM emp
GROUP BY job
;
谢谢!
答案 0 :(得分:3)
注意到你想在Tutorial D中获得薪水总和:
SUMMARIZE emp BY { job } ADD ( SUM ( sal ) AS total_sal )
注意聚合不是关系运算符,因此不会形成关系代数的一部分。
至于HAVING
,这是一个历史异常吗?在SQL-92标准之前,无法在SELECT
子句(a.k.a派生表)中编写FROM
表达式,即您必须在一个SELECT
表达式中完成所有工作。由于SQL的严格评估顺序,在评估WHERE
子句之后,聚合值不会存在,即不可能基于聚合值应用限制。引入HAVING
来解决此问题。
但即使使用HAVING
,在引入派生表之前,SQL在Codd方面仍然是关系不完整的。派生表HAVING
呈现HAVING
多余,但使用SELECT
仍然很受欢迎(如果Stackoverflow可以通过):民间似乎仍然希望尽可能使用单个SELECT
和SQL的上述刚性关于评估顺序(在HAVING
表达式中最后执行投影)使得与{{1}}相比,派生表的使用非常详细。
答案 1 :(得分:1)
首先,您的查询错误,除非您使用聚合,否则无法选择您未分组的内容。我想你想得到萨尔的总和。
工作F sum(sal),job(emp)。