关系数据库
数据模型的三要素 :关系数据结构、关系操作集合、关系完整性约束。
关系数据库结构及其形式化定义
关系
域
域是一组具有相同数据类型的值的集合。
笛卡尔积
笛卡尔积是域上的一种集合运算。
给定一组域
其中,每一个元素
一个域允许的不同取值的个数称为这个域的 基数 。
关系
关系 :
候选码 :若关系中的某一属性的值能 唯一地表示一个元组,而其子集不能 ,则称该属性组为 候选码 。
主码 :若一个关系中有多个候选码,则选定其中一个为主码。
主属性 :候选码的诸属性称为主属性。
非主(码)属性 :不包含任何候选码中的属性称为非主属性,或非码属性。
全码 :在最简单的情况下,候选码只包含一个属性。但是在最极端的情况下,关系模式的 所有属性都是这个关系模式的候选码 ,称为全码。
关系的三种类型 : 基本关系 (通常又称为基本表或基表)、 查询表 和 视图表 。
关系模式
在关系数据库中,关系模式是型,关系是值。
定义:关系的描述称为关系模式,它可以形象的表示为:
关系操作
基本操作关系
常用关系关系操作:
查询操作
- 基本: 选择、投影、并、差、笛卡尔积
- 推导:连接、除、交。
插入、删除、修改操作
特点:操作的对象和结果都是集合。
关系数据语言的分类
关系的完整性
关系模型中有三类完整性约束: 实体完整性 、 参照完整性 和 用户定义完整性 。
关系的 两个不变性 :实体完整性和参照完整性是关系模型必须满足的完整性约束条件。
实体完整性
规则 :若属性(指一个或一组属性) A 是 基本关系 R 的 主属性 ,则 A 不能取空值 (null value)。
例如:在选修( 学号 , 课程号 ,成绩)关系中,“学号、课程号”为主码,那么这两个属性不能取空值。
参照完整性
外码 :设 F 是基本关系 R 的一个或一组属性,但不是关系 R 的码,
显然,目标关系 S 的主码
规则 :若属性(或属性组)F 是基本关系 R 的外码,它与基本关系 S 的主码
- 或者 取空值 (F 的每个属性值均为空值);
- 或者 等于 S 中某个元组的主码值 。
用户定义的完整性
不同关系数据库系统根据其应用环境不同,往往还需要一些特殊的约束条件。用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。
关系代数
关系代数是一种很抽象的查询语言,用对关系的运算来表达查询。
运算符 | 含义 | |
集合运算符 | ∪ | 并 |
- | 差 | |
∩ | 交 | |
× | 笛卡尔积 | |
专门运算符 | σ | 选择 |
Π | 投影 | |
⋈ | 连接 | |
÷ | 除 | |
传统的集合运算
- 并:
,结果仍为 n 目关系。 - 差:
,结果仍为 n 目关系。 - 交:
,结果仍为 n 目关系。 - 笛卡尔积:
,若 R 为 n 目,S 为 m 目的关系,结果为(n+m)目的关系。
专门的关系运算
选择:
,其中 F 表示选择条件,F 的基本形式为: ,其中 表示比较运算符,它可以是 , 等是属性名。在基本选择条件的基础上可以进一步进行逻辑运算,即求非( )、与( )、或( )运算。 投影:
,其中 A 为 R 中的属性列。 连接:
, 为”=”的连接运算称为等值连接 。 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是同名属性组,并且在结果中把重复的属性去掉。 悬浮元组 :在连接过程中,有些被舍弃的元组称为悬浮元组。 外连接 :如果将悬浮元组保留在结果关系中,其他属性填上空值(NULL),这就是外连接。 - 左外连接 :只保留左边关系中的悬浮元组叫做左外连接。
- 右外连接 :只保留右边关系中的悬浮元组叫做右外连接。
除运算:设关系 R 除以关系 S 的结果为关系 T,则 T 包含所有在 R 但不在 S 中的属性及其值,且 T 的元组与 S 的元组的所有组合都在 R 中。 表示为:
,其中 为 在 R 中的象集, 。 除操作是同时从行和列的角度运算的。
注:
象集:给定一个关系
关系演算
元组关系演算语言 ALPHA
元组关系演算是以元组变量作为谓词变元的基本关系演算表达形式。一种典型的元组关系演算语言是 ALPHA 语言。
ALPHA 语言主要有 GET、PUT、HOLD、UPDATE、DELETE、DROP 语句,其基本格式是: 操作语句 工作空间名(表达式):操作条件 。
检索操作(GET)
简单检索
简单检索,即不带条件的检索。
例:查询所有被选修课程的课程号码。
GET W(SC.Cno)
例:查询所有学生的信息。
GET W(Student)
带条件的检索
带条件的检索即限定的检索,由冒号后面的逻辑表达式给出查询条件。
例:查询信息系(IS)中年龄小于20岁的学生的学号和姓名。
GET W(Student.Sno,Student.Sage):Student.Sdept='IS'∧Student.Sage<20
带排序的检索
当升序排列时使用 UP,后面紧跟排序的属性名,DOWN 代表降序排序。
例:查询计科系(CS)学生的学号、年龄,并按年龄降序排序。
GET W(Student.Sno,Student.Sage):Student.Sdept='CS' DOWN Student.Sage
带定额的检索
所谓带定额的检索是指规定了检索的元组个数,方法是在 W 后面的括号中加上定额数量。
例:取出一个信息系学生的姓名。
GET W(1)(Student.Sno):Student.Sdept='IS'
例:查询信息系年龄最大的三个学生的学号及其年龄,并按年龄降序排列。
GET W(3)(Student.Sno,Student.Sage):Student.Sdept='IS' DOWN Student.Sage
用元组变量的检索
因为元组变量是在某一关系范围内变化的,所以元组变量又称范围变量,主要有两方面的用途:
简化关系名 在实际处理问题时,可以设一个较短名字的元组变量来简化关系名。
例:查询信息系学生的名字。 RANGE Student X GET W(X.Sname):X.Sdept='IS'
操作条件中使用量词时必须用元组变量。 元组变量是动态或逻辑的概念,一个关系可以设多个元组变量,每个元组变量独立地代表该关系中的任一元组。
用存在量词的检索
例:查询选修了2号课程的学生名字。
RANGE SC X
GET W(Student.Sname):∃X(X.Sno=Student.Sno∧X.Cno='2')
例:查询选修了这样课程的学生学号,其直接先行课是6号课程。
RANGE Course CX
GET W(SC.Sno):∃CX(CX.Cno=SC.Sno∧CX.Pcno='6')
例:查询至少选修一门其先修课为6号课程的学生姓名。
RANGE Course CX
SC SCX
GET W(Student.Sname):∃SCX∃CX(SCX.Sno=Student.Sno∧CX.Cno=SCX.Cno∧CX.Pcno='6')
/*表示从学生关系中当前记录取名字,条件是该学生存在选修关系SCX,还存在某课程CX,其先修课程为6,课程CX为SCX所含的课程*/
带有多个关系的表达式的检索
上面例子中虽然查询时可能会涉及多个关系,但查询结果都在一个关系中,即查询结果表达式中只有一个关系,实际上表达式中是可以有多个关系的。
例:查询成绩为90分以上的学生姓名和课程名。
RANGE SC SCX
GET W(Student.Sname,Course.Cname):∃SCX(SCX.Grade≥90∧SCX.Sno=Student.Sno∧Course.Cno=SCX.Cno)
/*分别从学生表和课程表的当前记录中取学生姓名和课程名,条件是有选修关系SCX存在,并选修了该课程,成绩≥90分*/
用全称量词的检索
例:查询不选1号课程的学生姓名。
RANGE SC SCX
GET W(Student.Sname):∀SCX(SCX.SNO≠Student.Sno∨SCX.Cno≠'1')
/*从学生表的当前记录中取姓名,条件是对任意的选修元组SCX都满足:该选修元组不是当前检索学生的选修记录或者是该学生的选修记录单课程号不是1*/
同样也可以用存在量词检索:
RANGE SC SCX
GET W(Student.Sname):¬∃SCX(SCX.Sno=Student.Sno∧SCX.Cno='1')
/*从学生表的当前记录中取姓名,条件是该学生不存在对1号课程的选修元组SCX*/
用两种量词的检索
例:查询选修了全部课程的学生姓名。
RANGE Course CX
SC SCX
GET W(Student.Sname):∀CX∃SCX(SCX.Sno=Student.Sno∧SCX.Cno=CX.Cno)
/*从学生表中取学生姓名,条件是对任意课程CX该学生都有选课关系SCX存在并选了CX这门课*/
用蕴含的检索
例:查询最少选修了学号为2024001的学生所选课程的学生学号。
RANGE Coures CX
SC SCX
SC SCY
GET W(Student.Sno):∀CX(∃SCX(SCX.Sno='2024001'∧SCX.Cno=CX.Cno)→∃SCY(SCY.Sno=Student.Sno∧SCY.Cno=CX.Cno))
/*从学生表的当前记录取学号,条件是对任意课程CX都有:如果存在有2024001学生的选修记录SCX,其选修课程是CX,则当前被检索学生比存在选修元组SCY也选修了课程CX*/
聚集函数
在使用查询语言时,经常要做一些简单计算,为了方便用户,关系数据语言中建立了有关这类运算的标准函数库供用户选用。这类函数通常称为集函数,关系演算中提供了下列集函数:
函数名 | 功能 |
---|---|
COUNT | 对元组计数 |
TOTAL | 求总和 |
MAX | 求最大值 |
MIN | 求最小值 |
AVG | 求平均值 |
更新操作(UPDATE)
修改操作
修改操作用 UPDATE 语句实现,首先用 HOLD 语句将要修改的元组从数据库中读到工作空间中,然后用宿主语言修改工作空间中的元组的属性,最后用 UPDATE 语句将修改后的元组送回数据库中。
把2024001学生从计算机科学系转到信息系。
HOLD W(Student.Sno,Student.Sdept):Student.Sno='2024001' /*从S关系中读出2024001学生数据*/
MOVE 'IS' TO W.Sdept /*用宿主语言进行修改*/
UPDATE W /*把修改后的元组送回S关系*/
插入操作
插入操作用 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) /*把W中的元组插入指定关系C中*/
删除操作
删除操作用 DELETE 语句实现,用 HOLD 语句把要删除的元组从数据库中读到工作空间中,再用 DELETE 语句删除该元组。
例:2024001学生退学,删除该学生元组
HOLD W(Student)=Student.Sno='2024001'
DELETE W
例:将学号2024001改为2024002.#该属性为主码,应先执行删除操作。
HOLD W(Student):Student.Sno='2024001
DELETE W
MOVE '2024002' TO W.Sno
MOVE '咸鱼' To W.Sname
MOVE '男' TO W.SEX
MOVE '20' TO W.AGE
MOVE 'CS' TO W.DEPT
PUT W(Student)
元组关系演算
在元组关系演算系统中,称
一个元组演算表达式
域关系演算语言 QBE
域关系演算以元组变量的分量(即域变量)作为谓词变元的基本对象。
QBE 具有图形用户界面,允许用户通过在屏幕上创建示例表来编写查询。QBE 特别适合于不太复杂、可用几个表描述的查询。