1

我需要一些帮助将 SQL 查询转换为关系代数。

这是 SQL 查询:

SELECT * FROM Customer, Appointment
WHERE Appointment.CustomerCode = Customer.CustomerCode
    AND Appointment.ServerCode IN
    (
        SELECT ServerCode FROM Appointment WHERE CustomerCode = '102'
    )
;

IN由于上面示例中的子查询,我被卡住了。

谁能为我演示如何在关系代数中表达这个 SQL 查询?

非常感谢。

编辑:这是我在关系代数中提出的解决方案。这个对吗?它是否重现 SQL 查询?

Scodes ← ΠServerCode(σCustomerCode='102'(约会))

Ccodes ← ΠCustomerCode(约会 ⋉ Scodes)

结果←(客户⋉Ccodes)

4

2 回答 2

4

您的 SQL 代码将导致 CustomerCode 的列重复,并且使用SELECT [ALL]可能会导致重复的行。因为结果不是关系,所以不能用关系代数表示。

这些问题在 SQL 中很容易解决:

SELECT DISTINCT * 
  FROM Customer NATURAL JOIN Appointment
 WHERE Appointment.ServerCode IN
    (
        SELECT ServerCode FROM Appointment WHERE CustomerCode = '102'
    )
;

您没有指定您感兴趣的关系代数。Date 和 Darwen 提出了一个名为A的代数,指定了一种名为D的 A 语言,并设计了一种名为Tutorial D的 D 语言。

教程 D 使用运算符JOIN进行自然连接、WHERE限制和MATCHING半连接,稍微复杂的是 SQL 中的比较:

CustomerCode = '102'

由于隐式强制,可以将值与 SQL 中的CustomerCode值进行比较。CHAR教程 D 更严格——类型安全,如果你愿意的话——要求你重载相等运算符,或者更实际地,为 定义一个选择器运算符CHAR,它通常与类型具有相同的名称。

因此,上述(修改后的)SQL 在教程 D 中可以写成:

( Customer JOIN Appointment ) 
   MATCHING ( ( Appointment WHERE CustomerCode = CustomerCode ( '102' ) ) { ServerCode } )
于 2011-11-01T09:03:34.963 回答
2

“我如何用这种标准形式的 RA 表示我的查询?”

这与其说是“代数类型”的问题,不如说是“符号类型”的问题。

使用希腊符号的表示法通常使用 sigma、附加到 sigma 字符的下标中的限制条件,然后是限制的主题(受到限制条件的关系表达式)。

日期避免使用这种符号,因为使用这种符号排版和/或创建文本通常比仅使用西方字母要困难得多(我的一位数学老师曾经告诉我们,数学教科书包含的错误最多)。

因此,σ <cond> (<rel exp>) 表示与(Date 的语法)“<rel exp> WHERE <cond>”完全相同的代数表达式。

类似地,对于希腊符号,投影通常使用字母 Pi 表示,下标中的保留属性列表附加在 Pi 后面,然后是作为投影主题的表达式。

Π <attr list> (<rel exp>) 因此表示与(Date 的语法)“<rel exp> { <attr list> }”完全相同的代数表达式。

运算符的连接系列通常用“希腊”符号表示,使用(变体)Unicode BOWTIE 字符,或由一个小写字母“x”组成的字符,该字符被一个完整的圆圈包围(通常用于表示完整的笛卡尔积,交叉产品,......无论你的代数课程碰巧命名它)。

一些课程使用希腊字母 Rho 提供重命名的“希腊符号”表示法。附加在下标中的是重命名列表,格式为 a1->b1,a2->b2,... 之后是要进行重命名的关系表达式。同样, Date 具有非希腊符号等效语法: <rel exp> RENAME a1 AS b1, a2 AS b2 , ...

重要的是要看到这些差异仅仅是句法符号的差异,而不是“不同的代数”。

编辑

可以想象,希腊符号表示法是将关系代数编程为 APL 引擎的一种方式,Date 的语法是将关系代数编程为类似 cobol 或 PL/1 引擎的方式(实际上存在这样的引擎称为 Rel),以及将关系代数编程为类似 OO 的引擎的方法,可能类似于关系.NaturalJoin(otherRelation).Matching(yetOtherRelation.Restrict(condition).project(attributesList))。

于 2011-11-01T16:14:43.123 回答