关系代数与演算
来自《数据库系统概论(第6版)》第二章
关系代数
假设关系
和 具有相同的目 ,且相应的属性取自同一个域, 是元组变量。
- 并
关系
- 差
关系
- 交
关系
- (广义)笛卡尔积
加上"广义"的原因是这里笛卡尔积的元素是元组。
两个分别为
- 选择
在关系
- 投影
关系
- 连接
从两个关系的笛卡儿积中选取其属性间满足一定条件的元组:
自然连接:特殊的等值连接,要求两个关系中进行比较的分量必须是同名的属性列,且在结果中将重复的属性列去掉。直接用
- 除
设关系
象集:给定一个关系
。当 时, 在 中的象集为: 可以理解为对于一个给定的取值
,其对应的在关系 中 的取值的集合。 然后除运算就是指所有满足其在关系
中 的取值的集合能够包含关系 中所有 取值集合所对应的关系 中的 。
一些例题
试用关系代数完成如下查询:
查询李勇同学选修的课程中考试及格的课程名。
关系演算
元组关系演算语言ALPHA
- 检索操作
最难的操作
语句格式:GET 工作空间名【(定额)】 (表达式1)【:操作条件】【DOWN/UP 表达式2】
根本看不懂,这里举几个例子
还是这三张表
(1)简单检索
查询所有被选修的课程的课程号:
查询信息系(IS)中年龄小于20岁的学生的学号和年龄:
查询计算机科学系(CS)学生的学号、年龄,结果按年龄降序排序:
取出一个信息系学生的学号:
元组变量:表示可以在某一关系范围内变化
用途:1、简化关系名;2、操作条件中使用量词(
)时必须用元组变量。 定义元组变量:
关系名 变量名 一个关系可以设多个元组变量
(6)用存在量词的检索
查询选修2号课程的学生名字。
(7)带有多个关系的表达式的检索
查询成绩为90分以上的学生名字与课程名字。
查询不选1号课程的学生名字。
是不是有点抽象,其实一般人应该会这么写:
可以从下式转换为上式(存在量词转化为全称量词)。但是可以理解上式的含义:选定Student表的一行,对于表SC中的每一个条目,要么学号不为Student表所对应的学号,要么等于对应的学号,但是都满足课程号不为1.
(9)用两种量词的检索
查询选修了全部课程的学生姓名。
有点抽象,这里我理一下。
首先,我们固定表Student的一个元组,然后对该元组进行判断:
1、对于表Course的所有项,都存在表SC的一项,满足二者的Cno相同
2、然后对于存在的表SC的这一项,都需要满足它和表Student所固定元组的Sno相同
所有题目的思路都应该是这样的:固定GET W里的变量,然后判断条件是否为真
(10)用蕴含的检索
查询最少选修了201215122学生所选课程的学生学号。
求解思路是这样的:首先固定Student.Sname
然后对Course的每一门课程,看它是否被201215122选,如果选了的话,再判断是否也被Student对应学生选。这是一个蕴含关系。
(11)聚集函数
函数名 | 功能 |
---|---|
COUNT | 对元组计数 |
TOTAL | 求总和 |
MAX | 求最大值 |
MIN | 求最小值 |
AVG | 求平均值 |
查询学生所在系的数目:
一些例题
呃呃呃,还是这三个表:
试用元组关系演算语言ALPHA完成如下查询:
查询李勇同学选修的课程中考试及格的课程名。
这里要把一门课都没选的学生给排除掉
- 修改操作
修改操作用UPDATE语句实现,其步骤是:
- 用HOLD语句将要修改的元组从数据库读到工作空间中
- 用宿主语言修改工作空间中元组的属性值
- 用UPDATE语句将修改后的元组送回数据库
把201215121学生从计算机科学系转到信息系。
- 插入操作
插入操作用PUT语句实现,其步骤是:
- 用宿主语言在工作区间中建立新元组
- 用PUT语句把该元组插入指定的关系
学校新开设了一门2学分的课程“计算机组织与结构”,其课程号为8,直接先行课为6号课程。插入该课程元组
- 删除操作
删除操作用DELETE语句实现,其步骤是:
- 用HOLD语句把要删除的元组从数据库读到工作空间中
- 用DELETE语句删除该元组
201215125学生因故退学,删除该学生元组
补充一些关于关系数据库的小知识点
关系模型中三类完整性约束:
- 实体完整性
- 参照完整性
- 用户定义的完整性
实体完整性:若属性A是基本关系R的主属性,则属性A不能取空值。
一个基本表通常对应现实世界的一个实体集或多对多联系。现实世界的实体和实体间的联系都是可区分的,即它们具有某种唯一的标识,而在关系模型中,这种唯一的标识即主码,它需要保证非空,来确保所对应的实体是完整的,独一无二的。
外码:设F是基本关系R的一个或一组属性,但不是关系R的码。
参照完整性:若属性F是基本关系R的外码,它与基本关系S的主码
- 空
- S中某个元组的主码值
用户定义的完整性:略
下课了喵