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语句?我用'&'但是这不可能是对的吗?我是否必须在另一个中嵌入一个选择?
不是家庭作业
形式关系代数使用逻辑连接和析取以及(通常)相同的符号(分别为∧和∨),尽管作者可以自由选择自己的语法.查询可以写成:
π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)是共同的新名称属性.