包括选择、投影、并、差、笛卡尔积和重命名(期中,选择、投影、重命名为一元运算,并、差、笛卡尔积为二元运算)
基本关系代数运算可以用来表达任何传统关系代数运算
选择运算 σ \sigma σ可以从关系 R R R中获取满足条件的元组:
σ p ( R ) = { t ∣ t ∈ R ∧ p ( t ) = True } \sigma_p(R)=\{t\mid t\in R\land p(t)=\text{True}\} σp(R)={t∣t∈R∧p(t)=True}
p p p为选择谓词:
投影运算 Π \Pi Π可以从关系 R R R中获取某些列组成新的关系:
Π A 1 , A 2 , … , A k ( R ) = { t [ A 1 , A 2 , … , A k ] ∣ t ∈ R } \Pi_{A_1,A_2,\ldots,A_k}(R)=\{t[A_1,A_2,\ldots,A_k]\mid t\in R\} ΠA1,A2,…,Ak(R)={t[A1,A2,…,Ak]∣t∈R}
并运算 ∪ \cup ∪返回两个关系 R R R和 S S S中元组取并集的结果:
R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R\cup S=\{t\mid t\in R\lor t\in S\} R∪S={t∣t∈R∨t∈S}
Union:去重
Union all:不去重
差运算 − - −返回在关系R中但是不在关系S中的元组集合:
R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S=\{t\mid t\in R \land t\notin S\} R−S={t∣t∈R∧t∈/S}
笛卡尔积运算 × \times ×返回关系R中元组和关系S中的元组做笛卡尔积的结果:
R × S = { ( t , q ) ∣ t ∈ R ∧ q ∈ S } R\times S=\{(t,q)\mid t\in R\ \land\ q\in S\} R×S={(t,q)∣t∈R ∧ q∈S}
例如: instructor × teaches \text{instructor}\times\text{teaches} instructor×teaches
重命名运算 ρ \rho ρ将关系R重命名为关系S:
ρ S ( A 1 , A 2 , … , A n ) ( R ) \rho_{S(A_1,A_2,\dots,A_n)}(R) ρS(A1,A2,…,An)(R)
交运算 ∩ \cap ∩返回两个关系R和S中元组取交集的结果:
R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R\cap S=\{t\mid t\in R\land t\in S\} R∩S={t∣t∈R∧t∈S}
交运算可以通过差运算来表示: R ∩ S = R − ( R − S ) R\cap S=R-(R-S) R∩S=R−(R−S)
连接运算 ⋈ \Join ⋈返回关系R和S笛卡尔积运算结果中满足一定条件的元组:
R ⋈ p S = { ( t , q ) ∣ t ∈ R ∧ q ∈ S ∧ p ( t , q ) = True } R\Join_{p}S=\{(t,q)\mid t\in R\land q\in S\land p(t,q)=\text{True}\} R⋈pS={(t,q)∣t∈R∧q∈S∧p(t,q)=True}
p p p为选择谓词
连接运算可通过组合笛卡尔积运算和选择运算来表示
赋值运算 ← \leftarrow ←将右侧的关系代数表达式结果赋值给左侧的关系变量: T ← E T\leftarrow E T←E
例如:
对学生表和学生选课表进行连接运算,连接的条件为学生表中的Sno列和学生选课表中的Sno列的值相等,并将连接结果赋值给关系变量result
t e m p ← S t u d e n t × S C 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 ) \begin{aligned} & temp\leftarrow Student\times SC\\ & result\leftarrow \sigma_{Student.Sno=SC.Sno}(temp) \end{aligned} temp←Student×SCresult←σStudent.Sno=SC.Sno(temp)
设 R ( A 1 , A 2 , … , A m , B 1 , B 2 , … , B n ) R(A_1,A_2,\dots,A_m,B_1,B_2,\dots,B_n) R(A1,A2,…,Am,B1,B2,…,Bn)和 S ( B 1 , B 2 , … , B n ) S(B_1,B_2,\dots,B_n) S(B1,B2,…,Bn)是两个关系,则 R ÷ S R\div 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 n ( R ) ∧ ( ∀ q ∈ S , ( t , q ) ∈ R ) } R\div S=\{t\mid t\in \Pi_{A_1,A_2,\dots,A_n}(R)\land (\forall q\in S,(t,q)\in R)\} R÷S={t∣t∈ΠA1,A2,…,An(R)∧(∀q∈S,(t,q)∈R)}
除运算可以用投影运算和笛卡尔积运算表示:
R ÷ S = Π A 1 , A 2 , … , A n ( R ) − Π A 1 , A 2 , … , A n ( ( Π A 1 , A 2 , … , A n ( R ) × S ) − R ) R\div S=\Pi_{A_1,A_2,\dots,A_n}(R)-\Pi_{A_1,A_2,\dots,A_n}((\Pi_{A_1,A_2,\dots,A_n}(R)\times S)-R) R÷S=ΠA1,A2,…,An(R)−ΠA1,A2,…,An((ΠA1,A2,…,An(R)×S)−R)
扩展关系代数运算定义了使用基本关系代数运算和附加关系代数运算无法实现的运算
去重运算 δ \delta δ可以将关系R中的重复元组去除,并返回去除重复元组后的关系: δ ( R ) \delta(R) δ(R)
广义投影运算 Π \Pi Π允许在投影列表中使用算术运算和字符串函数等来对投影运算进行扩展:
Π F 1 , F 2 , … , F k ( R ) \Pi_{F_1,F_2,\dots,F_k}(R) ΠF1,F2,…,Fk(R)
聚集运算 G \mathcal{G} G可以查询关系R按某些列的值聚集在一起的结果:
G F 1 ( A 1 ) , F 2 ( A 2 ) , … , F k ( A k ) ( R ) \mathcal{G}_{F_1(A_1),F_2(A_2),\dots,F_k(A_k)}(R) GF1(A1),F2(A2),…,Fk(Ak)(R)
常见的聚集函数包括count
, sum
, avg
, min
, max
等
聚集函数对空值NULL的处理:
count()
count(*)
:不忽略空值count(某个字段)
:忽略空值sum()
:可以对单个/多个列求和
- 忽略NULL值,且当对多个列运算求和时,如果运算的列中任意一列的值为NULL,则忽略这行的记录
- 例如:
sum(A+B+C)
,A、B、C 为三列,如果某行记录中A列值为NULL,则不统计这行avg()
:忽略NULL值,而不是将其作为0参与计算min()
,max()
:忽略NULL值
分组运算首先对关系R中的元组按照某些列的值进行分组,然后在各组上应用聚集运算:
G 1 , G 2 , … , G l G F 1 ( A 1 ) , F 2 ( A 2 ) , … , F k ( A k ) ( R ) _{G_1,G_2,\dots,G_l}\mathcal{G}_{F_1(A_1),F_2(A_2),\dots,F_k(A_k)}(R) G1,G2,…,GlGF1(A1),F2(A2),…,Fk(Ak)(R)
排序运算 τ \tau τ将关系R中的元组按照一列或多列的值排序: τ A 1 , A 2 , … , A k ( R ) \tau_{A_1,A_2,\dots,A_k}(R) τA1,A2,…,Ak(R)
注意:排序运算 τ \tau τ是按照 A i A_i Ai的升序排列的,也就是从小到大排列。
关系代数运算 | 表达式 |
---|---|
选择 | σ p ( R ) = { t ∣ t ∈ R ∧ p ( t ) = True } \sigma_p(R)=\{t\mid t\in R\land p(t)=\text{True}\} σp(R)={t∣t∈R∧p(t)=True} |
投影 | Π A 1 , A 2 , … , A k ( R ) = { t [ A 1 , A 2 , … , A k ] ∣ t ∈ R } \Pi_{A_1,A_2,\ldots,A_k}(R)=\{t[A_1,A_2,\ldots,A_k]\mid t\in R\} ΠA1,A2,…,Ak(R)={t[A1,A2,…,Ak]∣t∈R} |
并 | R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R\cup S=\{t\mid t\in R\lor t\in S\} R∪S={t∣t∈R∨t∈S} |
差 | R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S=\{t\mid t\in R \land t\notin S\} R−S={t∣t∈R∧t∈/S} |
笛卡尔积 | R × S = { ( t , q ) ∣ t ∈ R ∧ q ∈ S } R\times S=\{(t,q)\mid t\in R\ \land\ q\in S\} R×S={(t,q)∣t∈R ∧ q∈S} |
重命名 | ρ S ( A 1 , A 2 , … , A n ) ( R ) \rho_{S(A_1,A_2,\dots,A_n)}(R) ρS(A1,A2,…,An)(R) |
交 | R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R\cap S=\{t\mid t\in R\land t\in S\} R∩S={t∣t∈R∧t∈S} |
连接 | R ⋈ p S = { ( t , q ) ∣ t ∈ R ∧ q ∈ S ∧ p ( t , q ) = True } R\Join_{p}S=\{(t,q)\mid t\in R\land q\in S\land p(t,q)=\text{True}\} R⋈pS={(t,q)∣t∈R∧q∈S∧p(t,q)=True} |
赋值 | T ← E T\leftarrow E T←E |
除 | R ÷ S = { t ∣ t ∈ Π A 1 , A 2 , … , A n ( R ) ∧ ( ∀ q ∈ S , ( t , q ) ∈ R ) } R\div S=\{t\mid t\in \Pi_{A_1,A_2,\dots,A_n}(R)\land (\forall q\in S,(t,q)\in R)\} R÷S={t∣t∈ΠA1,A2,…,An(R)∧(∀q∈S,(t,q)∈R)} |
去重 | δ ( R ) \delta(R) δ(R) |
广义投影 | Π F 1 , F 2 , … , F k ( R ) \Pi_{F_1,F_2,\dots,F_k}(R) ΠF1,F2,…,Fk(R) |
聚集 | G F 1 ( A 1 ) , F 2 ( A 2 ) , … , F k ( A k ) ( R ) \mathcal{G}_{F_1(A_1),F_2(A_2),\dots,F_k(A_k)}(R) GF1(A1),F2(A2),…,Fk(Ak)(R) |
分组 | G 1 , G 2 , … , G l G F 1 ( A 1 ) , F 2 ( A 2 ) , … , F k ( A k ) ( R ) _{G_1,G_2,\dots,G_l}\mathcal{G}_{F_1(A_1),F_2(A_2),\dots,F_k(A_k)}(R) G1,G2,…,GlGF1(A1),F2(A2),…,Fk(Ak)(R) |
排序 | τ A 1 , A 2 , … , A k ( R ) \tau_{A_1,A_2,\dots,A_k}(R) τA1,A2,…,Ak(R) |
元组关系演算表达式的定义为: { t ∣ P ( t ) } \{t\mid P(t)\} {t∣P(t)}
域关系演算表达式的定义为: { < x 1 , x 2 , … , x k > ∣ P ( x 1 , x 2 , … , x k ) } \{