1.关系数据结构及形式化定义
1.关系
1.概述
单一的数据结构——关系
现实世界的实体以及实体间的各种联系均用关系来表示
逻辑结构——二维表
从用户角度,关系模型中数据的逻辑结构是一张二维表
建立在集合代数的基础之上
2.域,笛卡尔积,元组,基数
域是一组具有相同数据类型的值得集合。例如整数,实数,男和女......
给定一组域D1,D2,D3.....Dn.这些域中可以有相同的(意思就是D1可以是整数域,D2也可以是整数域)。
那么D1,D2,D3.....Dn的笛卡尔积为全部(d1,d2,d3......dn)构成的集合
笛卡尔积中的每一个元素(d1,d2,d3......dn)叫做元组
笛卡尔积元素(元组)中的每一个元素d1叫做分量
若D1,D2,......Dn是有限集合,其中包含的元素个数为M1,M2,......Mn个,那么M1M2......Mn就是这个笛卡尔积的基数(其实就是这个笛卡尔积一共有多少个元素*)
举个例子来说明就是:令
Teacher=(张教授,李教授)
profession=(计算机专业,网络专业)
Student=(小明,小叶)
上述的Teacher就相当于是D1,profession就相当于是D2,Student就相当于是D3
那么他们的笛卡尔积中的元素一共有2×2×2=8个,也就是它的基数为8。例如(张教授,计算机专业,小明),(李教授,计算机专业,小叶)都是其中的一个元组。而在(张教授,计算机专业,小明)这个元组中,张教授,计算机专业,小明这三个元素就叫做分量。
笛卡尔积可以表示成一个二维表,表中的每一列对应一个域,每一行对应一个元组。如下图:
3.关系,元组,属性,候选码
D1×D2×......×Dn的子集叫做在域D1,D2,......,Dn上的关系,表示为R(D1,D2,......,Dn)
其中R是关系名,n是关系的目或度
个人理解:关系是对于域来说的,而元组是对于笛卡尔积来说的。元组就相当于笛卡尔积的其中一个元素,而关系是对于构成笛卡尔积的那几个域来说。
关系中的每个元素叫做关系中的元组,用t表示
当n=1时,关系叫做单元关系或者一元关系;当n=2时,关系叫做二元关系
关系也是一个二维表,每一行对应一个元组,每一列对应一个域,如下图:
属性:关系中不同列可以对应相同的域,为了加以区分,必须给每一列起一个名字,称为属性,n元关系必有n个属性。如上图的SUPERVISOR,SPECIALITY就是属性名
候选码:如果关系中的某一属性组的值能够唯一地标识一个元祖t,那么这个属性组称为候选码。在上图中,SPECIALITY列下的值都是一样的不能区分到底是哪一行,就比如我告诉你我要找一个信息专业的学生,但是这个专业的学生肯定不止一个,所以你就无法找到具体哪个学生。
全码:当全部的属性组都能够唯一地标识一个元祖t,那么这个关系模式的全部属性组都是候选码,叫做全码。
主码:若一个关系有多个候选码,那么选定其中的一个叫做主码。
主属性:候选码中的几个属性叫做主属性,而不在候选码里面的就叫做非主属性或非码属性
4.三类关系
笛卡尔积没有实际的意义,只有笛卡尔积的某个子集才具有真正的意义
(1).基本关系:实际存在的表,是实际存储数据的逻辑表示
(1).查询表:查询结果对应的表
(1).视图表:由基本表或其它视图表导出的表,是虚表,不对应实际存储的数据。
基本关系的性质:
(1).列是同性质的。
(2).不同的列可以出自同一个域
(3).列的顺序无所谓,可以随意交换
(4).任意两个元组的候选码不能相同
(5).行的顺序无所谓,可以随意交换
(6).分量必须取原子值(也就是表中不能还有表)
2.关系模式
1.概述
关系模式是型,关系是值。关系模式是对关系的描述(元组集合的结构,属性间的数据依赖关系集合等等)。
2.定义
R(U,D,DOM,F)
其中,R为关系名,U是组成该关系的属性名的集合,D是属性组U中属性所来自的域,DOM是属性向域的映象集合,F是属性间的数据依赖关系集合
例如,导师和研究生出自同一个域——人,取不同的属性名,并在模式中定义属性向域的映象,即说明他们分别出自哪个域:DOM(SUPERVISORPERSON)=DOM(POSTGRADUATE-PERSON)=PERSON
关系模式通常可以简记为R(U)或者R(A1,A2,...,An)
3.关系模式与关系
关系模式:
对关系的描述,是静态的,稳定的。比如我们看到的一张二维表的表头,即有哪些列构成,每个列的名称,类型啊长度等等;
关系:
关系模式在某一时刻的状态或内容,是动态的,随时间不断变化的。关系是一张二维表的具体数据,除去表头外各数据间的联系。由于二维表中是数据会时常修改,所以呈现出动态。
3.关系数据库
1.定义
在给定的一个应用领域中,所有关系的集合构成一个关系数据库。也就是许多张表构成的集合。
2.关系数据库的型和值
关系数据库的型:关系数据库模式。
关系数据库的值:关系模式在某一时刻对应的关系的集合,简称为关系数据库。
2.关系操作
1.基本关系操作
1.查询:选择,投影,连接,除,并,交,差
2.数据更新:增加,删除,修改
查询的表达能力是其中最主要的部分。
选择,投影,并,差,笛卡尔积是5种基本操作
2.关系数据库的语言分类
1.关系代数语言
用关系的代数语言来表达查询要求ISBL
2.关系演算语言
用谓词来表达查询要求:
-元组关系演算APLHA,QUEL
-域关系演算QBE
3.具有关系代数和关系演算双重特点的语言SQL
3.关系的完整性
1.关系完整性的三类约束
1.实体完整性和参照完整性:
关系模型必须满足的完整性约束条件称为关系的两个不变性,应该由关系系统自动支持。
2.用户定义的完整性:
特定的应用领域需要遵循的约束条件
2.实体完整性
若属性A是基本关系R的主属性,则属性A不能取空值。因为现实世界中的各个实体是可以区分的,即他们具有某种唯一标识,而主码中的主属性就是这些唯一标识,所以不能取空。
3.参照完整性
1.关系间的引用
例如有学生和专业两个实体:
学生(学号,姓名,性别,专业号,年龄),专业(专业号,专业名)
学生关系引用了专业关系的主码—专业号,所以学生关系中的专业号必须是确实存在的专业的专业号。
另外,还有:
学生(学号,姓名,性别,专业号,年龄)
课程(课程号,课程名,学分)
选修(学号,课程号,成绩)
2.外码
如果F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码Ks相对应,则称F是基本关系R的外码。R被称为参照关系,S被称为被参照关系,目标关系。
例如:
学生(学号,姓名,性别,专业号,年龄),专业(专业号,专业名)
其中,专业号是学生关系的外码。学生关系是参照关系,专业关系是被参照关系。
另外,如下图:
学号是主码,班长是外码,它引用的并不是其它关系而是自身,此时,学生关系既是参照关系又是被参照关系。
因此,对于外码这个概念来说,关系R和关系S不一定是不同的关系,但是目标关系S的主码一定要和参照关系的外码定义在同一个域上。外码不一定要和主码同名,当外码与相应的主码不同关系时,往往取相同的名字,就如上面的学生(学号,姓名,性别,专业号,年龄),专业(专业号,专业名)就有相同的名字。
3.参照完整性规则
如果属性F是基本关系R的外码,并且它和基本关系S的主码Ks相对应(R和S不一定是不同关系),那么对于R中的每个元组在F上的值必须为空值或者等于S中某个元祖的主码值。
4.用户自定义的完整性
- 针对某一具体关系数据库的约束条件,反映某一个具体应用所涉及的数据必须满足的语义要求。
- 关系模型应提供定义和检验这类完整性的机制,以便用统一的系统方法来处理他们,而不要由应用程序来承担这一功能。
例如:课程(课程号,课程名,学分)
- 课程号属性必须取唯一值
- 非主属性课程名也不能取空值
- 学分只能取正整数,且只能{1,2,3,4}其中之一
4.关系代数
1.概述
2.传统的集合运算
在做关系运算的时候,两个关系要属于同一类,例如学生这个关系和课程这个关系不能进行并操作运算。即需要满足以下条件:
- 具有相同的目(即两个关系都有n个属性)
- 相同的属性取自同一个域
现在有R和S两个关系进行如下运算,得到的结果如下所示:
1.并:属于R或者属于S
2.差:属于R但是不属于S
3.交:既属于R又属于S
4.笛卡尔积:
如果是笛卡尔积,那么关系的目可以不同,就是从R中取出一个元素和S中取出一个元素构成新的一个元素。
3.专门的关系运算
1.一些记号
例如,在上图中,整个表就是一个关系R(SUPERVISOR,SPECIALITY,POSTGRADUATE),而第一行(张清玫 信息专业 李勇)就是R中的一个元祖t,所以t[SUPERVISOR]=张清玫
例如,还是在上图中,A={SUPERVISOR,SPECIALITY},而第一行(张清玫 信息专业 李勇)就是R中的一个元祖t,所以t[A]=(张清玫,信息专业),A拔就={POSTGRADUATE}
象集可以理解为在X属性上指定一个值例如X=2,把X=2的元组取出来,剩下的就是X的象集。如下图中的例子:
如上面有三张表分别为:学生关系,课程关系,选修关系
2.选择
- 选择又称为限制,它是单目操作,不像加法等需要两个或以上的关系来操作
- 含义:在关系R中选择出符合给定条件F(使逻辑表达式F为真)的诸个元组
例如:
3.投影
含义:从R中取出若干属性列组成新的关系
例如,将Student关系中的学生姓名和学生所在系这两个属性列取出来,表达式如下:
结果为:
4.连接
含义:从两个关系的笛卡尔积中选取属性间满足一定条件的元组
等值连接:
自然连接:
例如,现在有下面两个关系R和S:
一般连接的结果:
等值连接的结果:
自然连接的结果:
外连接
关系R和S的外连接结果如下:
如上图,左外连接就是保留R中本来要丢弃的,右外连接就是保留S中本来要丢弃的。因此,左外连接就是在外连接的基础之上去掉最后一行(S),右外连接就是在外连接的基础之上去掉倒数第二行(R)。
5.除
例如:
首先,R和S具有相同的属性列B和C。在R中,A的取值有a1,a2,a3,a4四种选择,当去a1时,象集为b1,c2;b2,c3;b2,c1,可以发现这些象集包含了关系S在B和C属性列上的全部值,因此a1就是R除S的结果。
5.关系演算
- 关系演算以数理逻辑中的谓词演算为基础
- 按照谓词变元不同可以进行分类:
1.元组关系演算:以元组变量为谓词变元的基本对象,元组关系演算语言ALPHA
2.域关系演算:以域变量为谓词变元的基本对象,域关系演算语言QBE
1.元组关系演算语言ALPHA
由E.F.Codd提出,语句可以分为两大类:
- 检索语句:GET
- 更新语句:PUT,HOLD,UPDATE,DELETE,DROP
1.检索操作
简单检索:
GET (工作空间名) (表达式1)
例如:查询所有被选修的课程号码:GET W (SC.Cno)
;查询所有学生的数据:GET W (Student)
限定检索:
GET (工作空间名) (表达式1) :条件
例如:查询信息系(IS)中年龄小于20岁的学生的学号和年龄:GET W (Student.Sno,Student.Sage):Student.Sdept='IS'ΛStudent.Sage<20
带排序的检索:查询计算机科学系(CS)学生的学号,年龄,结果按照年龄降序排列:
GET W (Student.Sno,Student.Sage):Student.Sdept='CS' DOWN Student.Sage
带定额的检索:取出一个信息系学生的学号:GET W (1) (Student.Sno):Student.Sdept='IS'
查询信息系年龄最大的三个学生的学号及其年龄,结果按照年龄降序排序:GET W (3) (Student.Sno,Student.Sage):Student.Sdept='IS'Λ DOWN Student.Sage
用元组变量的检索:
元组变量的含义:表示可以在某一关系范围内变化(也称为范围变量)
元组变量的用途:简化关系名;操作条件中使用量词时必须用到元组变量
定义元组变量:格式:RANGE 关系名 变量名
(注意:一个关系可以设置多个元组变量)
用存在量词
∃
的检索:查询至少选修一门其先行课为6号课程的学生名字
RANGE Course CX
SC SCX
GET W (Student.Sname):∃SCX(SCX.Sno=Student.Sno)Λ∃CX(CX.Cno=SCX.CnoΛCX.Pcno='6')
带有多个关系的表达式的检索:查询成绩为90分以上的学生名字与课程名字
RANGE SC SCX
GET W (Student.Sname,Course.Cname):∃SCX(SCX.Grade>=90ΛSCX.Sno=Student.SnoΛSCX.Cno=Course.Cno)
用全称量词
∀
的检索:查询不选1号课程学生的名字
RANGE SC SCX
GET W (Student.Sname):∀SCX(SCX.Sno≠Student.SnoVSCX.Cno≠'1')
这里的意思就是选择不选一号课程的学生的名字或者你选了1号课程但是不在我的学生名单里面,二者中的一个都满足条件
用存在量词表示:
RANGE SC SCX
GET W (Student.Sname):┐∃SCX(SCX.Sno=Student.SnoΛSCX.Cno='1')
∀任意
与┐∃不存在
虽然字面意思不同,但表达的意思都属于全称量词,这里的意思就是不存在选一号课程的在我的学生名单里面的学生。
用两种量词的检索:查询选修了全部课程的学生姓名
RANGE Course CX
SC SCX
GET W (Student.Sno):∀ CX ∃SCX (SCX.Sno=Student.SnoΛSCX.Cno=CX.Cno)
用蕴含的检索:查询最少选修200215122学生所选课程的学号
RANGE Course CX
SC SCX
SC SCY
GET W (Student.Sno):∀ CX (∃SCX (SCX.Sno='200215122'ΛSCX.Cno=CX.Cno) —> ∃SCY(SCY.Sno=Student.SnoΛSCY.Cno=CX.Cno))
箭头的前半句描述的是"标准"学生也就是学号为200215122的学生SCX,后半句描述的就是我要寻找的学生SCY
聚集函数(内置函数,可以简化一些操作):
例如:
(1).查询学生所在系的数目:GET W (COUNT(Student.Sdept))
COUNT函数在计数时会自动排除重复值
(2).查询信息系学生的平均年龄:GET W (AVG(Student.Sage):Student.Sdept='IS')
简单来说其实就是表达式1(第一个括号)里面写的是最后要得到的属性组,:
后面的是判断条件,DWON|UP后面的就是指排序的关键字(DOWN降序UP升序)。
2.更新操作
- 修改操作
- 插入操作
- 删除操作
修改操作:(1).用HOLD语句将要修改的元组从数据库中读取到工作空间中:
HOLD 工作空间名 (表达式1) [:操作条件]
HOLD语句是带上并发控制的GET语句。(2).用宿主语言修改工作空间中元组的属性。(3).用UPDATE语句将语句修改后的元组送回数据库中:UPDATE 工作空间名
例如:把200215121学生从计算机系转到信息系HOLD W (Student.Sno,Student.Sdept):Student.Sno='200215121' (从Student关系中读出95007学生的数据) MOVE 'IS' TO W.Sdept (用宿主语言进行修改) UPDATE W (把修改后的元组送回到Student关系)
插入操作:(1).用宿主语言在工作空间中建立新的元组。(2).用PUT语句把该元组存入指定的关系中:
PUT 工作空间名 (关系名)
PUT语句只对一个关系操作,关系操作中的聚集函数
例如:学校新开设了一门2学分的课程"计算机组织与结构",其课程号为8,直接先行课为6号课程,插入该课程元组:MOVE '8' TO W.Cno MOVE '计算机组织与结构' TO W.Cname MOVE '6' TO W.Cpno MOVE '2' TO W.Ccredit PUT W (Course)
删除操作:(1).用HOLD语句将要删除的元组从数据库中读取到工作空间中:(2).用DELETE语句删除该元组:
DELETE 工作空间名
例如:200215125学生因某些原因退学,删除该学生元组:HOLD W (Student):Student.Sno=‘200215125’ DELETE W
将学号200215121改为200215126:HOLD W (Student):Student.Sno='200215121' DELETE W MOVE '200215126' TO W.Sno MOVE '李勇' TO W.Sname MOVE '男' TO W.Ssex MOVE '20' TO W.Sage MOVE 'CS' TO W.Sdept PUT W (Student)
删除全部学生:HOLD W (Student) DELETE W
为保证参照完整性,删除Student中的元组时要对应地删除SC中的元组:HOLD W (SC) DELETE W
总结:
检索操作:GET 工作空间名 [(定额)] (表达式1) [:操作条件][DOWN|UP 表达式2]
插入操作:建立一个新的元组(直接使用MOVE
语句给各属性赋值)——PUT
语句放入
修改操作:HOLD
取出元组数据——MOVE
语句修改属性——UPDATE
把修改完的元组重新放入关系中
删除操作:HOLD
取出元组数据——DELETE
语句删除元组
2.域关系演算语言QBE
- 一种典型的域关系演算语言,由M.M.Zloof提出,以元组变量的分量即域变量作为谓词变元的基本对象。
- 是一种基于屏幕表格的查询语言;查询要求:以填写表格的方式构造查询;用示例元素(域变量)来表示查询结果可能的情况;查询结果以表格形式显示。
1.QBE的操作框架:
2.检索操作
简单查询:求信息系全体学生的姓名
(1).用户提出要求
(2).屏幕显示空白表格:
(3).用户在最左边一栏输入要查询的关系名Student:
(4).系统显示该关系的全部属性名:
(5).用户在上面构造查询要求:
李勇是示例元素,即域变量
(6).屏幕显示查询结果:
构造查询的几个要素:
- 示例元素,即域变量,一定要加下划线(示例元素是这个域中可能的一个值,它不必是查询的结果)。
- 打印操作符P,实际上是在屏幕上显示。
- 查询条件:可以使用运算符=,<,>,...,=可以省略。
例如:
查询全体学生的全部数据:
或者
条件查询:求年龄大于19岁的学生的学号:
求计算机科学系年龄大于19岁的学生的学号:或者
查询既选修1号课程又选修2号课程的学生的学号(条件查询—与条件):
查询计算机科学系的或者年龄大于16的学生的学号(条件查询—或条件):注意这里的Sno属性下的两个示例元素并不相同,如果相同那就是必须同时满足计算机科学系和年龄大于19这两个条件了。
查询选修1号课程的学生姓名(条件查询—多表连接):
查询没有选修1号课程的学生的姓名(条件查询—非条件):
查询有两个人以上选修的课程号:
QBE中的聚集函数:
例如:查询信息系学生的平均年龄:
查询结果排序:
- 升序:在对应列中填入
AO.
- 降序:在对应列中填入
DO.
- 多列排序:用
AO(i).
,DO(i).
表示,i值越小,优先级越高(所谓的优先级就是指第一优先级碰到相同的时候看第二优先级的属性)
例如:对全体男生的姓名,要求查询结果按照所在系升序,对相同系的学生按照年龄降序排序。
3.更新操作
修改操作(U):例如把200215121学生的年龄改成18岁:
或者将操作符U放在关系名上或者把200215121学生的年龄增加一岁
将计算机系的所有学生的年龄都增加一岁:
插入操作(I):例如把信息系女生200215701,姓名张三,年龄17存入数据库中:
删除操作(D):例如删除学生200215089: