第二章 关系数据库
一、关系、关系模式和关系数据库
- 域:域是一组具有相同数据类型的值的集合(整数、实数、介于某个取值范围的整数)
例如:D1=SUPERVISOR={张三、李四};D2=SPECIALITY={计算机专业,信息专业};D3=POSTGRADUATE={王五、赵六}
- 笛卡尔积:给定一组域D1、D2、…Dn,D1×D2×Dn={(d1,d2,…dn)|di∈Di,i=1,2,…,n},也就是所有域的所有取值的一个组合,不能重复
- 元组:笛卡尔积中的每一个元素叫做一个n元组,例如(张三,计算机专业,李勇)
- 分量:笛卡尔积元素中的每一个值di叫做一个分量,例如张清枚、计算机专业、李勇、刘晨等
- 基数:若Di为有限集,基数为m(元素的个数),则D1×D2×…Dn的基数为每个m的求积
- 笛卡尔积的表示方法:一张二维表,每行=一个元组,每列=一个域(给出三个域,每个域的基数为2,则基数总数为8)
- 关系:D1×D2…的子集叫做在D1,D2,…上的关系,记作R(D1,D2,…Dn)
- 元组:关系中的每个元素是关系中的元组,通常用t表示
- 关系的表示:二维表,每行对应一个元组,每列为一个列
- 属性:关系中不同列可以对应相同的域。为了加以区分而每列取名字为属性
码
-
候选码:关系中的某一属性组能够唯一的标识一个元组,而其子集不能,则称该属性组为候选码(比如学号+课程号可以匹配成绩表中的唯一一个候选键)
-
主码:若一个关系有多个候选码,则选定其中一个为主码
-
主属性:候选码的主属性
-
非主属性/非码属性:不包含在任何候选码中属性
关系的类别
-
基本关系(基本表或基表):实际存在的表
-
查询表:查询结果对应的表
-
视图表:由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
基本关系的性质
-
列是同质的:每一列分量来自同一个域
-
不同列可出自同一个域
-
行、列的顺序无所谓
-
任意两个元组的候选码不能相同
-
分量必须取原子值
关系模式
关系模式是型,关系是值
关系模式是对关系的描述(元组集合的结构和完整性约束条件)
形式的表示为:R(U,D,DOM,F)
-
R:关系名
-
U:组成该关系的属性名集合
-
D:U中属性所来自的域
-
DOM:属性向域的映像集合
-
F:属性间数据的依赖关系的集合
简记为:R(U)或R(A1,A2,…An)
- A:属性名
关系是关系模式在某一时刻的状态或内容,是动态的,随时间不断变化的
关系数据库:给定的应用程序中,所有关系的集合构成一个关系数据库
-
型:关系数据库的模式,对关系数据库的描述
-
值:关系模式在某一时刻对应的关系的集合
二、关系的完整性
关系模型中的三类完整性约束:
-
实体完整性和参照完整性:关系的两个不变性
-
用户定义的完整性:应用领域需要遵顼的约束条件
实体完整性
- 若属性A是基本关系R的主属性,则属性A不能取空值(不知道、不存在、无意义的值)
实体完整性规则的说明:
-
实体完整性规则是针对基本关系而言的
-
现实世界中的实体是可区分的,它们具有某种唯一性标识
-
关系模型中以主码作为唯一性标识
-
主码中的属性不能取空值(如果为空说明由某个不可标识的实体,与第2点矛盾)
关系间的引用
例如:学生与专业之间的一对多关系,学生关系引用了专业关系的主码“专业号”
-
学生(学号,姓名,性别,专业号,年龄)
-
专业(专业号,专业名)
学生、课程、学生与课程之间的多对多联系,选修关系引用了学生关系的主码“学号”和课程关系的主码“选秀号”
外码
设F是基本关系R的一个或一组属性, 但不是关系R的码。如果F与基本关系S的主码Ks相对应,则称F是R的外码。(外码简单讲就是表的一个非码属性是另一个表的主键)
R为参照关系,S为被参照关系。
-
关系R和S不一定是不同的关系(例如,学生关系班长中的学号对应学生关系本身)
-
目标关系S的主码Ks和参照关系的外码F必须定义子啊同一个域上
-
外码并不一定要与相应的主码同名
例如:学生关系的“专业号”和专业关系的主码“专业号”相对应
参照完整性
若F是基本关系R的外码,对应S的主码Ks,则对于R中每个元组在F上的值必须为:
-
或者取空值
-
或者等于S中某个元组的主码值
也就是说,如果R是一个外码,那么它的值要么为空要么是S中某个主码
例如:专业号要么取空,要么是专业关系中的某个专业号
用户定义的完整性
针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求
例:- 课程(课程号,课程名,学分)
-
“课程号”属性必须取唯一值
-
非主属性“课程名”也不能取空值
-
“学分”属性只能取值{1,2,3,4}
三、关系操作和关系代数
常用的关系操作:
-
查询操作:选择、投影、连接、除、并、差、交、笛卡尔积(查)
-
数据更新:插入、删除、修改(增删改)
操作的对象和结果都是集合
关系代数
一种抽象的查询语言,它用对关系的运算来表达查询
关系代数的运算符有两类:集合运算符和专门的关系运算符
关系代数运算符:
使用的记号
设关系模式为R,以下为关系运算:
-
t∈R标识t是R的一个元组
-
t[Ai]表示元组t中相应于属性Ai的一个分量
-
属性组:A={Ai1,Ai2,…Ain}
-
t[A]表示元组t在属性列A上诸分量的集合
-
元组的连接:上括号,表示将两个元组前后拼接在一起
-
象集:相当于是属性组上值为x的诸元组在Z上分量的集合
集合运算
-
并
-
差
-
交
-
笛卡尔积
选择
F:选择条件,是一个逻辑表达式,取值为真或假
作用是选取使F为真的元组,是从行的角度进行的运算
投影
A:R中的属性列
从R中选出若若干属性列组成新的关系,投影后不仅取消了原关系中的某些列,也有可能取消了某些元组
连接
也成为θ连接
从两个关系的笛卡尔积中选取属性间满足一定条件的元组.(也就是说,我可以从A中选出一个属性,从B中选出一个属性,然后这两个属性如果满足一定条件,就分别把这两个属性所在的元组拼接起来)
-
等值连接:θ为"="的连接运算称为等值连接,从关系R与S的广义笛卡尔积中选取A、B属性值相等的元组
-
自然连接:特殊的等值连接,两个关系中比较的分量必须是相同的属性组,结果中需要把重复的列去掉
连接一般是从行的角度运算
悬浮元组:关系R和S在做自然选择时,R中这些元组被舍弃了(因为它的属性没有一个和S中的属性匹配),丢弃的元组就是悬浮元组
外连接:悬浮元组也保存在结果关系中,其他属性值填空值(NULL)
除运算
例子:
首先找到R和S重复的属性,即B和C。然后我们取看R中剩下的这一列,即为A。然后我们对列A中每一个同种分量进行判断。这里我们可以先看a1.因为a1一共有3个,然后这三行的(B,C)取值分别为(b1,c2)(b2,c3)(b2,c1),而由于这三者正好能够涵盖S中(B,C)中的全部取值,所以a1就是一个R/S的结果。