3

假设我有以下关系:

Branch (branchNo(PK), street, city, postcode)

Staff (staffNo(PK), fName, lName, sex, branchNo(FK))

这个问题并不重要,但 PK = 主键 & FK = 外键

我将如何为以下查询编写关系代数:

列出在格拉斯哥工作的所有女性员工的姓名。

我的尝试:

σStaff.sex=F & Branch.city = GlasgowfName, lName, sex, branchNo(Staff) x πcity, branchNo(Branch))

我知道我的选择(σ) 语句(不要与 SELECT 混淆)在语法上不正确:

σStaff.sex=F & Branch.city = Glasgow

如何在不同的关系上写两个选择?或者换句话说,在关系代数的 WHERE 子句中,如何表达具有两个或多个条件的 SQL 语句?我用过'&',但这不正确吗?我必须在另一个中嵌入一个选择吗?

不是家庭作业

4

1 回答 1

6

形式关系代数使用逻辑合和析以及(通常)相同的符号(分别为),尽管作者可以自由选择自己的语法。查询可以写成:

πfName, lName(gender=F ∧ city=Glasgow)(Staff ⋈ Branch))

请注意,x(更确切地说,⨯)是笛卡尔积的符号。对于自然连接,您需要⋈(领结)。

如果您想要笛卡尔积而不是自然连接,您基本上可以通过在选择中添加适当的条件来实现自然连接。您还需要处理属性 branchNo 对两个关系都是通用的这一事实,您可以通过使用重命名运算符(ρ) 来做到这一点。

πfName, lName(gender=F ∧ city=Glasgow ∧ branchNo=bNum)(Staff ⨯ ρbNum/branchNo(Branch)))

形式上,您可以这样做,因为:

R ⋈ S = πα(R),α(S)-α(R)α(R)∩α(S)=t1..k(R ⨯ ρ t1..k/α(R)∩α(S)(S))))

其中 α(T) 是关系 T 的属性名称(使 α(R) ∩ α(S) 成为公共属性名称),t 1..k ⊈ α(R) ∪ α(S) 是公共属性的新名称属性。

于 2011-04-24T19:51:51.243 回答