为了进行考试,我被要求获得一个以上租金的客户列表,这既是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()
的使用,尽管它的使用方式不同,但我想不出没有投影的使用方法(我想避免这种情况)。 最佳答案
“关系代数”有许多变体,即使在关系上也有所不同。您需要告诉我们您应该使用哪一个。
另外,您也没有解释一对RA&SQL查询彼此“具有”或“彼此相同”的含义。 (早期版本。)Same result? Or also some kind of parallel structure?
另外,您也不会解释“获取客户列表”的含义。结果有什么属性?
如果您尝试编写count
的定义,并尝试在σ count(IdClient)>1 (...)
中使用-它输入了什么以及基于它的输出-您会发现您不能这样做。仅带有属性的那种count
不对应于关系运算符。它用于分组表达式中-您会丢失它。这样的count
和group
实际上不是关系运算符,它们实际上是由SQL辩护者设计的所谓关系代数(实际上是查询语言)中的非终结符,这表明将SQL映射到关系代数很容易,但是却引发了我们如何解决问题的问题。聚集在一个代数中。不过,也许那是您被告知要使用的“关系代数”。
代数的本质是,我们与其他运算符“一起使用”运算符的唯一意义是将运算符调用的输出作为输入传递给其他运算符。 (因此,没有所谓的代数。)在链接的答案中,分组运算符G
输入聚合名称count
和属性名称name
,这会影响输出。答案引用了数据库系统概念,第五版:
G
返回具有G1, ..., A1, ...
属性的行,其中一或多个具有相同G1, ...
子行的行位于E
中,并且每个Ai
保留这些行上Fi
上的Ai
聚合的输出。
但是当您阅读并链接它时,答案没有正确地使用该定义。 (自从我修复它。)正确的是:
π name (σ phone>1 (name G count(phone) (Person)))
如果您仔细阅读定义,这很清楚。
G
的语法令人误解。 count(phone)
不是运算符(operator)的调用;它只是一对参数,一个聚合名称count
和一个属性名称phone
。误导性较小的语法将是π name (σ phone>1 (name G count phone (Person)))
不需要分组运算符来编写查询。因此,更重要的是要知道“关系代数”在考试中的含义。如果您不能使用分组运算符,则更加困难。
目前尚不清楚“
Π Rental
似乎是一个黑幕生意”。您确实使用了错误的投影;正确的用法是π attributes (relation)
。我猜想您正在使用π
尝试涉及像G
这样的分组运算符。关于“数学背后的逻辑”,请参见this。关于sql - 如何在关系代数中用HAVING COUNT(*)> 1表示GROUP BY?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45906291/