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

时间:2011-10-11 14:52:35

标签: mysql sql database group-by relational-algebra

我正在进行一项任务,我必须将SQL查询转换为关系代数查询。我无法转换group by条款。

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

e.g:

SELECT job, sal 
  FROM emp
 GROUP BY job
       ;

谢谢!

2 个答案:

答案 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)。