关系模型由关系数据结构、关系操作集合和关系完整系约束三部分组成。
2.1 关系数据结构及形式化定义
2.1.1 关系
关系模型的数据结构——关系。从用户来看,就是一张扁平的二维表。
关系模型是建立在集合代数的基础上的,这里从集合论角度给出关系数据结构的形式化定义。
-
1.域(Domain):域是一组具有相同数据类型的值的集合。
-
2.笛卡尔积(Cartesian Product):给定一组域 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn,这些域中可以是相同的域。 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn的笛卡尔积为:
D 1 × D 2 × . . . . × D n = ∣ ( d 1 , d 2 , . . . , d n ) ∣ d i ∈ D i , i = 1 , 2 , . . . . , n D_1\times D_2\times .... \times D_n = |(d_1,d_2,...,d_n)|d_i\in D_i,i = 1,2,....,n D1×D2×....×Dn=∣(d1,d2,...,dn)∣di∈Di,i=1,2,....,n
其中每一个元素 ( d 1 , d 2 , . . . , d n ) (d_1,d_2,...,d_n) (d1,d2,...,dn)叫做一个 n n n元组(n-tuple)或简称元组(tuple)。
元素中的每一个值 d d d,叫做一个分量(Conponent)。
笛卡尔积中的基数M为 n n n元组的个数。 -
3.关系(Relation): D 1 × D 2 × . . . × D n D_1 \times D_2 \times ... \times D_n D1×D2×...×Dn的子集叫做域 D 1 , D 2 , . . . , D n D_1,D_2,...,D_n D1,D2,...,Dn上的关系,表示为 R ( D 1 , D 2 , . . . , D n ) R(D_1,D_2,...,D_n) R(D1,D2,...,Dn)。
R R R表示关系的名字, n n n是关系的目或度(degree)。
候选码(Candidate key):关系中能唯一标识一个元组的属性组。
主码(Primary key):若一个关系有多个候选码,则选定其中一个为主码。
主属性(Prime attribute):候选码中的各个属性。
非主属性(Nonprimary attribute)\非码属性(Non-key attribute):不包含在任何候选码中的属性。
全码(All-key):若关系模式的所有属性都是这个关系模式的候选码,则称为全码。
2.1.2 关系模式
在关系数据库中,关系模式是型,关系是值,关系模式是对关系的描述。
关系的描述称为关系模式(Relation Schema)。它可以形式化地表示为
R
(
U
,
D
,
D
O
M
,
F
)
R(U,D,DOM,F)
R(U,D,DOM,F)。
其中
R
R
R为关系名,
U
U
U为组成该关系的属性名集合,
D
D
D为属性组
U
U
U中属性所来自的域,
D
O
M
DOM
DOM为属性向域的映像集合,
F
F
F为属性间数据的依赖关系集合。
关系模式通常可以简记为
R
(
U
)
R(U)
R(U) 或
R
(
A
1
,
A
2
,
.
.
.
,
A
n
)
R(A_1,A_2,...,A_n)
R(A1,A2,...,An),
A
1
,
A
2
,
.
.
.
,
A
n
A_1,A_2,...,A_n
A1,A2,...,An为属性名。
2.1.3 关系数据库
在一个给定的应用领域,所有实体与实体之间联系的关系的集合构成一个关系数据库。
关系数据库也有型和值之分。关系数据库的型也称为关系数据库模式,是对关系数据库的描述。关系数据库模式包括:
- 若干域的定义;
- 在这些域上定义的若干关系模式。
关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常称为关系数据库。
2.2 关系操作
2.2.1 基本的关系操作
关系模型中常用的关系操作包括查询(Query)操作和插入(Insert)、删除(Delete)、修改(Update)操作两大部分。
查询又包括选择(Select)、投影(Project)、连接(Join)、除(Divde)、并(Union)、差(Except)、交(Intersection)、笛卡尔积等。
其中选择、投影、并、差、笛卡尔积是五种基本操作。其他操作是可以用基本操作来定义和导出的。(就像乘法可以用加法来定义和导出一样)
关系操作的特点是集合操作方式,即操作的对象和结果都是集合。
2.2.2 关系数据语言的分类
- 关系代数:是用对关系的运算来表达查询要求的。
- 关系演算:是用谓词来表达查询要求的。
2.3 关系的完整性
关系模型的完整性规则是对关系的某种约束条件。也就是说关系的值随着时间变化时应该满足一些约束条件。
2.3.1关系的三类完整性约束
关系模型中有三类完整性约束:实体完整性、参照完整性和用户定义的完整性。
实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称为关系的两个不变性,应该由关系系统自动支持。
用户定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。
2.3.2 实体完整性(Entity Integrity)
若属性(指一个或一组属性) A A A是基本关系 R R R的主属性,则 A A A不能取空值。
2.3.3 参照完整性(Referential Integrity)
若属性(或属性组) F F F是基本关系 R R R的外码,它与基本关系 S S S的主码 K K K相对应(基本关系 R R R和 S S S不一定是不同的关系),则对于R中每个元组在 F F F上的取值必须为:
- 或者取空值(F的每个属性值均为空值)(比如学生关系中“专业号”属性为空值,表示尚未给该学生分配专业);
- 或者等于S中某个元组的主码值(比如信息学院的学生专业不能填别的学院的,只能在信息学院中选取)。
2.3.4 用户定义的完整性(User-defined Integrity)
用户定义的完整性就是针对某一具体关系数据库的约束条件。它反应某一具体应用所设计的数据必须满足的语义要求。例如某个属性必须取唯一值、某个非主属性也不能取空值。(例如学生关系中必须给出学生姓名,要求姓名不能取空值,还要成绩必须满足0~100之间等)
2.4 关系代数
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询。
运算对象、运算符、运算结果是运算的三大要素。
关系代数的运算对象是关系,运算结果亦为关系。关系代数所用的运算符包括四类:集合运算符、专门的关系运算符、算术比较符和逻辑运算符,如下表所示:
2.4.1 传统的集合运算符(并差交…)
- 1.并(Union)
R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R \cup S = \{t|t\in R \vee t\in S \} R∪S={t∣t∈R∨t∈S} - 2.差(Except)
R − S = { t ∣ t ∈ R ∧ t ∉ S } R - S = \{t|t\in R \wedge t\notin S\} R−S={t∣t∈R∧t∈/S} - 3.交(Intersection)
R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R \cap S = \{t|t\in R \wedge t\in S \} R∩S={t∣t∈R∧t∈S} - 4.笛卡尔积(Cartesian Product)
R × S = { t r t s ∣ t r ∈ R ∧ t s ∈ S } R \times S = \{t_r t_s | t_r \in R \wedge t_s \in S\} R×S={trts∣tr∈R∧ts∈S}
2.4.2 专门的关系运算(选择、投影…)
定义:
(1)设关系模式为
R
(
A
1
,
.
.
.
,
A
n
)
R(A_1,...,A_n)
R(A1,...,An)。它的一个关系设为
R
R
R。
t
∈
R
t \in R
t∈R 表示
t
t
t是
R
R
R的一个元组。
t
[
A
i
]
t[A_i]
t[Ai]表示元组t中相应于属性
A
i
A_i
Ai的一个分量。
(2)给定一个关系
R
(
X
,
Z
)
R(X,Z)
R(X,Z),
X
X
X和
Z
Z
Z为属性组。当
t
[
X
]
=
x
t[X]=x
t[X]=x时,
x
x
x在
R
R
R中的象集(Images Set)定义为 :
Z
x
=
{
t
[
Z
]
∣
t
∈
R
,
t
[
X
]
=
x
}
Z_x = \{ t[Z] | t\in R,t[X] = x\}
Zx={t[Z]∣t∈R,t[X]=x}
- 1.选择(Selection)
σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = t r u e } \sigma_F(R) = \{t | t\in R \wedge F(t) = true\} σF(R)={t∣t∈R∧F(t)=true}
例如查询IS系的全体学生:
σ S d e p t = ′ I S ′ ( S t u d e n t ) \sigma_{Sdept='IS'}(Student) σSdept=′IS′(Student) - 2.投影(Projection)
Π A ( R ) = { t [ A ] ∣ t ∈ R } \Pi_A(R) = \{t[A] | t\in R\} ΠA(R)={t[A]∣t∈R}
例如查询所有学生的姓名:
Π S n a m e ( S t u d e n t ) \Pi_{Sname}(Student) ΠSname(Student) - 3.连接(Join)
R ⋈ A θ B S = { t r t s ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] θ t s [ B ] } R \underset{A \theta B} \Join S = \{t_r t_s | t_r\in R \wedge t_s \in S \wedge t_r[A] \theta t_s[B]\} RAθB⋈S={trts∣tr∈R∧ts∈S∧tr[A]θts[B]}
其中 A A A和 B B B分别为 R R R和 S S S上度数相等且科比的属性组, θ \theta θ是比较运算符。- 等值连接: θ \theta θ为“=”的连接运算。
- 自然连接:是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。
- 外连接(outer join):如果把舍弃的元组也保存在结果关系中,而在其他属性上填空值(Null),那么这种连接就叫做外连接。
- 左外连接(LEFT OUTER JOIN或LEFT JOIN):如果只把左边关系 R R R中要社区的元组保留就叫做左外连接。
- 右外连接(RIGHT OUTER JOIN或RIGHT JOIN):如果只把右边关系 S S S中要舍弃的元组保留就叫做右外连接。
- 4.除运算(Division)
给定关系 R ( X , Y ) R(X,Y) R(X,Y)和 S ( Y , Z ) S(Y,Z) S(Y,Z),其中 X 、 Y 、 Z X、Y、Z X、Y、Z为属性组。 R R R中的 Y Y Y与 S S S中的 Y Y Y可以有不同的属性名,但必须出自相同的域集。
R ÷ S = { t r [ X ] ∣ t r ∈ R ∧ Π Y ( S ) ⊆ Y x } R \div S = \{t_r[X] | t_r \in R\wedge \Pi_Y(S) \subseteq Y_x \} R÷S={tr[X]∣tr∈R∧ΠY(S)⊆Yx}
2.5 关系演算
2.5.1 元组关系演算语言ALPHA
元组关系演算以元组变量作为谓词变元的基本对象。一种典型的元组关系语言是E.F.Codd提出的ALPHA语言(未实际实现)。
ALPHA语言主要有GET、PUT、HOLD、UPDATE、DELETE、DROP6条语句,基本格式为:
操
作
语
句
工
作
空
间
名
(
表
达
式
)
:
操
作
条
件
操作语句\,\,工作空间名(表达式):操作条件
操作语句工作空间名(表达式):操作条件
除此之外,还可以在基本格式的基础上加上排序要求、定额要求等。
一、检索操作
检索才做用GET语句实现
(1)简单检索(即不带条件的检索)
【例1】查询所有学生的数据。
G
E
T
W
(
S
t
u
d
e
n
t
)
GET\,\,W\,\,(Student)
GETW(Student)
(2)限定的检索
【例2】查询信息系(IS)中年龄小于20岁的学生的学号和年龄。
G
E
T
W
(
S
t
u
d
e
n
t
.
S
n
o
,
S
t
u
d
e
n
t
.
S
a
g
e
)
:
S
t
u
d
e
n
t
.
S
d
e
p
t
=
I
S
∧
S
t
u
d
e
n
t
.
S
a
g
e
≤
20
GET \,\,W\,\,(Student.Sno,Student.Sage):Student.Sdept = IS \wedge Student.Sage\le 20
GETW(Student.Sno,Student.Sage):Student.Sdept=IS∧Student.Sage≤20
(3)带排序的检索
【例3】查询计算机科学系(CS)学生的学号、年龄,结果按年龄降序排序。
G
E
T
W
(
S
t
u
d
e
n
t
.
S
n
o
,
S
t
u
d
e
n
t
.
S
a
g
e
)
:
S
t
u
d
e
n
t
.
S
d
e
p
t
=
C
S
D
O
W
N
S
t
u
d
e
n
t
.
S
a
g
e
GET\,\,W\,\,(Student.Sno,Student.Sage):Student.Sdept=CS\,\,DOWN\,\,Student.Sage
GETW(Student.Sno,Student.Sage):Student.Sdept=CSDOWNStudent.Sage
(4)带定额的检索
【例4】查询信息系年龄最大的三个学生的学号及其年龄,结果按年龄降序排序。
G
E
T
W
(
3
)
(
S
t
u
d
e
n
t
.
S
n
o
,
S
t
u
d
e
n
t
.
S
a
g
e
)
:
S
t
u
d
e
n
t
.
S
d
e
p
t
=
I
S
D
O
W
N
S
t
u
d
e
n
t
.
S
a
g
e
GET\,\,W(3)\,\,(Student.Sno,Student.Sage):Student.Sdept=IS\,\,DOWN\,\,Student.Sage
GETW(3)(Student.Sno,Student.Sage):Student.Sdept=ISDOWNStudent.Sage
(5)用元组变量的检索
(6)用存在量词的检索
操作条件中使用两次时必须用元组变量
【例5】查询选修了这样课程的学生学号,其直接先行课时6号课程
R
A
N
G
E
C
o
u
r
s
e
C
X
RANGE \,\,Course\,\,CX
RANGECourseCX
G
E
T
W
(
S
C
.
S
n
o
)
:
∃
C
X
(
C
X
.
C
n
o
=
S
C
.
C
n
o
∧
C
X
.
P
c
n
o
=
6
)
GET\,\,W\,\,(SC.Sno):\exist CX(CX.Cno=SC.Cno \wedge CX.Pcno = 6)
GETW(SC.Sno):∃CX(CX.Cno=SC.Cno∧CX.Pcno=6)
【例6】查询成绩为90分以上的学生名字与课程名字。
R
A
N
G
E
S
C
S
C
X
RANGE\,\,SC\,\,SCX
RANGESCSCX
G
E
W
W
(
S
t
u
d
e
n
t
.
S
n
a
m
e
,
C
o
u
r
s
e
.
C
n
a
m
e
)
:
∃
S
C
X
(
S
C
X
.
G
r
a
d
e
≥
90
∧
S
C
X
.
S
n
o
=
S
t
u
d
e
n
t
.
S
n
o
∧
C
o
u
r
s
e
.
C
n
o
=
S
C
X
.
C
n
o
)
GEW\,\,W\,\,(Student.Sname,Course.Cname):\exist SCX(SCX.Grade\geq 90\wedge SCX.Sno=Student.Sno\wedge Course.Cno=SCX.Cno )
GEWW(Student.Sname,Course.Cname):∃SCX(SCX.Grade≥90∧SCX.Sno=Student.Sno∧Course.Cno=SCX.Cno)
(7)用全称量词的检索
【例7】查询不选1号课程的学生名字
R
A
N
G
E
S
C
S
C
X
RANGE\,\,SC\,\,SCX
RANGESCSCX
G
E
T
W
(
S
t
u
d
e
n
t
.
S
n
a
m
e
)
:
∀
S
C
X
(
S
C
X
.
S
n
o
≠
S
t
u
d
e
n
t
.
S
n
o
∨
S
C
X
.
C
n
o
≠
1
)
GET\,\,W\,\,(Student.Sname):\forall SCX(SCX.Sno\neq Student.Sno \vee SCX.Cno\neq 1)
GETW(Student.Sname):∀SCX(SCX.Sno=Student.Sno∨SCX.Cno=1)
或者为:
R
A
N
G
E
S
C
S
C
X
RANGE\,\,SC\,\,SCX
RANGESCSCX
G
E
T
W
(
S
t
u
d
e
n
t
.
S
n
a
m
e
)
:
¬
∃
S
C
X
(
S
C
X
.
S
n
o
=
S
t
u
d
e
n
t
.
S
n
o
∧
S
C
X
.
C
n
o
=
1
)
GET\,\,W\,\,(Student.Sname):\neg \exist SCX(SCX.Sno = Student.Sno \wedge SCX.Cno=1)
GETW(Student.Sname):¬∃SCX(SCX.Sno=Student.Sno∧SCX.Cno=1)
【例8】查询选修了全部课程的学生姓名。
R
A
N
G
E
C
o
u
r
s
e
C
X
S
C
S
C
X
RANGE\,\,Course\,\,CX\,\,\\\,\,\,\,SC\,\,SCX
RANGECourseCXSCSCX
G
E
T
W
(
S
t
u
d
e
n
t
.
S
n
a
m
e
)
:
∀
C
X
∃
S
C
X
(
S
C
X
.
S
n
o
=
S
t
u
d
e
n
t
.
S
n
o
∧
S
C
X
.
C
n
o
=
C
X
.
C
n
o
)
GET\,\,W\,\,(Student.Sname):\forall CX \exist SCX(SCX.Sno = Student.Sno \wedge SCX.Cno = CX.Cno)
GETW(Student.Sname):∀CX∃SCX(SCX.Sno=Student.Sno∧SCX.Cno=CX.Cno)
(8)用蕴含(Implication)的检索
【例9】查询最少选修了95002学生所选课程的学生学号
【解题思路】对Course中所有课程,以此检查每一门课程,看95002是否选秀了该课程,如果选修了,则再看某一个学生是否也选秀了该门课。如果对于95002所选的每门课该学生都选秀了,则该学生为满足要求的学生。把所有这样的学生全都找出来即完成了本题。
R
A
N
G
E
C
o
u
r
s
e
C
X
S
C
S
C
X
S
C
S
C
Y
RANGE\,\,Course\,\,CX\\\,\,SC\,\,SCX\\\,\,SC\,\,SCY
RANGECourseCXSCSCXSCSCY
G
E
T
W
(
S
t
u
d
e
n
t
.
S
n
o
)
:
∀
C
X
(
∃
S
C
X
(
S
C
X
.
S
n
o
=
95002
∧
S
C
X
.
C
n
o
=
C
X
.
C
n
o
)
→
∃
S
C
Y
(
S
C
Y
.
S
n
o
=
S
t
u
d
e
n
t
.
S
n
o
∧
S
C
Y
.
C
n
o
=
C
X
.
C
n
o
)
)
GET\,\,W\,\,(Student.Sno):\forall CX(\exist SCX(SCX.Sno = 95002 \wedge SCX.Cno = CX.Cno)\rightarrow \exist SCY(SCY.Sno = Student.Sno \wedge SCY.Cno=CX.Cno))
GETW(Student.Sno):∀CX(∃SCX(SCX.Sno=95002∧SCX.Cno=CX.Cno)→∃SCY(SCY.Sno=Student.Sno∧SCY.Cno=CX.Cno))
(9)聚集函数
【例10】查询学生所在系的数目。
G
E
T
W
(
C
O
U
N
T
(
S
t
u
d
e
n
t
.
S
d
e
p
t
)
)
GET\,\,W\,\,(COUNT(Student.Sdept))
GETW(COUNT(Student.Sdept))
【例11】查询信息系学生的平均年龄
G
E
T
W
(
A
V
G
(
S
t
u
d
e
n
t
.
S
a
g
e
)
)
:
S
t
u
d
e
n
t
.
S
d
e
p
t
=
I
S
)
GET\,\,W\,\,(AVG(Student.Sage)):Student.Sdept=IS)
GETW(AVG(Student.Sage)):Student.Sdept=IS)
二、更新操作
(1)修改操作
- 1.首先用HOLD语句将要修改的元组从数据库中读到工作空间中;
- 2.然后用宿主语言修改工作空间中元组的属性值
- 3.最后用UPDATE语句将修改后的元组送回到数据库中
【例12】把95007学生从计算机科学系转到信息系
H O L D W ( S t u d e n t . S n o , S t u d e n t . S d e p t ) : S t u d e n t . S n o = 95007 M O V E I S T O W . S d e p t U P D A T E W HOLD\,\,W\,\,(Student.Sno,Student.Sdept):Student.Sno=95007\\MOVE IS TO W.Sdept\\UPDATE W HOLDW(Student.Sno,Student.Sdept):Student.Sno=95007MOVEISTOW.SdeptUPDATEW
(2)插入操作
- 1.首先用宿主语言在工作区间中建立新元组
- 2.然后用PUT语句把该元组存入指定的关系中。
【例13】学校新开设了一门2学分的课程“计算机组织与结构”,其课程号为8,直接先行课为6号课程。插入该课程元组。
M O V E 8 T O W . C n o M O V E 计 算 机 组 织 与 结 构 T O W . C n a m e M O V E 6 T O W . C p n o M O V E 2 T O W . C c r e d i t P U T W ( C o u r s e ) MOVE\,\,8\,\,TO\,\,W.Cno\\MOVE\,\,计算机组织与结构\,\,TO\,\,W.Cname\\MOVE\,\,6\,\,TO\,\,W.Cpno\\MOVE\,\,2\,\,TO\,\,W.Ccredit\\PUT\,\,W\,\,(Course) MOVE8TOW.CnoMOVE计算机组织与结构TOW.CnameMOVE6TOW.CpnoMOVE2TOW.CcreditPUTW(Course)
(3)删除操作
- 1.用HOLD语句把要删除的元组从数据库中读到工作空间中;
- 2.用DELETE语句删除该元组。
【例14】95110学生因故退学,删除该学生元组。
H O L D W ( S t u d e n t ) : S t u d e n t , S n o = 95110 D E L E T E W HOLD\,\,W\,\,(Student):Student,Sno=95110\\DELETE\,\,W HOLDW(Student):Student,Sno=95110DELETEW