【问题标题】:How to represent GROUP BY with HAVING COUNT(*)>1 in relational algebra?如何在关系代数中用 HAVING COUNT(*)>1 表示 GROUP BY?
【发布时间】:2017-08-27 14:57:31
【问题描述】:

在一次考试中,我被要求以 SQL 查询和代数表达式的形式获取拥有多个租金的客户列表。

由于某些原因,更正不提供代数版本。

所以现在我只剩下:

SELECT IdClient, Name, ...
FROM Client
WHERE IdClient IN (
    SELECT IdClient 
    FROM Rental
    GROUP BY IdClient
    HAVING COUNT(*) > 1
)

我不知道代数符号是否有标准,因此:

  • Π 投影
  • × 笛卡尔积
  • ⋈自然加入
  • σ 选择

那我翻译成:

Π IdClient, Name, ... (
    σ (count(IdClient)>1) (Π Rental) ⋈ (Client ⋈ Rental)
)

但我找不到任何来源来证明我是对还是错,尤其是对于:

  • 数学背后的逻辑
  • Π Rental 似乎是个阴暗的生意

我在https://cs.stackexchange.com/questions/29897/use-count-in-relational-algebra 看到了count() 的使用,虽然它的使用方式不同,但我想不出没有投影的方法(我想避免这种情况。)

【问题讨论】:

    标签: sql relational-algebra


    【解决方案1】:

    “关系代数”有许多变体,甚至在关系是什么方面也有所不同。您需要告诉我们您应该使用哪一个。

    您也没有解释一对 RA 和 SQL 查询“具有”或“相同”彼此的含义。 (早期版本。)Same result? Or also some kind of parallel structure?

    您也没有解释“获取客户列表”的含义。结果有什么属性

    如果您尝试编写您尝试在σ count(IdClient)>1 (...) 中使用的count 的定义——它输入的内容和基于此输出的内容——你会发现你做不到。那种只接受一个属性的count 不对应关系运算符。它用于分组表达式中-您缺少该表达式。这样的countgroup 实际上并不是关系运算符,它们是所谓的关系代数中的非终结符,它们是真正的查询语言,由 SQL 辩护者设计,表明将 SQL 映射到关系代数很容易,但乞求我们如何在代数中聚合的问题。不过,也许这就是你被告知要使用的那种“关系代数”。

    我在https://cs.stackexchange.com/questions/29897/use-count-in-relational-algebra那里看到了count()的用法

    代数的本质是,我们将运算符“与”其他运算符“一起使用”的唯一意义是将运算符调用的输出作为输入传递给其他运算符调用。 (因此一些所谓的代数不是。)在您的链接答案中,分组运算符G 输入聚合名称count 和属性名称name,这会影响输出。答案引用了数据库系统概念,第 5 版:

     G1, G2, ..., Gn G F1(A1), F2(A2), ..., Fm(Am) (E)
    

    其中 E 是任何关系代数表达式; G1, G2, ..., Gn 构成要分组的属性列表;每个 Fi 是一个聚合函数;每个Ai都是一个属性名。

    G 返回具有G1, ..., A1, ... 属性的行,其中一个或多个具有相同G1, ... 子行的行位于E 中,每个Ai 都保存在这些行上Ai 上聚合Fi 的输出.

    但是当您阅读并链接它时,答案不正确地使用了该定义。 (从那以后我就修好了。)正确的是:

    π name (σ phone>1 (name G count(phone) (Person)))
    

    如果你仔细阅读定义,这一点就很清楚了。

    G 具有误导性语法。 count(phone) 不是接线员的电话;它只是一对参数,一个聚合名称count 和一个属性名称phone。较少误导的语法将是

    π name (σ phone>1 (name G count phone (Person)))
    

    编写查询不需要分组运算符。这使得了解“关系代数”在考试中的含义变得更加重要。如果不能使用分组运算符,则更难

    Π Rental 似乎是一个阴暗的业务”尚不清楚。您确实错误地使用了投影;正确使用是π attributes (relation)。我猜你正在使用π 试图让G 之类的分组运算符参与进来。关于“数学背后的逻辑”,请参阅 this

    【讨论】:

    • 明天我会重新处理我的问题,因为它似乎需要全神贯注才能理解。
    • 如果您编辑,请不要使我的回答无效。即使您的问题不清楚,我也是从我的 cmets 写的,因此我可以将其用作所有其他不清楚的问题的参考,这些问题没有说明他们使用的是什么代数,也不要说“翻译/转换”是什么意思,不要说他们想要什么列和/或不理解语法。我可以添加您需要的任何内容(如果您可以使用countgroup,我不知道您还需要什么),但我建议您最好提出一个新的、明确的问题以获得简洁的答案和编辑在此处的链接中(以避免投反对票并获得赞成票)。 PS编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2021-01-28
    • 1970-01-01
    • 2016-07-23
    • 2015-09-15
    • 2016-10-11
    • 2020-09-23
    相关资源
    最近更新 更多