因为关系被解释为某个谓词的外延,关系代数的每个运算在谓词演算中都有对应者。
例如,自然连接是逻辑AND()的对应者。
如果关系R和S分别表示谓词p1和p2的外延,则R和S的自然连接(R S)是表示谓词p1p2的外延的关系。
认识到 Codd 的代数事实上关于一阶逻辑不完备是很重要的。
实现它会引起不可R S = {r s| r R, s S}主条目:投影 (关系代数)投影是写为的一元运算,这里的是属性名字的集合。
这种投影的结果定义为当所有在中的元组被限制为集合的时候所获得的集合。
广义选择是写为 的一元运算,这里的 是由正常选择中所允许的原子和逻辑算子 (与)、(或) 和 (非)构成的命题公式。
这种选择选出 中使成立的所有元组。
主条目:重命名 (关系代数) 重命名是写为的一元运算,这里的结果同一于,除了在所有元组中的 字段被重命名为 字段之外。
它被简单的用来重命名关系的属性或关系自身。
连接和类似连接的运算自然连接 (⋈)自然连接是写为 (R ⋈ S ) 的二元运算,这里的 R 和 S 是关系。
[1]自然连接的结果是在 R 和 S 中的在它们的公共属性名字上相等的所有元组的组合。
例如下面是表格“雇员”和“部门”和它们的自然连接:雇员NameEmpI d DeptNa meHarry 3415 财务 Sally 2241 销售 George 3401 财务 Harriet2202 销售部门 DeptNa me Manager 财务 George 销售 Harrie t 生产Charle s雇员 ⋈ 部门 NameEmpI d DeptNa me ManagerHarry 3415 财务 George Sally 2241 销售 Harriet George 3401 财务 George Harriet2202 销售Harrie t工作因为外键在相同名字的属性之间保持。
如果不是这样,外键成立于从部门.manager到Emp.emp-number,则我们必须在采用自然连接之前必须重命名这些列。
这种自然连接有时叫做相等连接(参见θ-连接)。
更形式的说,自然连接的语义定义为:R S = { t s : t R, s S, fun (t s) }这里的 fun(r) 是对于二元关系r为真的谓词,当且仅当r是函数二元关系。
通常要求R和S必须至少有一个公共属性,但是如果省略了这个约束则在那种特殊情况下自然连接就完全变成上面定义的笛卡尔积。
自然连接可以用 Codd 的原始运算模拟如下。
假定b1,...,b m是公共于R和S 的公共属性名字,a1,...,a n是唯一于R的属性名字而c1,...,c k是唯一于S 的属性名字。
进一步假定属性名字d1,...,d m不在R和S二者中。
第一步我们可以重命名S中的公共属性名字: : S' := ρd1/b1(...ρdm/bm( S)...),接着我们采用笛卡尔积并选择要连接的元组: : T:= σb1=d1(...σbm=dm(R×S')...),最后我们采用一个投影来去掉重命名的属性: : U := πa1,...,an,b1,...,bm,c1,...,ck(T) 。
θ-连接和相等连接考虑分别列出车模和船模的价格的表“车”和“船”。
假设一个顾客要购买一个车模和一个船模,但不想为船花费比车更多的钱。
在关系上的θ-连接CarPrice ≥BoatPrice生成所有可能选项的一个表。
车CarMod el CarPri ceCarA 20'000 CarB 30'000 CarC 50'000船BoatModelBoatPriceBoat1 10'000Boat2 40'000Boat3 60'000车船CarModelCarPriceBoatModelBoatPriceCarA 20'000 Boat1 10'000CarB 30'000 Boat1 10'000CarC 50'000 Boat1 10'000CarC 50'000 Boat2 40'000如果我们要组合来自两个关系的元组,而组合条件不是简单的共享属性上的相等,则有一种更一般形式的连接算子才方便,这就是θ-连接(或 theta-连接)。
θ-连接是写为或的二元算子,这里的a和b是属性名字,θ是在集合 {<, ≤, =, >, ≥} 中的二元关系,v是值常量,而R和S是关系。
这个运算的结果由在R和S中满足关系θ的元素的所有组合构成。
只有S和R的表头是不相交的,即不包含公共属性的情况下,θ-连接的结果才是有定义的。
这个运算可以用基本运算模拟如下:RφS = σφ(R×S)在算子θ是等号算子 (=) 的时候这个连接也相等连接。
但是要注意,支持自然连接和重命名的计算机语言可以不需要θ-连接,因为它可以通过对自然连接(在没有公共属性的时候的它退化为笛卡尔积)的选择来完成。
半连接 (⋉)(⋊)半连接是类似于自然连接的写为R⋉S的连接,这里的R和S是关系。
[2]半连接的结果只是在S中有在公共属性名字上相等的元组所有的R中的元组。
例如下面的例子是“雇员”和“部门”和它们的半连接的表:雇员Name EmpIdDeptNameHarry 3415 财务Sally 2241 销售George 3401 财务Harrie t 2202 生产部门DeptNameManager销售Harriet生产Charles雇员⋉部门NameEmpIdDeptNameSally 2241 销售Harriet2202 生产更形式的说半连接的语义定义如下:R S = { t : t R, s S, fun (t s) }这里的 fun(r) 定义同于自然连接。
半连接可以被使用自然连接模拟如下。
假定a1,...,a n是R的属性名字,则:R S =a1,..,an(R S)因为我们可以通过基本运算模拟自然连接因此也就可以模拟半连接。
反连接 (▷)反连接是类似于自然连接的写为R▷S的连接,这里的R和S是关系。
[3]反连接的结果是在S中没有在公共属性名字上相等的元组的R中的那些元组。
例如“雇员”和“部门”和它们的反连接的表:雇员Name EmpIdDeptNameHarry 3415 财务Sally 2241 销售George 3401 财务Harrie t 2202 销售部门DeptNameManager销售Harriet生产Charles雇员▷部门NameEmpIdDeptNameHarry 3415 财务George3401 财务反连接形式定义为:R S = { t : t R s S : fun (t s) }或R S = { t : t R,S中没有s满足 fun (t s) }这里的 fun(r) 定义同于自然连接。
反连接还可以定义为半连接的补集:R S = R - R S为此反连接有时叫做反半连接,反连接算子有时写为其上有横杠的半连接符号。
除法 (÷)除法是写为R÷S的二元关系。
其结果由R中元组到唯一于R的属性名字(就是说只在R表头中而不在S表头中的属性)的限制构成,并且它们与S中的元组的所有组合都存在于R中。
例如下面的“完成”和“DB项目”和它们的除法:完成DB项目完成÷ DB项目Student Task Fred Database1 Fred Database2 Fred Compiler1 Eugene Database1 Eugene Compiler1 Sara Database1 Sara Database2TaskDatabase1Database2StudentFredSara如果“DB项目”包含数据库项目的所有任务,则这个除法的结果精确的包含已经完成了数据库项目的所有学生。
更形式的说除法的语义定义如下:R ÷S = { t[a1,...,an] : t R s S( (t[a1,...,a n] s) R) }这里的 {a1,...,a n} 是唯一于R的属性名字的集合而t[a1,...,a n] 是t到这个集合的限制。
通常要求在S的表头中的属性名字是R的表头的属性名字的子集,否则运算的结果永远为空。
除法可以用基本运算模拟如下。
我们假定a1,...,a n是唯一于R的属性名字而b 1,...,bm是S的属性名字。
在第一步中我们投影R于它的唯一属性上,并接着构造它们与S的元组的所有组合:T := πa1,...,an(R) ×S在上面例子中,T 将是表示所有学生(因为 Student 是“完成”表的唯一键/属性)与所有给定任务的组合的表。
所以 Eugene 在 T 中将有两行 Eugene -> Database1 和 Eugene -> Database2。
在下个步骤中,我们从这个关系中减去R:U := T - R注意在U的都是R中没有出现的可能的组合。
所以如果现在做到唯一于R的属性名字的投影,则我们有了R中元组的限制,它们与S的元组的所有组合未都出现在R中:V := πa1,...,an(U)剩下的就是投影R到唯一于它的属性名字并减去V:W := π(R) - Va1,...,an外连接尽管连接(或内连接)的结果是由组合两个操作数的匹配元组而形成的元组组成,外连接由这些元组加上通过向一个操作数的未匹配元组扩展上另一个操作数的每个属性的“填充”值而形成的元组组成。
本节定义的运算假定“空”值ω的存在性,我们不定义它并把它用做填充值。
不应当假定它为数据库语言SQL所定义的NULL,也不应该假定ω为一个标号而非一个值,也不应该假定它介入了有争议的三值逻辑。
定义三个外连接: 左外连接、右外连接和全外连接。
(有时省略“外”字)左外连接 (⟕)左外连接写成R⟕S,其中R与S为关系。
[4]左外连接的结果包含R中所有元组,对每个元组,若在S中有在公共属性名字上相等的元组,则正常连接,若在S中没有在公共属性名字上相等的元组,则依旧保留此元组,并将对应其他列设为NULL。
右外连接 (⟕)右外连接写成R⟕S,其中R与S为关系。
[5]右外连接的结果包含S中所有元组,对每个元组,若在R中有在公共属性名字上相等的元组,则正常连接,若在R中没有在公共属性名字上相等的元组,则依旧保留此元组,并将对应其他列设为NULL。
全外连接 (⟕)全外连接写成R⟕S,其中R与S为关系。
[6]全外连接的结果包含R与S中所有元组,对每个元组,若在另一关系上中有在公共属性名字上相等的元组,则正常连接,若在另一关系上中没有在公共属性名字上相等的元组,则依旧保留此元组,并将对应其他列设为NULL。