基本关系代数运算
选择运算
σ p ( R ) = { t ∣ t ∈ R ∧ p ( t ) = T r u e } σ_p(R)= \{t|t∈R∧p(t)=True\} σp(R)={t∣t∈R∧p(t)=True}
p 为选择谓词 :
-
由逻辑运算符与(⋀)、或(∨)、非(¬)连接的若干原子表达式构成的公式
-
原子表达式的形式为:X θ Y
-
X,Y:属性名、常量,或者函数值
-
θ:比较运算符,包括=、>、<、≥、≤、≠
-
查询计算机系所有学生的信息:
σ S d e p t = ′ ′ C S ′ ′ ( S t u d e n t ) σ_ {Sdept} = _{''CS ''} (Student) σSdept=′′CS′′(Student)
查询计算机系年龄大于等于18的学生的信息,以及所有数学系的学生信息:
σ ( S d e p t = ′ ′ C S ′ ′ ⋀ S a g e ≥ 18 ) ∨ S d e p t = ′ ′ M A ′ ′ ( S t u d e n t ) σ_ {(Sdept=''CS'' ⋀ Sage≥18) ∨ Sdept}=_{''MA''}(Student) σ(Sdept=′′CS′′⋀Sage≥18)∨Sdept=′′MA′′(Student)
投影运算
Π A 1 , A 2 , … , A k ( R ) = { t [ A 1 , A 2 , … , A k ] ∣ t ∈ R } Π_{A_1,A_2,…,A_k}(R)=\{t[A_1,A_2,…,A_k] | t∈R\} ΠA1,A2,…,Ak(R)={t[A1,A2,…,Ak]∣t∈R}
选择属性列 A 1 , A 2 , … , A k A_1,A_2,…,A_k A1,A2,…,Ak 的值,删除重复元组
计算机系所有学生的学号、姓名:
Π S n o , S n a m e ( σ S d e p t = ′ ′ C S ′ ′ ( S t u d e n t ) ) Π_{Sno, Sname }(σ_{Sdept}=''CS'' (Student)) ΠSno,Sname(σSdept=′′CS′′(Student))
并运算
R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R∪S = \{ t | t∈R∨t∈S\} R∪S={t∣t∈R∨t∈S}
- R和S中属性个数要相同
- R和S中的属性应存在一一对应关系
- R中每个属性的域和S中对应属性的域要相同
Union:去重 Union all:不去重
查询所有17或18岁学生的信息:
σ S a g e = 17 ( S t u d e n t ) ∪ σ S a g e = 18 ( S t u d e n t ) σ_ {Sage=17 }(Student)∪σ_{ Sage=18 }(Student) σSage=17(Student)∪σSage=18(Student)
差运算
$ R−S={ t | t∈R ⋀ t∉S}$
- 同上
计算机系中的未成年同学的信息:
σ S d e p t = ′ ′ C S ′ ′ ( S t u d e n t ) − σ S a g e ≥ 18 ( S t u d e n t ) σ_ {Sdept=''CS''}(Student) − σ_{Sage≥18}(Student) σSdept=′′CS′′(Student)−σSage≥18(Student)
笛卡尔积运算
$ R×S={(t,q) | t∈R ∧q∈S}$
重命名运算
ρ S ( A 1 , A 2 , … , A n ) ( R ) ρ_S(A_1,A_2,…,A_n)(R) ρS(A1,A2,…,An)(R)
- 将关系名 R 重命名为 S
- 将各属性按照从左到右的顺序重命名为 A 1 , A 2 , … , A n A_1,A_2,…,A_n A1,A2,…,An
ρ S ( R ) ρ_S(R) ρS(R):只修改关系名,不修改属性名
附加关系代数运算
交运算
R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R∩S=\{ t | t∈R∧t∈S\} R∩S={t∣t∈R∧t∈S}
R ∩ S = R − ( R − S ) R ∩ S=R−(R−S) R∩S=R−(R−S)
- 同上
查询计算机系年龄大于等于18的学生的信息
σ S d e p t = ′ ′ C S ′ ′ ( S t u d e n t ) ∩ σ S a g e ≥ 18 ( S t u d e n t ) σ_ {Sdept=''CS''}(Student) ∩ σ_{Sage≥18}(Student) σSdept=′′CS′′(Student)∩σSage≥18(Student)
连接运算
R ⋈ p S = { ( t , q ) ∣ t ∈ R ∧ q ∈ S ∧ p ( ( t , q ) ) = T r u e } R⋈_pS=\{(t,q) | t∈R ∧q∈S ∧ p((t,q))=True\} R⋈pS={(t,q)∣t∈R∧q∈S∧p((t,q))=True}
等值连接 = :
S t u d e n t ⋈ S t u d e n t . S n o = S C . S n o S C Student⋈_{Student.Sno=SC.Sno}SC Student⋈Student.Sno=SC.SnoSC
自然连接 :
R和S中属性名相同的列做等值连接
S t u d e n t ⋈ S C Student⋈SC Student⋈SC
外连接:连接运算的扩展,可以处理缺失值
**左外连接(R⟕S)**会保留左边关系R的所有元组,R中的元组,若在S中没有在同名属性上取值相同的元组,会用空值来填充S中的属性
**右外连接(R⟖S)**会保留右边关系S的所有元组,对于S中在R中不存在同名属性上取值相同的元组,会用空值来填充R中的属性
全外连接(R⟗S)的查询结果是左外连接和右外连接查询结果的并集
赋值运算
T ← E T←E T←E
t e m p ← S t u d e n t × S C temp←Student × SC temp←Student×SC
r e s u l t ← σ S t u d e n t . S n o = S C . S n o ( t e m p ) result←σ_{Student.Sno=SC.Sno}(temp) result←σStudent.Sno=SC.Sno(temp)
除运算
设 R ( A 1 , A 2 , … , A m , B 1 , B 2 , … , B n ) R(A_1,A_2,…,A_m,B_1,B_2,…,B_n) R(A1,A2,…,Am,B1,B2,…,Bn)和 S ( B 1 , B 2 , … , B n ) S(B_1,B_2,…,B_n) S(B1,B2,…,Bn)是两个关系,则 R ÷ S R÷S R÷S的属性为 A 1 , A 2 , … , A m A_1,A_2,…,A_m A1,A2,…,Am
R ÷ S = { t ∣ t ∈ Π A 1 , A 2 , … , A m ( R ) ⋀ ( ∀ q ∈ S , ( t , q ) ∈ R ) } R÷S=\{ t | t∈Π_{A_1,A_2,…,A_m}(R) ⋀ (∀q∈S, (t,q)∈R)\} R÷S={t∣t∈ΠA1,A2,…,Am(R)⋀(∀q∈S,(t,q)∈R)}
例如 S C ÷ C o u r s e SC ÷ Course SC÷Course,找到选择所有课程的同学;
扩展关系代数运算
去重运算
δ ( R ) δ(R) δ(R)
广义投影运算
允许在投影列表中使用算术运算和字符串函数等来对投影运算进行扩展
Π F 1 , F 2 , … , F k ( R ) Π_{F_1,F_2,…,F_k}(R) ΠF1,F2,…,Fk(R)
- F 1 , F 2 , … , F k {F_1,F_2,…,F_k} F1,F2,…,Fk为包含常量、变量(R中列)、运算符(算术运算符,逻辑运算符,关系运算符)、函数等的多个表达式
- 例如2023-age得到出生年份
聚集运算
G F 1 ( A 1 ) , F 2 ( A 2 ) , … , F k ( A k ) ( R ) G_{F_1(A_1),F_2(A_2),…,F_k}(A_k)(R) GF1(A1),F2(A2),…,Fk(Ak)(R)
查询学生总人数,以及学生平均年龄:
G c o u n t ( S n o ) , a v g ( S a g e ) ( S t u d e n t ) G_{count(Sno), avg(Sage)}(Student) Gcount(Sno),avg(Sage)(Student)
分组运算
G 1 , G 2 , … , G l G F 1 ( A 1 ) , F 2 ( A 2 ) , … , F k ( A k ) ( R ) _{G_1,G_2,…,G_l} G_{F_1(A_1),F_2(A_2),…,F_k(A_k)}(R) G1,G2,…,GlGF1(A1),F2(A2),…,Fk(Ak)(R)
查询各个系的男生和女生人数:
S d e p t , S g e n d e r G c o u n t ( S n o ) ( S t u d e n t ) _{Sdept,Sgender} G_{count(Sno)}(Student) Sdept,SgenderGcount(Sno)(Student)
排序运算
τ A 1 , A 2 , … A k ( R ) τ_{A_1,A_2,…A_k}(R) τA1,A2,…Ak(R)
将学生表按照年龄排序,对于年龄相同的元组,按照学号排序
τ S a g e , S n o ( S t u d e n t ) τ_{Sage,Sno}(Student) τSage,Sno(Student)