【问题标题】:How do you convert a Sql command into Relational Algebra? [closed]如何将 Sql 命令转换为关系代数? [关闭]
【发布时间】:2013-05-31 16:19:03
【问题描述】:

我有这个问题。

对于两个表:第一个是员工:Employee(id, roomID),第二个是:Room(roomID, roomName)

问题是:每个房间有多少员工。

我可以用 SQL 语言轻松做到这一点:

select Room.roomID, COUNT(Employee.id) as NumofEmployee
from Employee, Room
where employee.roomID = Room.roomID
group by Room.roomID

同样的问题,但使用关系代数语言编写。这个问题让我很头疼,因为我懂这门语言,只要做一些简单的操作:joinselectionprojectiondifference。所以,很多我不知道如何处理的 SQL 命令,例如:group bycount

谢谢:)

【问题讨论】:

  • 不要这样写“FROM Employee,Room”。这不好。使用 JOIN 关键字:FROM Employee INNER JOIN Room ON employee.roomID = Room.roomID。在这个阶段它并不那么重要,但是当您开始构建更严格的查询时,它会产生巨大的不同。
  • @JoelCoehoorn 并不是说​​您的评论对发帖人有任何帮助,您可以为该声明引用什么推理?如果程序员不希望您以某种他们不允许构造的方式执行此操作,我总是有这样的印象?
  • 语法存在的原因是历史性的。它来自 ansi-89 标准。 ansi-92 和更高版本更喜欢使用 join 关键字,最近的一些标准甚至在某些情况下弃用了旧的 A,B 语法。
  • @JoelCoehoorn 我很少看到有人使用 92 标准,除了这里(或非美国国家)。感谢您的彻底回复。我想这也回答了我的问题。 stackoverflow.com/questions/334201/…
  • 顺便说一句,您可能想阅读元常见问题解答Should questions include “tags” in their titles?。请注意,特别不鼓励使用标签开头。我已经编辑了你的标题以反映这一点。我还在您的问题中添加了关系代数标签。

标签: sql relational-algebra


【解决方案1】:

聚合和分组操作不能从基本的关系代数操作中构造出来。您必须定义自己的 COUNTGROUP BY 运算符来执行此操作。

您可以使用许多对基本关系代数的扩展建议,或者您甚至可以定义自己的扩展 - 但要正式这样做,我怀疑数学会变得相当复杂。

可以在这里找到一个简单的提案(没有太多形式),http://myweb.lmu.edu/dondi/share/db/relational3.pdf。 (第 3.2 节)

使用该链接中提出的扩展代数,您的表达式将如下所示:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    相关资源
    最近更新 更多