第二章 关系模型
一.关系
1.1关系的形式化定义:
用二位表格的形式将实体以及实体之间的联系的世界名校称为关系模型。这个二维表被称为关系。
关系模型是建立在集合代数理论的基础上的。
1.1.1概念:
1.域:
定义: 域是一组具有相同数据类型的值的集合,又被称为域值,用符号D表示。
域中所包含的值的个数称为域的基数,用m表示。
在关系模型中用域来表示属性的取值范围。
例如:D1=姓名集合={张三,李四,王五},m1=3
2.笛卡尔积:
定义: 给定一组域D1、D2、D3、…、Dn,这些域中元素可完全不同,或可部分或全部相同。
D1 X D2 X D3 X …X Dn的笛卡尔积位:
D
1
×
D
2
×
D
3
×
.
.
.
×
D
n
=
(
d
1
,
d
2
,
d
3
,
.
.
.
,
d
n
)
∣
d
i
∈
D
i
,
i
=
1
,
2
,
3
,
4
,
.
.
.
,
n
D~1~ \times D~2~ \times D~3~ \times ... \times D~n~ = {(d~1~,d~2~,d~3~,...,d~n~)|d~i~ \in D~i~ , i = 1,2,3,4,...,n}
D 1 ×D 2 ×D 3 ×...×D n =(d 1 ,d 2 ,d 3 ,...,d n )∣d i ∈D i ,i=1,2,3,4,...,n
(1)元素中的每一个值d;叫作一个分量(Component),来自相应的域D;。
(2)每一个元素(d,d,…,d,)叫作一个n元组,简称元组(Tuple)。
(3)若Di(i=1,2,…,n)为有限集,其基数为 mi(i=1,2,…,n),则D1 X D2 X D3 X …X Dn的基数M为所有域的基数的累乘积,即:
M
=
∏
i
=
1
n
m
i
;
M=\prod_{i=1}^n m _i;
M=i=1∏nmi;
3.关系
定义:
笛卡尔积D1 X D2 X D3 X …X D~n的子集称为定义在域上 D1、D2、D3、…、Dn上的关系,表示位R(D1、D2、D3、…、Dn),R表示关系的名字,n称为关系的目或度(Degree)。
当n = 1时,称该关系单元关系。
当n = 2时,称该关系二元关系。
无限关系:一个关系的元组个数是无限个。
有限关系:一个关系的元组个数是有限个。
关系是笛卡尔积的有限子集,所以关系是一个二维表,行对应一个元组,列对应一个域。为了区别,列名称为属性,n目关系有n个属性,属性名唯一。
关系类型:
基本关系(基本表或基表):实际存在的表,是实际存储数据的逻辑表示。
查询表:查询结果对应的表。
视图表:由基本表或其他视图表导出的表,是虚表,不存在实际存储的数据。
1.2基本性质
关系是一种规范化了的二维表,在关系模型中,对关系做了种种限制,关系具有如下性质:
(1)每一个分量都必须是不可再分的数据项。
(2)每一列中的分量必须是同一类型的数据,来自同一个域
(3)每列必须有不同的属性名,不同的列可以来自同一个域。
(4)列的顺序可以任意。
(5)任意两个元组不能完全相同
(6)行的顺序可以任意。
1.3码
关系模式的码(Key)又称为键或关键字。
1.候选码(可以多个)
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码。
简单情况:候选码只包含一个值。
2.全码
极端情况:关系模式的所有属性组是这个关系模式的候选码,称为全码。
3.主码(只有一个)
若一个关系又多个候选码,则选定其中一个为主码。
4.主属性
候选码的属性被称为主属性。
不包含在任何候选码中的属性被称为非主属性或非码属性。
1.4三级体系结构
在关系模式中,概念模式是一组关系模式的集合,外模式是关系子模式的集合,内模式是存储模式的集合。
1.4.1.关系模式
关系模式是对关系的描述,关系模式是型,关系是值。
形式化定义为:
R
(
U
,
D
,
d
o
m
,
F
)
R(U,D,dom,F)
R(U,D,dom,F)
简写为: R(U)或R(A1,A2,A3,…, An)
R:关系名
U(A1,A2,A3,…, An):组成该关系的属性名集合
D:属性组U中属性来自的域的集合
dom:属性向域的映像集合
F:属性间数据的依赖关系集合
1.4.2.关系子模式
在实际应用中,用户使用的数据有时不是直接来自一个关系中的数据,而是从若干个关系中抽取满足一定条件的数据。这种结构可用关系子模式实现。
关系子模式是用户所需或感兴趣的数据结构的描述,其中包括这些数据来自哪些模式和应满足哪些条件。
1.4.3.存储模式
存储模式描述了关系是如何在物理存储设备上存储的。关系存储时的基本组织方式是记录。由于关系有码,因此存储可以用散列方法或索引方法实现。
如果关系中元组数目少(100以内),则可以用堆文件方式实现。此外,还可以对任意的属性集建立辅助索引。
1.5形式定义及优点
1.5.1.关系模式的形式定义
关系模型是由数据结构,数据操纵以及三类完整性规则三部分组成。
(1)在关系模型中,现实世界中的实体及实体间的联系都用关系(即二维表格)表示关系模型基本的数据结构是关系。在用户看来,关系模型中数据的逻辑结构是一张二维表。
(2)关系模型提供一组完备的高级关系运算,以支持对数据库的各种操作。关系运算分为关系代数和关系演算等。
(3)关系模型的三类完整性规则。
1.5.2.关系模型的优点
(1)关系模型与非关系模型不同,它建立在严格的数学概念的基础上。
(2)关系模型的获据结构简单、清晰,用户易懂易用。数据模型就是一些表格框架,其中,公共属性名 (外码) 指示着各表格间的联系。
(3)关系模型中的数据操作是集合操作,操作对象和操作结果都是关系,即若干元组的集合。而在非关系模型中,每一次操作只能得到一个记录。
(4)关系模型的存取路径对用户是透明的,用户只需指出“做什么”,而不必详细说明“怎么做”。提高了数据独立性和安全性,也简化了程序员的工作和数据库开发建立工作。
(5)可以直接处理多对多的联系。由于关系模型用表格数据直接表示实体间的联系,因此可以直接处理多对多的联系。
1.1.6 关系与关系数据库
在关系模型中,实体以及实体之间的联系都是用关系来表示的。例如,学生实体、课程实体、学生与课程之间的多对多联系都可以分别用一个关系表示。这样,在学校教务管理中,三个关系的集合构成了一个学生-课程关系数据库。
关系数据库采用的是关系模型,所有关系模式的集合构成了关系数据库的模式,即关系数据库型的描述。关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常称之为关系数据库。
二.关系操作
2.1.关系操作的特点
关系模型与其他数据模型相比最有特色的是它的数据操纵语言。这种语言灵活方便,表达能力和功能都很强。既可以独立使用,也可以与高级语育结合起来使用,所有使其深受用户欢迎,这也是它有生命力和发展前途的原因。
2.2.关系运算分类
关系数据库操作语言的基础是关系运算。
关系运算分为以下两类:
一类是关系代数,用对关系的运算来表达查询要求的方式。
另一类是关系演算,用谓词来表达査询要求的方式。关系演算按谓词变元的基本对象是元组变量还是域变量又分为元组关系演算和域关系演算。
所以实际上有关系代数、元组关系演算和域关系演算三种关系运算。
另外还有一种有关系代数和关系演算双重特点的语言SQL(StructureQueryLanguage)
SQL 不仅具有丰富的查询功能,而且具有数据定义、数据操作和和数据控制种功能。
充分体现了关系数据语言的特点和优点,已经被确定为关系数据库系统的国际标准语言,被绝大多数商品化的关系数据库系统采用,受到用户的普遍接受。
三.关系代数
关系代数的运算可分为两类:传统的集合运算和专门的关系运算。
传统的集合运算是指将关系看成元组的集合,从关系的行的角度来进行运算。它有并差、交和笛卡儿积等,它们都是二目运算。
专门的关系运算是指从关系的行和列上进行的运算。它有投影、选择、连接等。
关系代数运算用到下列几种运算符号:
集合运算符
:
∪
、
−
、
∩
、
×
专门运算符
:
π
、
σ
、
∞
、
÷
算术比较符
:
>
、
≥
、
<
、
≤
、
=
、
≠
逻辑运算符
:
¬
(
非
)
、
∧
与
)
、
∨
(
或
)
赋值操作
:
←
集合运算符:\cup 、- 、\cap、 \times \\ 专门运算符: \pi 、\sigma 、\infty 、{\div} \\ 算术比较符:> 、\ge 、<、\le、 = 、≠\\ 逻辑运算符:\neg(非)、 \wedge与)、 \vee (或)\\ 赋值操作:\gets
集合运算符:∪、−、∩、×专门运算符:π、σ、∞、÷算术比较符:>、≥、<、≤、=、=逻辑运算符:¬(非)、∧与)、∨(或)赋值操作:←
集合运算符:
并(∪):对于两个具有相同关系模式的关系R和S,R∪S表示由属于R或属于S的元组构成的集合。
差(
−
-
−):对于两个具有相同关系模式的关系R和S,R-S表示由属于R但不属于S的元组构成的集合。
交(∩):对于两个具有相同关系模式的关系R和S,R∩S表示由既属于R又属于S的元组构成的集合。
笛卡尔积(
×
×
×):对于关系R和S,R×S表示由R中的每个元组与S中的每个元组组合而成的新元组的集合。
专门的关系运算符:
选择(
σ
σ
σ):从关系中选择满足给定条件的元组。例如,σ_{age>20}(Student)表示从学生关系中选择所有年龄大于20岁的学生。
投影(
π
π
π):从关系中选择若干属性列组成新的关系。例如,π_{student_name, class}(Student)表示从学生关系中选择学生姓名和班级属性列。
连接(
∞
∞
∞):根据某些条件将两个关系中的元组组合起来。连接运算有多种类型,如自然连接、等值连接等。
除(
÷
÷
÷):一个比较复杂的关系代数运算符,用于找出在第一个关系中但不在第二个关系中但与第三个关系相关的元组。
上述运算符的运算优先次序是括号最高,算术比较符次之,逻辑运算符最低,且按Λ、V的次序进行。
关系代数的基本运算:不能用其他的关系代数运算表示的部分。
关系代数的组合运算:可以用其他关系代数运算表示的部分。
3.1.传统的集合运算
3.1.1并
设关系R和关系S具有相同的目(即两个关系都有n个属性(相同的列,列名相同)),且相应的属性取自同一个域,则关系R和关系S的并是由属于R属于S的元组组成的集合。其结果仍为n目关系。
记为RUS
形式定义如下:
R
∪
S
=
{
t
∣
t
∈
R
∨
t
∈
S
}
R \cup S= \left \{ t | t \in R \vee t \in S\right \}
R∪S={t∣t∈R∨t∈S}
3.1.2差
设关系R和关系S具有相同的目(即两个关系都有n个属性),且相应的性取自同一个域,则关系R与关系S的差是由属于R但不属于S的元组组成的集合。其结果仍为目关系。
记为R
−
-
−S
形式定义如下:
R
−
S
=
{
t
∣
t
∈
R
∧
t
∉
S
}
R - S= \left \{ t | t \in R \wedge t \notin S\right \}
R−S={t∣t∈R∧t∈/S}
3.1.3交
设关系R和关系S具有相同的目(即两个关系都有n个属性),且相应的属性取自同一个域.则关系R和关系S的交是由既属于R又属于S的元组组成的集合。其结果仍为目关系。
记为R∩S
形式定义如下:
R
∩
S
=
{
t
∣
t
∈
R
∧
t
∈
S
}
R
∩
S
=
R
−
(
R
−
S
)
R \cap S= \left \{ t | t \in R \wedge t \in S\right \} \\ R \cap S=R - ( R - S)
R∩S={t∣t∈R∧t∈S}R∩S=R−(R−S)
3.1.4广义笛卡尔积
R和S分别为n目和m目关系,则其广义笛卡儿积RXS是一个(n+m)目关系。其元组的前n个分量由R的一个元组提供,后m个分量由S的一个元组提供。若R有k1个组,S有k2个元组,则RXS有
k
1
×
k
2
k_1 \times k_2
k1×k2 个元组。
形式定义如下:
R
×
S
=
{
t
∣
t
<
=
t
r
,
t
s
>
∧
t
r
∈
R
∧
t
s
∈
S
}
R \times S = \left \{ t | t<=tr ,ts > \wedge tr \in R \wedge ts \in S\right \}
R×S={t∣t<=tr,ts>∧tr∈R∧ts∈S}
列数相加,行数相乘
例题:
students表
student_id | student_name |
---|---|
1 | Alice |
2 | Bob |
courses表
course_id | course_name | course_times |
---|---|---|
A | Math | 5 |
B | Engish | 8 |
C | Science | 11 |
students × \times × courses(笛卡尔积)
student_id | student_name | course_id | course_name | course_times |
---|---|---|---|---|
1 | Alice | A | Math | 5 |
1 | Alice | B | English | 8 |
1 | Alice | C | Science | 11 |
2 | Bob | A | Math | 5 |
2 | Bob | B | English | 8 |
2 | Bob | C | Science | 11 |
3.2专门的关系运算
3.2.1投影
设R是n元元素
A
1
,
A
2
,
A
3
,
.
.
.
A
n
A_1,A_2,A_3,...A_n
A1,A2,A3,...An(k<=n)分别是它的第
i
1
,
i
2
,
i
3
,
.
.
.
i
n
i_1,i_2,i_3,...i_n
i1,i2,i3,...in个属性,则关R在
A
i
1
,
A
i
2
,
A
i
3
,
.
.
.
A
i
n
Ai_1,Ai_2,Ai_3,...Ai_n
Ai1,Ai2,Ai3,...Ain上的投影是一个k元关系,其属性为
A
i
1
,
A
i
2
,
A
i
3
,
.
.
.
A
i
n
Ai_1,Ai_2,Ai_3,...Ai_n
Ai1,Ai2,Ai3,...Ain,记为
π
i
1
,
i
2
,
i
3
,
.
.
.
i
n
\pi i_1,i_2,i_3,...i_n
πi1,i2,i3,...in (R)。
形式定义为:
π
i
1
,
i
2
,
i
3
,
.
.
.
i
n
(
R
)
=
{
t
∣
t
=
⟨
t
i
1
,
t
i
2
,
t
i
3
,
.
.
.
t
i
m
⟩
∧
⟨
t
1
,
t
2
,
t
3
,
.
.
.
t
n
⟩
∈
R
}
\pi_{i_1,i_2,i_3,...i_n} (R)= \left\{ t | t = \left\langle ti_1,ti_2,ti_3,...ti_m\right\rangle \wedge \left\langle t_1,t_2,t_3,...t_n\right\rangle \in R \right\}
πi1,i2,i3,...in(R)={t∣t=⟨ti1,ti2,ti3,...tim⟩∧⟨t1,t2,t3,...tn⟩∈R}
投影是在列的方向上选择所需要的属性成分并按要求排列成一个新的关系,新关系各个属性值来自原关系中相应的属性值,并去掉重复元组。投影表达式中的属性可用属的名,也可用属性号。
总结:把符合要求的列提出来,放到一个新的关系中
例子:
courses表
id | name | times |
---|---|---|
A | Math | 5 |
B | Engish | 8 |
C | Science | 11 |
查询课程编号和名字
关系代数表达式为:
π
i
d
,
n
a
m
e
(
c
o
u
r
s
e
s
)
或
π
1
,
2
(
S
)
π_{id,name}(courses)或π_{1,2}(S)
πid,name(courses)或π1,2(S)
id | name |
---|---|
A | Math |
B | Engish |
C | Science |
3.2.2选择
在关系R中选择满足给定条件的元组。
其中,F表示选择条件,它是一个逻辑表达式,取逻辑值“真”或“假”。
由下列三部分组成:
(1)运算对象:列号或属性名、常量或简单函数:
(2)算术比较符:
>
、
≥
、
<
、
≤
、
=
、
≠
> 、\ge 、<、\le、 = 、≠
>、≥、<、≤、=、=
(3)逻辑运算符:
¬
(
非
)
、
∧
与
)
、
∨
(
或
)
\neg(非)、 \wedge与)、 \vee (或)
¬(非)、∧与)、∨(或)
选择运算是从关系R中选取能使逻辑表达式F为真的元组,是从行的角度进行的运算,其结果是原关系的子集。
形式定义为:
σ
F
(
R
)
=
(
t
∣
t
∈
R
∧
F
(
t
)
=
′
真
′
)
\sigma_{F(R)}=(t|t∈R \wedge F(t)='真')
σF(R)=(t∣t∈R∧F(t)=′真′)
总结:把符合条件的行提出来,放到一个新的关系中
例子
students表
student_id | student_name | student_age |
---|---|---|
1 | Jake | 14 |
2 | Alice | 16 |
3 | Bob | 17 |
查询年龄大于15的学生: σ s t u d e n t s a g e > = 15 或 σ 3 > = 15 \sigma_{students_{age}>=15}或\sigma_3 >=15 σstudentsage>=15或σ3>=15
student_id | student_name | student_age |
---|---|---|
2 | Alice | 16 |
3 | Bob | 17 |
3.2.3连接
设关系R和关系S分别是n元和m元关系,
θ
\theta
θ是算术比较符,i和j分别是R的第i列和S的第j列,则R和S的连接运算就是从RXS笛卡儿积中,挑选R的第i列和S的第列上的分量满足
θ
\theta
θ比较条件的那些元组。其结果为"n十m元关系。若用A表示R的第i列的属性名,用B表示S的第j列的属性名。
R和S的连接运算形式定义如下:
R
∞
S
(
A
θ
B
)
=
{
t
∣
t
=
⟨
t
r
,
t
s
⟩
∧
t
r
∈
R
∧
t
s
∈
S
∧
t
r
[
A
]
θ
t
s
[
B
]
}
t
r
和
t
s
分别表示从
R
中的元素
t
r
和
S
中的元素
t
s
中提取出的
A
和
B
属性的值
\underset{(A \theta B)}{R \infty S}=\left\{t \mid t=\left\langle t_{r}, t_{s}\right\rangle \wedge t_{r} \in R \wedge t_{s} \in S \wedge t_{r}[A] \theta t_{s}[B]\right\}\\ t_{r}和t_{s}分别表示从 R 中的元素t_{r}和 S 中的元素t_{s}中提取出的 A 和 B 属性的值
(AθB)R∞S={t∣t=⟨tr,ts⟩∧tr∈R∧ts∈S∧tr[A]θts[B]}tr和ts分别表示从R中的元素tr和S中的元素ts中提取出的A和B属性的值
说明: A和B可以是单个属性,也可能是一个属性集,但其属性个数必须保持一致且是可比的。
当0取“<”时,上式称为小于连接
当0取“>”时,上式称为大于连接,
当0取“=”时,上式称为等值连接。
连接运算可用基本的关系代数来表示:
总结:R[x]</=/>S[y] 把符合条件的行,提出来整理到一起(R+S)放到一个新的关系中
3.2.4自然连接
自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。记为
R
∞
S
R∞S
R∞S。即若关系R和关系S具有相同的属性组A。
自然连接可形式定义如:
R
∞
S
=
{
t
∣
t
=
⟨
t
r
,
t
s
⟩
∧
t
r
∈
R
∧
t
s
∈
S
∧
t
r
[
A
]
=
t
s
[
A
]
}
R\infty S=\left\{ t\mid t = \left\langle tr,ts\right\rangle \wedge tr \in R \wedge ts \in S \wedge tr[A] = ts[A] \right\}
R∞S={t∣t=⟨tr,ts⟩∧tr∈R∧ts∈S∧tr[A]=ts[A]}
自然连接的计算过程可分为以下三步,
(1)计算
R
×
S
R\times S
R×S
(2)设R和S的公共属性是
A
1
,
A
2
,
A
3
,
.
.
.
A
n
A_1,A_2,A_3,...A_n
A1,A2,A3,...An,挑选RXS中满足R.A1=S.A1,R·A2=S.A2…,R.An =S.An 的那些元组。
(3)去掉R.A1=S.A1,R·A2=S.A2…,R.Ak =S.Ak 这些列(R.A1=S.A1,R·A2=S.A2…,R.Ak =S.Ak)。
所以,自然连接可用基本关系代数运算来表示:
R
∞
S
=
π
i
1
,
i
2
,
…
,
i
m
(
σ
R
.
A
1
=
S
.
A
1
,
R
.
A
2
=
S
.
A
2
,
.
.
.
,
R
.
A
k
=
S
.
A
k
(
R
X
S
)
)
R\infty S =π_{i_1,i_2,…,i_m}(\sigma _{R.A_1=S.A_1,R.A_2=S.A_2,...,R.A_k=S.A_k}(RXS))
R∞S=πi1,i2,…,im(σR.A1=S.A1,R.A2=S.A2,...,R.Ak=S.Ak(RXS))
自然连接是构造新关系的有效方法,是关系代数中常用的一种运算,在关系数据库理论
中起着重要作用。
总结:
R
[
x
1
,
x
2
,
x
3
.
.
.
]
=
S
[
y
1
,
y
2
,
y
3
.
.
.
]
R[x_1,x_2,x_3...]=S[y_1,y_2,y_3...]
R[x1,x2,x3...]=S[y1,y2,y3...]时新的关系=
(
R
−
R
[
x
1
,
x
2
,
x
3
.
.
.
]
)
+
R
[
x
1
,
x
2
,
x
3
.
.
.
]
/
S
[
y
1
,
y
2
,
y
3
.
.
.
]
+
(
S
−
S
[
y
1
,
y
2
,
y
3
.
.
.
]
)
(R-R[x_1,x_2,x_3...])+R[x_1,x_2,x_3...]/S[y_1,y_2,y_3...]+(S-S[y_1,y_2,y_3...])
(R−R[x1,x2,x3...])+R[x1,x2,x3...]/S[y1,y2,y3...]+(S−S[y1,y2,y3...])
利用投影、选择和自然连接可以任意地分解和构造关系。
等值连接与自然连接的区别是等值连接要求相等的分量不一定是相同的属性名,在结果关系中不去掉重复的属性名;自然连接要求相等的分量必须是相同的属性名,在结果关系中要去掉重复的属性名。
关系R
A | B | C |
---|---|---|
1 | 3 | 2 |
4 | 5 | 6 |
7 | 8 | 9 |
关系S
B | C | D |
---|---|---|
3 | 2 | 2 |
5 | 6 | 3 |
8 | 9 | 7 |
小于连接: R ∞ S ( A < B ) \underset{(A < B)}{R \infty S} (A<B)R∞S
A | B | C | B | C | D |
---|---|---|---|---|---|
1 | 3 | 2 | 3 | 2 | 2 |
1 | 3 | 2 | 5 | 6 | 3 |
1 | 3 | 2 | 8 | 9 | 7 |
4 | 5 | 6 | 8 | 9 | 7 |
等值连接: R ∞ S ( 3 = 2 ) \underset{(3=2)}{R \infty S} (3=2)R∞S
A | B | C | B | C | D |
---|---|---|---|---|---|
1 | 3 | 2 | 3 | 3 | 3 |
4 | 5 | 6 | 5 | 6 | 3 |
自然连接: R ∞ S R \infty S R∞S
A | B | C | D |
---|---|---|---|
1 | 3 | 2 | 2 |
4 | 5 | 6 | 3 |
3.2.5外连接
在关系R和关系S做自然连接时,仅得到两个关系在公共属性上值相等的元组构成新的关系,而将那些值不相等的元组在操作时被舍弃。
为了使这些弃掉的元组仍出现在结果关系中,并在其他属性上填空值(NULL),把这种连接称为外连接。
记作
R
∞
S
R∞S
R∞S
如果只保留左边关系R中的所有元组,则称为左外连接。如果只保留右边关系S中的所有元组,则称为右外连接。
关系R
A | B | C |
---|---|---|
1 | 3 | 2 |
4 | 5 | 6 |
7 | 8 | 9 |
关系S
B | C | D |
---|---|---|
3 | 2 | 2 |
5 | 6 | 3 |
8 | 9 | 7 |
外连接
A | B | C | D |
---|---|---|---|
1 | 3 | 2 | 2 |
4 | 5 | 6 | 3 |
7 | 8 | 9 | NULL |
NULL | 8 | 9 | 7 |
左外连接
A | B | C | D |
---|---|---|---|
1 | 3 | 2 | 2 |
4 | 5 | 6 | 3 |
7 | 8 | 9 | NULL |
右外连接
A | B | C | D |
---|---|---|---|
1 | 3 | 2 | 2 |
4 | 5 | 6 | 3 |
NULL | 8 | 9 | 7 |
3.2.6除(必须有相同属性)
首先引出一个概念——象集(Images Set)。给定一个关系R(X,Y),X,Y为属性集。
定义:当t[X] = x时,在R中的象集为:
Y
x
=
{
t
[
Y
]
∣
t
∈
R
,
t
[
X
]
=
x
}
Y_x=\left\{ t[Y] \mid t\in R,t[X] = x \right\}
Yx={t[Y]∣t∈R,t[X]=x}
它表示R中属性集X上值为x的各元组在Y上分量的集合。
给定关系R(X,Y)和S(X,Y),其中,X,Y,Z为属性集。R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影:元组在X上分量值x的象集Yx包含S在Y上投影的集合。
其形式定义如下:
R
÷
S
=
{
t
r
[
X
]
∣
t
r
∈
R
∧
π
y
(
S
)
⊆
Y
x
}
R{\div}S =\left\{ tr[X]\mid tr \in R \wedge \pi_y(S)\subseteq Yx\right\}
R÷S={tr[X]∣tr∈R∧πy(S)⊆Yx}
除操作是同时从行和列的角度进行运算。
除可用基本关系代数运算来表示:
R
÷
S
=
π
x
(
X
)
−
(
π
x
(
R
)
×
S
−
R
)
R{\div}S=π_x(X)-(π_x(R)\times S-R)
R÷S=πx(X)−(πx(R)×S−R)
计算步骤:
1.求投影
2.象集
3.包含
4.放回
关系R
A | B | C | D |
---|---|---|---|
2 | b | c | d |
9 | a | c | d |
2 | b | e | f |
9 | a | e | f |
8 | b | e | f |
2 | b | d | f |
关系S
C | D | R |
---|---|---|
c | d | m |
e | f | n |
R ÷ S R{\div}S R÷S
A | B |
---|---|
2 | b |
9 | a |
3.3关系代数表达式的优化
数据库管理系统实现查询优化具有以下优势:
(1)优化器可以从数据字典中获取许多统计信息,例如,每个关系中的元组个数、关系
中每个属性值的分布情况等,而用户程序则难以获得这些信息。
(2)如果数据库的物理统计信息改变了,系统可以自动对查询重新优化以选择相适应的执行计划。在非关系系统中必须重写程序,这在实际中往往是不可行的。
(3)优化器可以考虑数百种不同的执行计划,程序员一般只能考虑有限的几种可能性
(4)优化器中包括很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌
握。系统的自动优化相当于使得所有人都拥有这些优化技术。
查询的总目标选择有效的策略,求得给定关系表达式的值,使得查询代价最小(实际上是较小)。
查询优化的方法分为代数优化和物理优化:
代数优化:改变查询语句中操作的次序和组合,不涉及底层的存取路径,对于一个查询语句,可能存在多个存取方案,它们的执行效率不同,仅进行代数优化是不够的。
物理优化:要选择高效合理的操作算法或存取路径,求得更好的查询计划。
四关系演算
4.1ALPHA语言
元组关系演算是以元组变量作为谓词变元的基本对象。元组关系演算的典型代表是E.F.Codd提出的ALPHA语言,这种语言虽然在实际中没有实现,但关系数据库INGRES上所用的QUEL是参照ALPHA语言研制的。
ALPHA语言的基本格式是:
<
操作符
>
<
工作空间
>
(
<
日标表达
>
[
:
<
操作条件
>
]
)
<操作符><工作空间>(<日标表达>[:<操作条件>])
<操作符><工作空间>(<日标表达>[:<操作条件>])
其中,操作符有用于查询操作的GET和更新操作的PUT,HOLD,UPDATE,DELETE, DROP等6种。工作空间是指内存空间,是用户和系统的通信区,通常用一个字母W表示.
目标表达用于指定操作的结果,它可以是关系名或属性名以及含有函数的任何合法表达式。一个操作语句可以同时对多个关系或多个属性进行操作。可选项操作条件是一个用谓词公式表示的逻辑表达式,只有满足该条件的元组才能进行操作;省略时表示无条件执行操作。除此之外,还可以在基本格式上加上排序要求以及返回元组的条数要求等。
4.1.1数据查询
现有三个表:
表S:Sno学号,Sname姓名,Ssex性别,Sbrith出生日期,Sdept专业
表C:Cno课程号,Cname课程名,Cpno先修,Credits学分
表SC:Sno学号,Cno课程号,Grade成绩
1.简单查询
eg:查询所有学生
G
E
T
W
(
S
)
GET \quad W(S)
GETW(S)
GET语句的作用是把数据库中的数据读人内存空间W,目标表达式为学生关系S,代表查询出来的结果,即所有学生。冒号后面的操作条件缺失表示无条件查询。
eg:查询所有被选修的课程号
G
E
T
W
(
S
C
.
C
n
o
)
GET \quad W(SC.Cno)
GETW(SC.Cno)
目标表达式为成绩关系SC中的属性Cno,代表所有被选修的课程号,查询结果自动消去重复行。
2.条件查询
由冒号后面的逻辑表达式给出查询条件,在表达式中可以使用以下运算符。
算术比较符
:
>
、
≥
、
<
、
<
、
=
、
≠
算术比较符:>、≥、<、<、=、≠
算术比较符:>、≥、<、<、=、=
逻辑运算符
:
¬
(
非
)
、
∧
与
)
、
∨
(
或
)
逻辑运算符:\neg(非)、 \wedge与)、 \vee (或)
逻辑运算符:¬(非)、∧与)、∨(或)
其中,比较运算符的优先级高于逻辑运算符,如果有括号(),则其优先级最高.
eg:查询选修了课程号为004且成绩在80分以上的学生的学号。
G
E
T
W
(
S
C
.
S
n
o
)
:
S
C
.
C
n
o
=
′
00
4
′
∧
S
C
.
G
r
a
d
e
>
80
GET \quad W(SC.Sno):SC.Cno='004'\wedge SC.Grade> 80
GETW(SC.Sno):SC.Cno=′004′∧SC.Grade>80
3.排序查询
eg:查询学号为2200102的同学所选课程号及成绩,并按成绩的降序排列。
G
E
T
W
(
S
C
.
C
n
o
,
S
C
,
G
r
a
d
e
)
:
S
c
.
S
n
o
=
′
220010
2
′
D
O
W
N
S
C
.
G
r
a
d
e
GET \quad W(SC.Cno,SC,Grade):Sc.Sno='2200102'DOWN \; SC. Grade
GETW(SC.Cno,SC,Grade):Sc.Sno=′2200102′DOWNSC.Grade
这里的DOWN表示降序,后面紧跟排序的属性名,升序使用UP。
4.定额查询
定额查询就是在查询中限定查询出元组的个数,是通过在W后的括号中加上定额数量。
eg:查询一名软件工程学生的学号和姓名。
G
E
T
W
(
1
)
(
S
.
S
n
o
,
S
.
S
n
a
m
e
)
:
s
.
s
d
e
p
t
=
′
软件工程’
GET \quad W(1)(S.Sno,S.Sname):s.sdept='软件工程’
GETW(1)(S.Sno,S.Sname):s.sdept=′软件工程’
定额和排序查询可以一同使用。
举例:查询选修子课程号为01且成绩最低的学生的学号,
G
E
T
W
(
S
C
.
S
n
o
)
:
S
C
.
C
n
o
=
′
0
1
′
U
P
S
C
.
G
r
a
d
e
GET \quad W(SC.Sno): SC.Cno= '01'UP \quad SC.Grade
GETW(SC.Sno):SC.Cno=′01′UPSC.Grade
该语甸的执行过程为;
1.先查询所有选修了课程号为01的学号和成绩
2.再按照成绩低到高排序
3.然后找出第一位,就是成绩最低的学生
5.带元组变量的查询
元组关系演算就是以元组变量作为谓词变元的基本对象,在元组关系演算的查询操中、可以在相应的关系上定义元组变量。
元组变量代表关系中的元组,其值在所定义的关系范围内变化,所以也称为范围变量,一个关系可以定义多个元组变量。=
元组变量的用途如:
(1)简化关系名:用一个较短名字的元组变量来代替较长的关系名
(2)操作条件中使用量词时必须用元组变量。
定义元组变量格式:RANGE关系名量名
eg:查询2240801同学所选的课程号。
R
A
N
G
E
S
C
X
G
E
T
W
(
X
.
C
n
o
)
:
X
.
S
n
o
=
′
224080
1
′
RANGE \quad SC\quad X\\ GET \quad W(X.Cno):X.Sno='2240801'
RANGESCXGETW(X.Cno):X.Sno=′2240801′
6.带存在量词的查询
举例:查询至少选修一门其学分为3的课程的学生姓名
R
A
N
G
E
C
C
X
S
C
S
C
X
G
E
T
W
(
S
,
S
n
a
m
e
)
:
∃
S
C
X
(
S
C
X
.
S
n
o
=
S
.
S
n
o
∧
∃
C
X
(
C
X
.
C
n
o
=
S
C
X
.
C
n
o
∧
C
X
.
C
r
e
d
i
t
s
=
′
3
’
)
)
RANGE \quad C \quad CX \\ SC \quad SCX\\GET \quad W(S, Sname): \exists SCX (SCX. Sno = S. Sno \wedge \exists CX (CX. Cno = SCX. Cno \wedge CX. Credits = '3’ ))
RANGECCXSCSCXGETW(S,Sname):∃SCX(SCX.Sno=S.Sno∧∃CX(CX.Cno=SCX.Cno∧CX.Credits=′3’))
该语句的执行过程为:
1.先查询学分为3的课程号
2.再依据找到的课程号在关系SC中询对应的学号
3.然后根据学号在关系S中找对应的学生姓名。
前束范式形式:
G
E
T
W
(
S
.
S
n
a
m
e
)
:
∃
S
C
X
∃
C
X
(
S
C
X
,
S
n
o
=
S
.
S
n
o
∧
C
X
,
C
n
o
=
S
C
X
:
C
n
o
∧
C
X
.
C
r
e
d
i
t
s
=
′
3
′
)
GET \quad W(S. Sname) : \exists SCX \exists CX (SCX, Sno = S. Sno ∧ CX, Cno = SCX: Cno \wedge CX. Credits = '3')
GETW(S.Sname):∃SCX∃CX(SCX,Sno=S.Sno∧CX,Cno=SCX:Cno∧CX.Credits=′3′)
7.带有多个关系的表达式的查询
eg:查询成绩为90分以上的学生名与课程名
R
A
N
G
E
S
C
S
C
X
G
E
T
W
(
S
.
S
n
a
m
e
,
C
.
C
n
a
m
e
)
:
S
C
X
(
S
C
X
.
G
r
a
d
e
>
=
90
∧
S
C
X
.
S
n
o
=
S
.
S
n
o
∧
C
.
C
n
o
=
s
c
x
.
C
n
o
)
RANGE \quad SC \quad SCX\\GET \quad W(S.Sname,C.Cname):SCX (SCX.Grade >= 90 \wedge SCX.Sno = S. Sno \wedge C. Cno = scx. Cno)
RANGESCSCXGETW(S.Sname,C.Cname):SCX(SCX.Grade>=90∧SCX.Sno=S.Sno∧C.Cno=scx.Cno)
8.带全称量词的查询
eg:查询选修全部课程的学生姓名。
求解思路:
对课程表C中的所有课程,依次检查每一门课程,看学生表S中的某一个学生是否选修了该课程,如果该学生选修了所有的课程,则该学生为满足要求的学生,把所有这样的学生全部找出来。
R
A
N
G
E
C
C
X
S
C
S
C
X
G
E
T
W
(
S
.
S
n
a
m
e
)
:
∀
C
X
∃
S
C
X
(
S
C
X
.
S
n
o
=
S
.
S
n
o
∧
C
X
.
C
n
o
=
S
C
X
.
C
n
o
)
RANGE\quad C \quad CX\\SC \quad SCX\\GET \quad W(S.Sname): \forall CX \exist SCX (SCX.Sno = S. Sno \wedge CX. Cno = SCX. Cno)
RANGECCXSCSCXGETW(S.Sname):∀CX∃SCX(SCX.Sno=S.Sno∧CX.Cno=SCX.Cno)
9.使用聚集函数查询
用户在使用查询语言时,经常要作一些简单的运算。
在关系数据库语言中建立了有关这类运算的标准函数库,以增强基本检索能力。
这类函数通常称为聚集函数或内置函数,常用的聚集函数如表所示。
函数名 | 功能 |
---|---|
COUNT() | 按列值计算元组个数 |
TOTAL() | 按列计算值的总和 |
AVG() | 按列计算平均值 |
MAX() | 求一列中的最大值 |
MIN() | 求一列中的最小值 |
eg:查询学生表中有多少个系。
G
E
T
W
(
C
O
U
N
T
(
S
.
S
d
e
p
t
)
)
GET \quad W(COUNT(S.Sdept))
GETW(COUNT(S.Sdept))
COUNT函数自动消去重复行,计算属性“Sdept”不同值的数目。
4.1.2.数据更新
更新操作包括插人、删除和修改
1.插入操作
插入操作使用PUT语句实现,分为以下两步。
(1)建立新元组:利用宿主语言在工作空间中建立新元组
(2)写数据:使用PUT语句将元组写人到指定的关系中。
eg:在SC表中插入一条选课元组(‘2240101’,‘01’,80)
M
O
V
E
′
2240101
‘
T
O
W
.
S
N
O
M
O
V
E
′
0
1
′
T
o
W
.
C
N
O
M
O
V
E
80
T
O
W
.
G
R
A
D
E
P
U
T
W
(
S
C
)
MOVE \quad\ '2240101‘ \quad TO\quad W.SNO\\MOVE\quad\ '01'\quad To \quad W.CNO \\MOVE \quad 80\quad TO\quad W.GRADE\\PUT W(SC)
MOVE ′2240101‘TOW.SNOMOVE ′01′ToW.CNOMOVE80TOW.GRADEPUTW(SC)
PUT语句的作用是把工作空间W的数据写人数据库,PUT语句只对一个关系操作
2.删除操作
删除操作使用DELETE语句实现,分为以下两步。
(1)读数据:使用HOLD语旬将要删除的元组从数据库读到工作空间中
(2)删除:使用DELETE语句删除该元组。
eg:删除学号为2240101的学生选课
H
O
L
D
W
(
S
C
)
:
S
C
.
S
n
o
=
2240101
D
E
L
E
I
E
W
HOLD \quad W(SC):SC.Sno=2240101\\DELEIE W
HOLDW(SC):SC.Sno=2240101DELEIEW
eg:删除全部学生的选课信息。
H
O
L
D
W
(
S
C
)
D
E
L
E
I
E
W
HOLD \quad W(SC)\\DELEIE \quad W
HOLDW(SC)DELEIEW
3.修改操作
修改操作使用UPDATE语句实现,分为以下三步。
(1)读数据:使用HOLD语句将要修改的元组从数据库读到工作空间中
(2)修改:利用宿主语言修改工作空间中元组的属性。
(3)送回:利用UPDATE语句将修改后的元组送回数据库中。
eg:将田玲同学转到软件工程系。
H
O
L
D
W
(
S
.
S
d
e
p
t
)
:
S
.
S
n
a
m
e
=
′
田
玲
′
M
O
V
E
′
软件工程
系
′
T
O
S
.
S
d
e
p
t
U
P
D
A
T
E
W
HOLD \quad W(S.Sdept):S.Sname='田玲'\\ MOVE\quad \ '软件工程系'\quad TO \quad S.SdeptUPDATE W
HOLDW(S.Sdept):S.Sname=′田玲′MOVE ′软件工程系′TOS.SdeptUPDATEW
4.2元组关系演算
元组关系演算是以元组变量作为谓词变元的基本对象。
其形式化定义如下:
{
t
∣
P
(
t
)
}
\left\{ t\mid P(t) \right\}
{t∣P(t)}
表示所有使谓词P为真的元组集合,其中,t为元组变量,其变化范围是一个关系,如果元组变量前有“全称”(
∀
\forall
∀)或“存在”(
∃
\exist
∃)量词,则称其为约束变量,否则称为自由变量;P是公式,公式由原子公式和运算符组成。
原子公式有以下三种形式:
(1)R(t):R是关系名,t是元组变量。R(t)表示:t是R中的一个元组。所以关系R可表示为
{
t
∣
R
(
t
)
}
\left\{ t\mid R(t)\right\}
{t∣R(t)}
(2)t[i]
θ
\theta
θu[j]:t和u是元组变量,
θ
\theta
θ是算术比较运算符。
t[i]
θ
\theta
θu[j]表示元组t的第i个分量与元组u的第j个分量之间满足比较关系
θ
\theta
θ。
(3t[i]
θ
\theta
θc或c
θ
\theta
θc[i]表示元组t的第i个分量与常量c之间满足比较关系
θ
\theta
θ。
综上,元组关系演算表达式是由公式与各种运算符(算术比较运算符、量词,逻辑运算符加上小括号)经过有限次的组合得到。
另外,利用元组关系演算可以表达关系代数中的运算,五种基本关系代数运算的元组表达式表示如下。
并:
R
∪
S
=
{
t
∣
t
∈
R
∨
t
∈
S
}
差:
R
−
S
=
{
t
∣
t
∈
R
∧
t
∉
S
}
投影:
∏
A
(
R
)
=
{
t
∣
∃
s
∈
R
(
s
[
A
]
=
t
[
A
]
)
}
选择:
σ
F
(
R
)
=
(
t
∣
t
∈
R
∧
F
(
t
[
A
]
)
)
广义笛卡尔积:
R
(
A
)
×
S
(
B
)
=
{
t
∣
∃
u
∈
R
∃
s
∈
S
(
t
[
A
]
=
u
[
A
]
∧
t
[
B
]
=
s
[
B
]
)
}
并:R \cup S= \left \{ t | t \in R \vee t \in S\right \} \\ 差:R - S= \left \{ t | t \in R \wedge t \notin S\right \} \\ 投影: \prod A(R) = \left \{ t\mid\exists s\in R(s[A]=t[A]) \right \} \\ 选择:\sigma_{F(R)}=(t|t∈R \wedge F(t[A]))\\ 广义笛卡尔积:R(A)\times S(B) = \left \{ t\mid \exist u\in R\exist s\in S(t[A]=u[A]\wedge t[B]=s[B]) \right \} \\
并:R∪S={t∣t∈R∨t∈S}差:R−S={t∣t∈R∧t∈/S}投影:∏A(R)={t∣∃s∈R(s[A]=t[A])}选择:σF(R)=(t∣t∈R∧F(t[A]))广义笛卡尔积:R(A)×S(B)={t∣∃u∈R∃s∈S(t[A]=u[A]∧t[B]=s[B])}
4.3域关系演算
域关系演算是以域变量作为谓词变元的基本对象。
其形式化定义如下:
{
<
t
1
,
t
2
,
t
3
,
.
.
.
,
t
n
>
∣
P
(
t
1
,
t
2
,
t
3
,
.
.
.
,
t
n
)
}
\left \{ <t_1,t_2,t_3,...,t_n>\mid P(t_1,t_2,t_3,...,t_n) \right \}
{<t1,t2,t3,...,tn>∣P(t1,t2,t3,...,tn)}
其中,t,t,…,t。分别是元组变量t的各个分量的域变量,其变化范围是某个值域,P是域演算公式。可以像元组演算一样定义域演算的原子公式和公式,不再重复。用域关系演算表达式查询。
eg:查询成绩大于85分的学生学号、课程号和成绩
{
<
t
1
,
t
2
,
t
3
>
∣
S
C
(
t
!
,
t
2
,
t
3
)
∧
t
>
85
}
\left \{ <t_1 ,t_2,t_3>|SC(t_!,t_2,t_3)\wedge t>85\right \}
{<t1,t2,t3>∣SC(t!,t2,t3)∧t>85}
4.4关系演算的安全性
1.从关系代数操作定义可以得出,任何一个有限关系上的关系代数操作结果都不会导致无限关系和无穷验证,所以关系代数表达式运算总是安全的。
2.而用谓词演算表示关系操时,可能产生无限关系和无穷验证。
3.把不产生无限关系和无穷验证的表达式称为安金表式。
五.关系完整性
5.1 实体完整性(不变性,由关系系统自动支持)
(必须满足的完整性的约束条件)
实体完整性规则:若属性A是基本关系R的主属性,则属性A不能取空。
在关系模型中,一个关系通常对应一个实体集,一个元组对应一个实体。在现实世界中,实体是可区分的,它们具有某种唯一性标识。相应地,在关系模型中以主码作为唯一标识。如果主码取空值,就说明存在某个不可区分的实体这与现实世界中的实体是可以区分的事实相矛盾。因此主码的值不能为空或不能部分为空.
空值是数据库中特有的标量常数,用NULL表示。空值不是0,也不是空字符串,它代表“不知道"或“不存在的值”。
5.2 参照完整性(不变性,由关系系统自动支持)
(必须满足的完整性的约束条件)
参照完整性规则又称为引用完整性规则。现实世界中的实体之间往往存在某种联系,在关系模型中实体及实体间的联系都是用关系来描述的,这样关系与关系之间自然存在引用关系。
参照完整性规则:若属性或属性集X是关系R的主码,X也是关系S的外码,则X在关系S中的取值只允许有两种可能,或者取空值(X的每个属性值均为空值),或者等于R关系中某个元组的主码值。
对参照完整性规则进行以下说明。
(1)外码和相应的主码可以不同名,但必须是定义在同一个域。
(2)关系R和关系S可以是同一个关系,表示了同一个关系中不同元组之间的联系。
(3)外码能否取空值,应视具体问题而定。当外码不是本关系的主属性时,可以取空,否则不能取空值。
设F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码Ks相对应.则称F是基本关系R的外码,并称基本关系尺为参照关系(ReferencingRelation),基本关系S称为被参照关系(Referenced Relation)或目标关系(Target Relation)。
关系之间的联系是通过一个关系的主码和另一个关系的外码实现的。在实体完整性规则中对主码的取值进行了规定,而参照完整性规则就是定义主码与外码之间的引用规则。
举例说明参照完整性规则的应用:
学生选课数据库中有如下三个关系,其中主码用下画线标识。
学生(学号,姓名,性别,年龄,系名)
课程(课程号,课程名,学分,学期)
选课(学号,课程号,成绩)
学生关系的主码是“学号”,课程关系的主码是“课程号”,选课关系的主码是“(学号,课程号)”。选课关系中有两个外码,一个是“学号”,另一个是“课程号”。根据参照完整性规则,选课关系中的“学号”和“课程号”可以取以下两类值。
(1)空值,因为“学号”和“课程号”是选课关系的主码组成成员即主属性,根据实体完整
性规则,它们不能取空值。
(2)非空值,必须取学生关系和课程关系中已存在的元组的主码值。这表示不会存在一个不在册的学生选修了一门学校没开设的课程的情况,即在册的学生选修了学校已开设课程。
课程之间的先修联系可以用下面的关系表示。
课程(课程号,课程名,先修课号)
在该关系中主码是“课程号”,外码是“先修课号”。根据实体完整性规则,“先修课号,的值必须是该关系中已存在的元组的“课程号”值。也可以取空值,表示这门课程没有先修课程。在此课程关系既是参照关系也是被参照关系。
5.3用户定义的完整性
用户定义完整性规则又称为域完整性或语义完整规则:任何关系数据库系统都应该支持实体完整性和参照完整性。除此之外,不同的数据库应用根据其应用环境的不同,往往还需要一些特殊的约束条件,用户定义的完整性就是针对某一具体关系数据库的约束条件。它反映某一具体应用所涉及的数据必须满足的语义要求。系统应提供定义和检验这类完整性的机制,以便用统一的系统方法处理它们,而不要由应用程序承担这项工作。