关系演算
# 关系演算
关系演算
- 以数理逻辑中的谓词演算为基础
[!NOTE|label:谓词的含义] 在谓词逻辑中,原子命题分解成个体词和谓词。
- 个体词是可以独立存在的事或物,包括现实物、精神物和精神事三种
- 谓词则是用来刻画个体词的性质的词,即刻画事和物之间的某种关系表现的词
如“苹果”是一个现实物个体词,"苹果可以吃"是一个原子命题,“可以吃”是谓词,刻划“苹果”的一个性质,即与动物或人的一个关系
- 以数理逻辑中的谓词演算为基础
按谓词变元不同进行分类
- 元组关系演算:
- 以元组变量作为谓词变元的基本对象
- 元组关系演算语言ALPHA
- 域关系演算:
- 以域变量作为谓词变元的基本对象
- 域关系演算语言QBE
- 元组关系演算:
# 元组关系演算语言ALPHA
[!TIP|label:本节示例中各关系的请参照] 🔗 学生课程数据库
- 语句格式:
GET 工作空间名 (表达式1) [: 条件] [DOWN|UP 表达式2]
- 表达式1: 指定语句的操作对象
- 格式:
关系名| 关系名.属性名| 元组变量.属性名| 集函数 [,…]
- 可以理解为最终返回的结果中的列属性
- 格式:
- 条件: 结果元组应该满足的条件
- 格式:
逻辑表达式
- 格式:
- 表达式2:指定排序方式
- 格式:
关系名.属性名|元组变量.属性名[,… ]
- 格式:
- 表达式1: 指定语句的操作对象
# 简单检索
GET 工作空间名 (表达式1)
# [例1] 查询所有被选修的课程号码
GET W (SC.Cno)
# [例2] 查询所有学生的数据
GET W (Student)
# 限定的检索
GET 工作空间名 (表达式1) : 条件
# [例3] 查询信息系(IS)中年龄小于20岁的学生的学号和年龄
GET W (Student.Sno,Student.Sage): Student.Sdept='IS'∧ Student.Sage<20
# 带排序的检索
GET 工作空间名 (表达式1) [:条件] DOWN | UP 表达式2
# [例4] 查询计算机科学系(CS)学生的学号、年龄, 结果按年龄降序排序
GET W (Student.Sno,Student.Sage): Student.Sdept='CS‘ DOWN Student.Sage
# 带定额的检索
GET 工作空间名 (定额) (表达式1) [:条件] [DOWN | UP 表达式2 ]
# [例5] 取出一个信息系学生的学号
GET W (1) (Student.Sno): Student.Sdept='IS'
# [例6] 查询信息系年龄最大的三个学生的学号及其年龄,结果按年龄降序排序
GET W (3) (Student.Sno,Student.Sage): Student.Sdept='IS' DOWN Student.Sage
# 用元组变量的检索
- 元组变量的含义
- 表示可以在某一关系范围内变化
- 也称为范围变量 Range Variable
- 元组变量的用途
- 简化关系名:设一个较短名字的元组变量来代替较长的关系名
- 条件中使用量词时必须用元组变量
- 定义元组变量
- 格式:
RANGE 关系名 变量名
- 一个关系可以设多个元组变量
- 格式:
# 用存在量词的检索
# [例8] 查询选修2号课程的学生名字
RANGE SC X
GET W (Student.Sname):
∃X (X.Sno=Student.Sno ∧ X.Cno='2')
1
2
3
2
3
# [例9] 查询选修了这样课程的学生学号,其直接先行课是6号课程
RANGE Course CX
GET W (SC.Sno):
∃CX (CX.Cno=SC.Cno ∧ CX.Pcno='6')
1
2
3
2
3
# 查询 至少选修一门其先行课为6号课程的学生名字
RANGE Course CX
SC SCX
GET W (Student.Sname):
∃SCX (SCX.Sno=Student.Sno ∧
∃CX (CX.Cno=SCX.Cno ∧ CX.Pcno='6') )
1
2
3
4
5
2
3
4
5
- 前束范式形式:
GET W (Student.Sname):
∃SCX ∃CX (SCX.Sno=Student.Sno ∧
CX.Cno=SCX.Cno ∧ CX.Pcno='6')
1
2
3
2
3
# 带有多个关系的表达式的检索
# [例11] 查询成绩为90分以上的学生名字与课程名字
RANGE SC SCX
GET W (Student.Sname, Course.Cname):
∃SCX (SCX.Grade≥90 ∧
SCX.Sno=Student.Sno ∧
Course.Cno=SCX.Cno)
1
2
3
4
5
2
3
4
5
# 用全称量词的检索
# [例12] 查询不选1号课程的学生名字
用存在量词表示
RANGE SC SCX GET W (Student.Sname): ¬∃SCX (SCX.Sno=Student.Sno∧SCX.Cno='1')
1
2
3- $\neg $ 为取反的意思
用存在量词表示
RANGE SC SCX GET W (Student.Sname): ∀ SCX (SCX.Sno ≠ Student.Sno ∨ SCX.Cno ≠ '1')
1
2
3
# 用两种量词的检索
# [例13] 查询选修了全部课程的学生姓名
RANGE Course CX
SC SCX
GET W (Student.Sname): ∀CX ∃SCX
(SCX.Sno=Student.Sno∧
SCX.Cno=CX.Cno)
1
2
3
4
5
2
3
4
5
# 用蕴函(Implication)的检索
[!NOTE|label:蕴函]
- 蕴函
,离散数学中的概念
为前件, 为后件 - 后件包含前件,则蕴函为
, 后件不包含前件,则蕴函为
# [例14] 查询最少选修了S3学生所选课程的学生学号
RANGE Couse CX
SC SCX
SC SCY
GET W (Student.Sno): ∀CX
(∃SCX(SCX.Sno='S3' ∧ SCX.Cno=CX.Cno) ⟶
∃SCY(SCY.Sno=Student.Sno ∧ SCY.Cno=CX.Cno))
1
2
3
4
5
6
2
3
4
5
6
# 聚集函数
- 常用聚集函数(Aggregation function)或内部函数(Build-infunction)
函数名 | 功能 |
---|---|
COUNT | 对元组计数 |
TOTAL | 求总和 |
MAX | 求最大值 |
MIN | 求最小值 |
AVG | 求平均值 |
# [例15] 查询学生所在系的数目
GET W (COUNT(Student.Sdept))
1
COUNT
函数在计数时会自动排除重复值
# [例16] 查询信息系学生的平均年龄
GET W (AVG(Student.Sage): Student.Sdept='IS’ )
1
# 域关系演算语言 QBE
[!TIP|label:本节示例中各关系的请参照] 🔗 学生课程数据库
- 一种典型的域关系演算语言
- 以元组变量的分量即域变量作为谓词变元的基本对象
- 1978年在IBM370上得以实现
- QBE也指此关系数据库管理系统
- QBE:Query By Example
- 基于屏幕表格的查询语言
- 查询要求:以填写表格的方式构造查询
- 用示例元素(域变量)来表示查询结果可能的情况
- 查询结果:以表格形式显示
# [例17] 求信息系全体学生的姓名
- 用户提出要求
- 屏幕显示空白表格
- 用户在最左边一栏输入要查询的关系名
Student
- 系统显示该关系的属性名
- 用户在上面构造查询要求
其中,
为示例元素,即域变量
表示查询信息系的学生 - 屏幕显示查询结果
- 构造查询的几个要素
- 示例元素
- 即域变量,一定要加下划线
- 示例元素是这个域中可能的一个值,它不必是查询结果中的元素
- 打印操作符P
- 实际上是显示
- 查询条件
- 可使用比较运算符
>,≥,<,≤,=
和≠
- 其中
=
可以省略
- 可使用比较运算符
- 示例元素
# 简单查询
# [例18] 查询全体学生的全部数据
- 显示全部数据也可以简单地把 P. 操作符作用在关系名上
# 条件查询
# [例19] 求年龄大于19岁的学生的学号
# 与条件
# [例20] 求计算机科学系年龄大于19岁的学生的学号
- 把两个条件写在同一行上
- 把两个条件写在不同行上,但使用相同的示例元素值
# [例21] 查询既选修了1号课程又选修了2号课程的学生的学号
# 或条件
# [例22] 查询计算机科学系或者年龄大于19岁的学生的学号
[!WARNING|label:注意,示例元素值并不相同]
# 多表连接
# [例23] 查询选修1号课程的学生姓名
[!WARNING|label:示例元素Sno是连接属性,其值在两个表中要相同]
# 条件查询(非条件)
# [例24] 查询未选修1号课程的学生姓名
[!TIP|label:] 显示学号为
的学生名字,而该学生选修1号课程的情况为假
# [例25] 查询有两个人以上选修的课程号
[!TIP|label:] 查询这样的课程
, 它不仅被 选修 而且也被另一个学生( )选修了
# QBE 聚集函数
- 常用的聚集函数
函数名 | 功能 |
---|---|
CNT | 对元组计数 |
SUM | 求总和 |
MAX | 求最大值 |
MIN | 求最小值 |
AVG | 求平均值 |
# [例26] 查询信息系学生的平均年龄
# 对查询结果排序
- 升序排序:
- 对查询结果按某个属性值的升序排序,只需在相应列中填入
AO.
- 对查询结果按某个属性值的升序排序,只需在相应列中填入
- 降序排序:
- 按降序排序则填
DO.
- 按降序排序则填
- 多列排序:
- 如果按多列排序,用
AO(i).
或DO(i).
表示,其中i
为排序的优先级,i
值越小,优先级越高
- 如果按多列排序,用
# [例27] 查全体男生的姓名,要求查询结果按所在系升序排序,对相同系的学生按年龄降序排序
编辑 (opens new window)