如何在关系代数中用 HAVING COUNT(*)>1 表示 GROUP BY?
How to represent GROUP BY with HAVING COUNT(*)>1 in relational algebra?
在一次考试中,我被要求以 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()
的使用,虽然它的使用方式不同,但我想不出没有投影(我想要的)的使用方法避免。)
"relational algebra"有很多变体,甚至在关系是什么上也有所不同。您需要告诉我们您应该使用哪一个。
此外,您没有解释一对 RA 和 SQL 查询对 "have the form of" 或 "be the same as" 的含义。 (早期版本。)Same result? Or also some kind of parallel structure?
你也不解释"get the list of clients"是什么意思。结果有什么属性?
如果您尝试编写您尝试在 σ count(IdClient)>1 (...)
中使用的 count
的定义——它输入的内容和输出的内容——你会发现你可以't。那种只接受属性的 count
不对应于关系运算符。它用于分组表达式中——您缺少它。这样的 count
和 group
实际上不是关系运算符,它们是所谓的关系代数中的非终结符,它们实际上是查询语言,由 SQL 辩护者设计,表明它很容易映射SQL 到关系代数,但回避了我们如何在代数中聚合的问题。不过,也许这就是您被告知要使用的那种 "relational algebra"。
I saw the use of count() there https://cs.stackexchange.com/questions/29897/use-count-in-relational-algebra
代数的本质是,我们 "use" 运算符 "with" 其他运算符的唯一意义是将运算符调用的输出作为输入传递给其他运算符调用。 (因此一些所谓的代数不是。)在您的链接答案中,分组运算符 G
输入聚合名称 count
和属性名称 name
并影响输出。答案引用数据库系统概念,第 5 版:
G1, G2, ..., Gn G F1(A1), F2(A2), ..., Fm(Am) (E)
where E is any relational-algebra expression; G1, G2, ..., Gn constitute a list of attributes on which to group; each Fi is an aggregate function; and each Ai is an attribute name.
G
returns 具有属性 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)))
编写查询不需要分组运算符。这使得了解 "relational algebra" 在考试中的含义变得更加重要。如果不能使用分组运算符,更难。
"Π Rental
似乎是黑幕生意" 不清楚。您确实错误地使用了投影;正确使用是π attributes (relation)
。我猜你正在使用 π
来尝试使用像 G
这样的分组运算符。重新 "the logic behind the math" 参见 this.
在一次考试中,我被要求以 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()
的使用,虽然它的使用方式不同,但我想不出没有投影(我想要的)的使用方法避免。)
"relational algebra"有很多变体,甚至在关系是什么上也有所不同。您需要告诉我们您应该使用哪一个。
此外,您没有解释一对 RA 和 SQL 查询对 "have the form of" 或 "be the same as" 的含义。 (早期版本。)Same result? Or also some kind of parallel structure?
你也不解释"get the list of clients"是什么意思。结果有什么属性?
如果您尝试编写您尝试在 σ count(IdClient)>1 (...)
中使用的 count
的定义——它输入的内容和输出的内容——你会发现你可以't。那种只接受属性的 count
不对应于关系运算符。它用于分组表达式中——您缺少它。这样的 count
和 group
实际上不是关系运算符,它们是所谓的关系代数中的非终结符,它们实际上是查询语言,由 SQL 辩护者设计,表明它很容易映射SQL 到关系代数,但回避了我们如何在代数中聚合的问题。不过,也许这就是您被告知要使用的那种 "relational algebra"。
I saw the use of count() there https://cs.stackexchange.com/questions/29897/use-count-in-relational-algebra
代数的本质是,我们 "use" 运算符 "with" 其他运算符的唯一意义是将运算符调用的输出作为输入传递给其他运算符调用。 (因此一些所谓的代数不是。)在您的链接答案中,分组运算符 G
输入聚合名称 count
和属性名称 name
并影响输出。答案引用数据库系统概念,第 5 版:
G1, G2, ..., Gn G F1(A1), F2(A2), ..., Fm(Am) (E)
where E is any relational-algebra expression; G1, G2, ..., Gn constitute a list of attributes on which to group; each Fi is an aggregate function; and each Ai is an attribute name.
G
returns 具有属性 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)))
编写查询不需要分组运算符。这使得了解 "relational algebra" 在考试中的含义变得更加重要。如果不能使用分组运算符,更难。
"Π Rental
似乎是黑幕生意" 不清楚。您确实错误地使用了投影;正确使用是π attributes (relation)
。我猜你正在使用 π
来尝试使用像 G
这样的分组运算符。重新 "the logic behind the math" 参见 this.