2.1关系数据结构及其形式化定义
前面说过,数据模型由以下三部分构成
- 数据结构
- 数据操作
- 数据的完整性约束条件
而如今最为重要的数据模型便是关系模型。本书所学的关系数据库就是支持关系模型的数据库系统,因此本章重点研究的也是以下三个部分
一:关系
前面说过,关系模型建立在严格的数学概念之上,只包含单一的数据结构——关系,在用户看来关系就是一张二维表
(1)域
域:是一组具有相同数据类型的值的集合
如自然数、整数、实数
(2)笛卡尔积
笛卡尔积:是一种域上面的集合运算,得到每个域中元素的所有可能的组合,它可以表示为一张二维表
如果让他们做笛卡尔积,也就是排列组合,那么就会形成下面一张二维表
由此可知,该笛卡尔积的基数为2×2×3=12,也即有12个元组
(3)关系
R:关系名
n:关系的目或度(n=1时称为单元关系,n=2时称为二元关系)
关系既然是笛卡尔积的子集(有限子集),所以关系也是一张二维表
表的每一行对应一个元组,表的每一列对应一个域
由于域可以相同,为了区分,必须对每列起一个名字,称为属性(比如上面的表中研究生和导师都是人,为了区分,所以才取了不同的名字)
码相关概念:
以下面关系为例
候选码:若关系中的某一属性组(注意是组不是某单个属性,当然有时属性组也可能只有一个属性)能唯一地标识一个元组,而其子集不能,则该属性组称之为候选码
至于什么是元组嘛,这是笛卡尔积当中的概念:
上面关系中,学号是无法区分的,因为学号虽然不重复,但一个学生可能会对应多个课程,这就导致学号无法唯一标识一个元组。因此这里(学号,课程名)可以作为一个候选码
需要注意的是候选码不一定只有一个,可能有多个,只要满足条件即可,但在本例中确实只有一个
超码:能够唯一标识一条记录的属性或属性集,超码是候选码的扩充,候选码是最小的超码
上面关系中,(学号、课程名)是候选码,那么它的超集,例如(学号、课程名、姓名)、(学号、课程名、性别)就是超码
主码:某个能够唯一标识一条记录的最小属性集(候选码中的“人选之子”)
候选码可能有多个,但是数据库设计者在设计时会根据实际需求选择一个候选码作为主码
外码:不是主码且在别的关系中存在
全码:这是一种特殊情况:关系的所有属性组是这个关系模式的候选码
主属性和非属性:包含在候选码中的属性(注意是集合,不是某个候选码)称为主属性;不包含在候选码中的属性称为非主属性
上面关系中,姓名、性别和期末分数都是非主属性
关系的三种类型
关系可以有三种类型
- 基本关系(又称为基本表):实际存在的表,是实际存储数据的逻辑表示
- 查询表:查询结果对应的表
- 视图表:由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
二:关系模式
- 型(type):对某一类数据的结构和属性的说明
- 值(value):是型的一个具体赋值
在关系数据库中,关系模式就是型,关系就是值,关系模式是对关系的描述,具体来说要描述以下方面
- 元组集合的结构(由哪些属性构成、这些属性来自哪些域、属性与域之间的映像关系)
- 元组语义以及完整性约束
- 属性之间的数据依赖关系
2.2关系操作
(1)基本的关系操作
关系模型常用关系操作如下。
(2)关系数据语言的分类
关系数据语言可分为三类,如下
- 关系代数语言
- 关系演算语言
- 结构化查询语言
2.3关系的完整性
关系完整性规则是对关系的某种约束条件,这些约束条件实际上是现实世界的要求,例如性别只能有男、女两种取值
关系模型中有如下三类完整性约束:
- 实体完整性(entity integrity)
- 参照完整性(referential integrity)
- 用户自定义完整性(user-defined integrity)
其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称为关系的两个不变性
(1)实体完整性
实体完整性:若属性A是基本关系R RR的主属性,则属性A不能取空值
例如“选修(学号,课程号,成绩)”关系中,若(学号,课程号)为主码,则学号和课程号都不能取空值
(2)参照完整性
A:参照关系
【例1】如下两个关系中,学生关系引用了专业关系的主码“专业号”,也就是说,学生关系中的某个属性的取值需要参照专业关系的属性取值
【例2】如下三个关系中,选修关系引用了学生关系的主码“学号”和课程关系的主码“课程号”,也就是说,选修关系中某些属性的取值需要参照其他关系的属性取值
【例3】还有,同一关系内部也可能存在引用关系。比如在学生(学号,姓名,性别,专业号,年龄,班长)关系中,“学号”属性是主码,“班长”属性表示该学生所在班级的班长的学号,它引用了本关系“学号”属性,即“班长”必须是确实存在的学生的学号
详解参照完整性规则:(要么没有,如果有一定是在存在的元素中去找)
- 要么取空值(此时F的每个属性值均为空值)
- 要么等于S中某个元组的主码值
因此对于【例1】,学生关系中每个元组的专业号只能取下面两类值
- 空值:表示该学生尚未分配专业
- 非空值(且该值必须是专业关系中某个元组的专业号值):表示该学生不能分配到一个不存在的专业中
而对于【例2】,按照道理来说“学号”和“课程号”也可以取两类值,但是“学号”和“课程号”它作为的是选修关系的主码,所以如果取空值的话将会违背实体完整性规则
(3)用户自定义完整性
用户自定义完整性1针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求,例如某个属性必须取唯一值,某个非主属性不能取空值等等
2.4关系代数
传统的集合运算
(1)并(union)
并:对于关系R和S,并操作就是将两个关系上下拼在一起形成一个新的关系,记为R∪S
(2)差(except)
差:对于关系R和S,求他们的差,就是在R中去掉两个关系中所有相同的行,形成一个新的关系,记为R-S
(3)交(intersection)
交:对于关系R和S,求他们的交,就是选出两个关系中所有相同的行,形成一个新的关系,记为R∩S
所以R∩S=R -( R − S )
(4)笛卡尔积(cartersian product)
笛卡尔积:对于关系R和S,求他们的笛卡尔积,就是两个关系所有元组的不同排列组合,形成一个新的关系,记为R×S
专门的关系运算
注意:在下面的叙述中有时会用到如下三种关系
- 学生关系Student
- 课程关系Course
- 选修关系SC
(1)选择(selection)
选择:从行的角度出发,在关系R RR中选择满足条件的元组然后组成新的关系。“满足条件”意味着有条件表达式,其运算符如下
此表格中,都是选择符号下面,建立关系可以用到的运算符
**例如:**可在关系Student中查询所有IS系的学生,查询结果形成一个关系,记为$σ
Sdept=
′
IS
′
(Student)$
再比如可在关系Student中查询所有年龄小于20的学生
σ
S
a
g
e
<
20
(
S
t
u
d
e
n
t
)
σ Sage<20 (Student)
σSage<20(Student)
(2)投影(projection)
选择:从列的角度出发,选择满足条件的若干属性列组成新的关系
投影之后取消了原关系中的某些列,当然也有可能会取消某些元祖(因为一旦取消了某些属性列后就极有可能出现重复行),所以一定注意消除完全相同的行(有消除重复行的功能)
比如在关系Student中查询都有哪些系
$∏ S d e p t ( S t u d e n t )
$
注意投影要取消重复的CS元组
(3)连接(join)
A:等值连接和自然连接
等值连接:可以按照如下步骤考虑,最终形成新的关系,记为
- 首先找到关系R和S中属性相同的列
- 然后找到两列中相同的元素
- 将相同元素所在的行组成新的一行,需要用【关系.属性】的格式区两个关系中相同的属性
自然连接:它是一种特殊的等值连接,在等值连接的结果中去掉重复列即可
B:外连接
悬浮元组的概念:R和S在做自然连接时,R中某些元组有可能在S中不存在公共属性上值相等的元组,就会造成R RR中这些元组在操作时被舍弃(反过来S SS也是这样)。例如上图自然连接中就舍弃了R RR的第4个元组和S SS的第5个元组
外连接:若将悬浮元组保留在自然连接的结果中,而在其他属性上填NULL,那么这种连接就叫做外连接,同时
- 左外连接:只保留左边关系R中的悬浮元组
- 右外连接:只保留右边关系R中的悬浮元组
(4)除(division)
除:是笛卡尔积的逆运算,对于关系R和S,求R÷S可按如下步骤考虑
- 研究对象是R和S中相同的属性列
- 在R中挑选元祖,所挑选的元组一定满足它的属性均出现在S对应相同属性列的所有属性集合内
除法相关例题
2.10 查询至少选修1号课程和2号课程的学生…
本章习题
student(sno,sname,ssex,sage,sdept)couse(cno,cname,cpno,credit),sc(sno,cno,grade)用关系代数表达下列查询。
- 查询计科系女生的学号与姓名
- 查询所选课程至少有一门成绩大于70分的学生的学号
- 查询所选课程成绩全部大于70分的学生的学号
- 查询既选修了1号课程又选修了3号课程的学生学号
- 查询选修了1号课程但没有选修3号课程的学生学号
- 查询选修了1号课程或选修了3号课程的学生学号
- 查询每门课的直接先修课程号
- 查询每门课的间接先修课程号
- 查询选修了数据库这门课的学生的学号与姓名
- 查询选修了全部课程的学生的学号与姓名