如何在关系代数中用HUNTING COUNT(*)> 1表示GROUP BY?

时间:2017-08-27 14:57:32

标签: sql relational-algebra

对于考试,我被要求获得具有多个租金的客户列表,包括SQL查询和代数表达。

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

所以现在我离开了:

touchEnded

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

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

然后我翻译为:

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) ) 似乎是一个阴暗的生意

我在https://cs.stackexchange.com/questions/29897/use-count-in-relational-algebra看到了Π Rental的使用,虽然没有使用相同的方式,但我无法找到一种方法来使用它而没有投影(我想避免使用它) 。)

1 个答案:

答案 0 :(得分:1)

“关系代数”有很多变体,即使是关系也是如此。你需要告诉我们你应该使用哪一个。

另外,你没有解释它对于一对RA& SQL查询彼此“具有”或“相同”的形式。 (早期版本。)Same result? Or also some kind of parallel structure?

此外,您不解释“获取客户列表”的含义。结果有什么属性

如果您尝试在count中写下您尝试使用的σ count(IdClient)>1 (...)的定义 - 它输入的内容是什么?基于此输出的内容 - 你会看到你不能。仅采用属性的那种count与关系运算符不对应。它用于分组表达式 - 您缺少它。这样count& group实际上不是关系运算符,它们是所谓的关系代数中的非终端,它们实际上是由SQL辩护者设计的查询语言,表明很容易将SQL映射到关系代数,但是问题是如何我们在代数中聚合。不过,也许这就是你被告知使用的那种“关系代数”。

  

我看到使用count()https://cs.stackexchange.com/questions/29897/use-count-in-relational-algebra

代数的本质是我们“使用”运算符“与”其他运算符的唯一意义是将运算符调用的输出作为输入传递给其他运算符调用。 (因此,某些所谓的代数不是。)在链接的答案中,分组运算符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保存聚合的输出Fi Ai上的这些行。{/ p>

但是当你读到&链接它使用该定义不正确。 (我从那时起就修好了。)正确的是:

π 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