代数关系型 SQL GROUP BY SORT BY ORDER BY

19

我想知道代数关系中 GROUP BY、SORT BY 和 ORDER BY 的等效语句是什么?

3个回答

24

在关系代数中,这两种操作都不可能实现,但是人们已经为这些操作创建了一些“扩展”(注:在原文中,部分文字是作为下标写的)。

根据数据库系统基础(Elmasri,Navathe 2011年第6版)一书所述,GROUP BY:

另一种无法用基本关系代数表达的请求类型是在数据库中的值集合上指定数学聚合函数。
...
我们可以使用符号ℑ(发音为脚本F)7定义一个AGGREGATE FUNCTION操作,以如下方式指定这些类型的请求:

<grouping attributes> ℑ <function list> (R)

其中 <grouping attributes> 是 R 中指定的关系属性列表,<function list> 是一个由 (<function> <attribute>) 对组成的列表。在每个这样的对中,<function> 是允许使用的函数之一,例如 SUM、AVERAGE、MAXIMUM、MINIMUM、COUNT,而 <attribute> 是 R 指定的关系属性。结果关系具有分组属性以及函数列表中每个元素的一个属性。

按顺序排序 (SORT BY),John L. Donaldson's lecture notes

由于关系是集合(或袋),因此没有为关系定义排序。也就是说,如果两个关系包含相同的元组,则它们相同,无论其顺序如何。然而,用户经常希望查询的输出按某种特定顺序列出。我们可以定义一个额外的运算符 τ,如果我们愿意允许一个输出不是关系而是有序元组列表的运算符,则可以对关系进行排序。

例如,表达式
τLastName,FirstName(Student)
会生成一个按照 LastName(作为主排序键)和 FirstName(作为次要排序键)排序的所有 Student 元组列表。(仅当两个元组在主排序键上相同时,才会使用次要排序键。排序操作可以列出任意数量的排序键,从最重要的到最不重要的。)

4
您可以使用投影符号 π 来选择您想按照它们分组的列,而不进行聚合操作(PROJECT 操作会删除任何重复元组),如下所示:

π c1,c2,c3 (R)

其中,c1、c2 和 c3 是列(属性),R 是表(关系)。

1
根据 这个 SQL 转关系代数的转换工具,我们有:
SELECT agents.agent_code, agents.agent_name, SUM(orders.advance_amount)
FROM agents, orders
WHERE agents.agent_code = orders.agent_code
GROUP BY agents.agent_code, agents.agent_name
ORDER BY agents.agent_code

用函数的形式写成,类似于:
τ agents.agent_code
 γ agent_code, agent_name, SUM(advance_amount)
  σ agents.agent_code = orders.agent_code (agents × orders)

带有如下图示的图表:

https://imgur.com/My9iV3D.png


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接