SQL - >关系代数

use*_*142 4 sql relational-algebra algebra relation

假设我有以下关系:

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

Staff (staffNo(PK), fName, lName, sex, branchNo(FK))
Run Code Online (Sandbox Code Playgroud)

这并不重要,但PK =主键和FK =外键

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

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

我的尝试:

?Staff.sex=F & Branch.city = Glasgow(?fName, lName, sex, branchNo(Staff) x ?city, branchNo(Branch))

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

?Staff.sex=F & Branch.city = Glasgow
Run Code Online (Sandbox Code Playgroud)

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

不是家庭作业

out*_*tis 6

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

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

请注意,x(而不是⨯)是笛卡尔积的符号.对于天然连接,你想要bow(领结).

如果您想要笛卡尔积而不是自然连接,则基本上通过向选择添加适当的条件来实现自然连接.您还需要处理属性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)为公共属性名称)和t1..k⊈α(R)∪α(S)是共同的新名称属性.