“关系代数”有许多变体,甚至在关系是什么方面也有所不同。您需要告诉我们您应该使用哪一个。
您也没有解释一对 RA 和 SQL 查询“具有”或“相同”彼此的含义。 (早期版本。)Same result? Or also some kind of parallel structure?
您也没有解释“获取客户列表”的含义。结果有什么属性?
如果您尝试编写您尝试在σ count(IdClient)>1 (...) 中使用的count 的定义——它输入的内容和基于此输出的内容——你会发现你做不到。那种只接受一个属性的count 不对应关系运算符。它用于分组表达式中-您缺少该表达式。这样的count 和group 实际上并不是关系运算符,它们是所谓的关系代数中的非终结符,它们是真正的查询语言,由 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。