Pie*_*ume 5 sql relational-algebra
在考试中,我被要求以 SQL 查询和代数表达式的形式获取拥有不止一笔租金的客户列表。
由于某些原因,更正没有提供代数版本。
所以现在我只剩下:
SELECT IdClient, Name, ...
FROM Client
WHERE IdClient IN (
SELECT IdClient
FROM Rental
GROUP BY IdClient
HAVING COUNT(*) > 1
)
Run Code Online (Sandbox Code Playgroud)
我不知道代数符号是否有标准,因此:
然后我翻译成:
? IdClient, Name, ... (
? (count(IdClient)>1) (? Rental) ? (Client ? Rental)
)
Run Code Online (Sandbox Code Playgroud)
但我找不到任何来源来证明我是对还是错,尤其是对于:
? Rental 看起来像一个阴暗的生意我count()在https://cs.stackexchange.com/questions/29897/use-count-in-relational-algebra看到了使用,虽然它的使用方式不同,但我想不出一种使用方法它没有投影(我想避免。)
“关系代数”有许多变体,甚至在关系是什么上也有所不同。您需要告诉我们您应该使用哪一个。
\n\n此外,您也没有解释一对 RA 和 SQL 查询彼此“具有形式”或“相同”的含义。(早期版本。)相同的结果?或者某种并行结构?
\n\n此外,您也没有解释“获取客户列表”的含义。结果有什么属性?
\n\ncount如果您尝试编写您要使用的定义\xcf\x83 count(IdClient)>1 (...)- 它输入什么以及基于此输出什么 - 您会发现您不能。那种count只需要一个属性的类型并不对应于关系运算符。它用在分组表达式中——您缺少它。这样的count&group实际上并不是关系运算符,它们是所谓的关系代数中的非终结符,这些关系代数实际上是查询语言,由 SQL 辩护者设计,这表明将 SQL 映射到关系代数很容易,但回避了我们如何聚合的问题代数。不过,也许这就是你被告知要使用的那种“关系代数”。
\n\n\n我在那里看到了 count() 的使用https://cs.stackexchange.com/questions/29897/use-count-in-relational-algebra
\n
代数的本质是,我们与其他运算符“一起使用”运算符的唯一意义是将运算符调用的输出作为其他运算符调用的输入传递。(因此一些所谓的代数不是。)在链接的答案中,分组运算符G输入聚合名称count和属性名称name,这会影响输出。答案引用数据库系统概念,第五版:
\n\n\nRun Code Online (Sandbox Code Playgroud)\n\nG1, G2, ..., Gn G F1(A1), F2(A2), ..., Fm(Am) (E)\n其中 E 是任何关系代数表达式;G1、G2、...、Gn 构成要分组的属性列表;每个 Fi 是一个聚合函数;每个Ai是一个属性名称。
\n
G返回具有属性的行,其中包含G1, ..., A1, ...具有相同子行的一行或多行,并且每行都保存聚合的输出G1, ...EAiFiAi。
但是当您阅读并链接它时,答案错误地使用了该定义。(从那以后我就把它修好了。)正确的是:
\n\n\xcf\x80 name (\xcf\x83 phone>1 (name G count(phone) (Person)))\nRun Code Online (Sandbox Code Playgroud)\n\n如果你仔细阅读定义的话,这一点就很清楚了。
\n\nG有误导性的语法。count(phone)不是接线员的呼叫;它只是一对参数,一个聚合名称count和一个属性名称phone。较少误导性的语法是
\xcf\x80 name (\xcf\x83 phone>1 (name G count phone (Person)))\nRun Code Online (Sandbox Code Playgroud)\n\n不需要分组运算符来编写查询。这使得了解考试中“关系代数”的含义变得更加重要。更难如果不能使用分组运算符,
\n\n“\xce\xa0 Rental似乎是一项见不得人的生意”尚不清楚。您确实错误地使用了投影;正确的使用是\xcf\x80 attributes (relation)。我猜您正在\xcf\x80尝试使用像 这样的分组运算符G。关于“数学背后的逻辑”请参阅此。