数据库系统概论——关系演算
关系演算语言用谓词来表达查询要求,以数理逻辑中的谓词演算为基础
以谓词变元分类
- 元组关系演算
以元组变量作为谓词变元的基本对象,如ALPHA
语言
- 域关系演算
以域变量作为谓词变元的基本对象,如QBE
语言
元组关系演算语言
简单检索
格式: GET 工作空间名 (表达式1)
限定的检索
格式:GET 工作空间名 (表达式1) : 条件
带排序的检索
格式:GET 工作空间名 (表达式1) [: 条件] DOWN | UP 表达式2
带定额的检索
格式:GET 工作空间名 (定额) (表达式1) [: 条件] [DOWN | UP 表达式2]
用元组变量的检索
- 元组变量的函数
元组变量(Tuple Variable
)指的是表示可以在某一关系范围内变化的变量,也称为范围变量(Range Variable
)
- 用途
元组变量可以通过替换较长关系名来简化关系名且条件中的量词必须使用元组变量
- 定义
格式:RANGE 关系名 变量名
一个关系可以设置多个元组变量
存在量词检索
例如,查询选修2号课程的学生名字
RANGE SC X GET W (Student.Sname):∃X(X.Sno=Student.Sno ∧ X.Cno = '2')
查询至少选修一门其先行课为6号课程的学生的名字
RANGE Course CX SC SCX GET W (Student.Sname): ∃SCX (SC.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 ∧ Course.Cno=SCX.Cno)
全称量词检索
例如,查询不选择1号课程的学生名字
RANGE SC SCX GET W(Student.Sname): ∀SCX (SCX.Sno ≠ Student.Sno ∨ SCX.Cno ≠ 'c1')
蕴含检索
例如,查询至少选修了S3
学生所选课程的学生学号
RANGE
Course CX
SC SCX
SC SCY
GET W(Studnet.Sno):
∀CX (∃SCX (SCX.Sno='S3' ∧ SCX.Cno = CX.Cno) → ∃SCY (SCY.Sno=Student.Sno ∧ SCY.Cno = CX.Cno) )
若S3
选了课,则与其选相同课的学生被选取,若S3
没有选课,则所有同学被选取
聚集函数
函数名 | 功能 |
---|---|
COUNT | 对元组计数 |
TOTAL | 求总和 |
MAX | 求最大值 |
MIN | 求最小值 |
AVG | 求平均值 |
例如,查询学生所在系数目
GET W(COUNT(Student.Sdepth))
域关系演算语言
域关系演算语言Query By Example, QBE
基于屏幕表格的查询语言,以元组变量的分量即域变量作为谓词变元的基本对象,在关系数据库管理系统IBM370
上得以实现,QBE
要求以填写表格的方式构造查询,用示例元素(域变量
)来表示查询结果的可能情况,查询结果同样以表格形式显示
要素
- 示例元素
示例元素可能是一个值
- 打印操作符
P.
- 查询条件
比较运算符>,≥,<,≤,=,≠
等
简单查询
例如,查询学生的名字,其中T为示例元素,即域变量
Student | no | name | sex | age | dept |
---|---|---|---|---|---|
P.T | CS |
查询结果
Student | no | name | sex | age | dept |
---|---|---|---|---|---|
Tony | CS |
例如,显示所有元组
Student | no | name | sex | age | dept |
---|---|---|---|---|---|
P. |
条件查询
- 与条件
查询CS系年龄大于19的学生学号
Student | no | name | sex | age | dept |
---|---|---|---|---|---|
P.20200001 | > 19 | CS |
- 或条件
查询CS系或年龄大于19的学生学号
Student | no | name | sex | age | dept |
---|---|---|---|---|---|
P.20200001 | CS | ||||
P.20200001 | > 19 |
- 多表连接
例如,查询选修1号课程的学生姓名
Student | student_no | name | sex | age | dept |
---|---|---|---|---|---|
20200001 | P.Tony | > 19 | CS |
Course | student_no | course_no | grade |
---|---|---|---|
20200001 | 1 |
示例元素student_no
是连接属性,其值在两个表中要相同
例如,查询选修1号课程的学生姓名
Student | student_no | name | sex | age | dept |
---|---|---|---|---|---|
20200001 | P.Tony | > 19 | CS |
Course | student_no | course_no | grade |
---|---|---|---|
┐ | 20200001 | 1 |
在关系名下填写非符号┐
例如,查询有两个人以上选修的课程号
Course | student_no | course_no | grade |
---|---|---|---|
20200001 | P.1 | ||
┐20200001 | 1 |
查询不仅被20200001
学生选修,还被另一个学生┐20200001
选修的课程1
聚集函数
函数名 | 功能 |
---|---|
COUNT | 对元组计数 |
TOTAL | 求总和 |
MAX | 求最大值 |
MIN | 求最小值 |
AVG | 求平均值 |
例如,查询CS系的平均年龄
Student | no | name | sex | age | dept |
---|---|---|---|---|---|
P.AVG.ALL | CS |
排序
顺序 | 符号 |
---|---|
升序排序 | AO. |
降序排序 | DO. |
多列排序 | AO(i)./DO(i) |
例如,查询全体男生姓名,要求查询结果按照所在系升序,相同系以年龄降序
Student | no | name | sex | age | dept |
---|---|---|---|---|---|
P.Tony | male | DO(2). | AO(1). |
鸣谢
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解