作者:whisper
链接:http://proprogrammar.com:443/article/505
声明:请尊重原作者的劳动,如需转载请注明出处
以数理逻辑中的谓词演算为基础
1.元组关系演算:
以元组变量作为谓词变元的基本对象
元组关系演算语言ALPHA
2.域关系演算:
以域变量作为谓词变元的基本对象
域关系演算语言QBE
语句格式
表达式1:指定语句的操作对象
格式:关系名| 关系名. 属性名| 元组变量. 属性名| 集函数 [, … ]
条件:结果元组应该满足的条件
格式:逻辑表达式
表达式2:指定排序方式
格式:关系名. 属性名| 元组变量. 属性名[, … ]
(1)简单检索
GET 工作空间名 (表达式1)
[例1] 查询所有被选修的课程号码。
GET W (SC.Cno)
[例2] 查询所有学生的数据。
GET W (Student)
(2)限定的检索
GET 工作空间名(表达式1) : 条件
[例3]查询信息系(IS)中年龄小于20岁的学生的学号和年龄
GET W (Student.Sno, Student.Sage):
Student.Sdept='IS'∧ Student.Sage<20
(3)带排序的检索
GET 工作空间名(表达式1) [: 条件] DOWN | UP 表达式2
[例4]查询计算机科学系(CS)学生的学号、 年龄,结果按年龄降序排序
GET W (Student.Sno, Student.Sage):
Student.Sdept='CS‘ DOWN Student.Sage
(4)带定额的检索
GET 工作空间名(定额) (表达式1)[: 条件] [DOWN | UP [例5]取出一个信息系学生的学号
GET W (1) (Student.Sno): Student.Sdept='IS'
[例6]查询信息系年龄最大的三个学生的学号及其年龄,
结果按年龄降序排序。
GET W (3) (Student.Sno, Student.Sage):
Student.Sdept='IS' DOWN Student.Sage]
(5)用元组变量的检索
元组关系演算:以元组变量作为谓词变元的基本对象
元组变量的含义
表示可以在某一关系范围内变化
也称为范围变量Range Variable
元组变量的用途
① 简化关系名:设一个较短名字的元组变量来代替较长的关系名。
② 条件中使用量词时必须用元组变量。
定义元组变量
(6) 用存在量词的检索
[例8] 查询选修2号课程的学生名字。
RANGE SC X
GET W (Student.Sname):
∃X(X.Sno=Student.Sno∧X.Cno='2')
[例9] 查询选修了这样课程的学生学号,其直接先行课是6号课程。
RANGE Course CX
GET W (SC.Sno):
∃CX (CX.Cno=SC.Cno∧CX.Pcno='6')
[例10]查询 至少选修一门其先行课为6号课程的学生名字
RANGE Course CX
SC SCX
GET W (Student.Sname):
∃SCX (SCX.Sno=Student.Sno∧
∃CX (CX.Cno=SCX.Cno∧CX.Pcno='6') )
前束范式形式:
GET W (Student.Sname):
∃SCX∃CX (SCX.Sno=Student.Sno∧
CX.Cno=SCX.Cno∧CX.Pcno='6')
(7)带有多个关系的表达式的检索
[例11] 查询成绩为90分以上的学生名字与课程名字。
RANGE SC SCX
GET W (Student.Sname, Course.Cname):
∃SCX (SCX.Grade≥90∧
SCX.Sno=Student.Sno∧
Course.Cno=SCX.Cno)
(8)用存在量词的检索
[例12] 查询不选1号课程的学生名字
用存在量词表示:
RANGE SC SCX
GET W (Student.Sname): ¬∃SCX
(SCX.Sno=Student.Sno∧SCX.Cno='1')
RANGE SC SCX
GET W (Student.Sname): SCX
(SCX.Sno≠Student.Sno∨SCX.Cno≠'1')
(9)用全称量词的检索
(10)用两种量词的检索
(11)用蕴函(Implication)的检索
[例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) )
(12)聚集函数
常用聚集函数(Aggregation function)或内部函数(Build-in function)
[例15] 查询学生所在系的数目。
GET W ( COUNT(Student.Sdept) )
COUNT函数在计数时会自动排除重复值。
[例16] 查询信息系学生的平均年龄
GET W (AVG(Student.Sage):
Student.Sdept='IS’ )
一种典型的域关系演算语言
QBE: Query By Example
QBE操作框架
一、检索操作
1.简单查询
[例1]求信息系全体学生的姓名
操作步骤为:
(1) 用户提出要求;
(2) 屏幕显示空白表格;
(3)用户在最左边一栏输入要查询的关系名Student;
(4)系统显示该关系的属性名
(5)用户在上面构造查询要求
T是示例元素,即域变量
(6)屏幕显示查询结果
构造查询的几个要素
示例元素是这个域中可能的一个值, 它不必是查询结果中的元素
可使用比较运算符>, ≥,<, ≤,=和≠
其中=可以省略
[例2] 查询全体学生的全部数据
显示全部数据也可以简单地把P.操作符作用在关系名上。
[例3] 求年龄大于19岁的学生的学号
2. 条件查询(与条件)
[例4] 求计算机科学系年龄大于19岁的学生的学号。
方法(1):把两个条件写在同一行上
方法(2):把两个条件写在不同行上, 但使用相同的示例元素值
[例5] 查询既选修了1号课程又选修了2号课程的学生的学号。
2. 条件查询(或条件)
[例6]查询计算机科学系或者年龄大于19岁的学生的学号。
2. 条件查询(多表连接)
[例7] 查询选修1号课程的学生姓名
注意:示例元素Sno是连接属性,其值在两个表中要相同。
2. 条件查询(非条件)
[例8] 查询未选修1号课程的学生姓名
思路:显示学号为200215121的学生名字,而该学生选修1号课程的情况为假
[例9] 查询有两个人以上选修的课程号。
思路:查询这样的课程1,它不仅被200215121选修
而且也被另一个学生(¬200215121)选修了
3. 聚集函数
常用聚集函数:
[例10] 查询信息系学生的平均年龄。
4.对查询结果排序
升序排序:
降序排序:
多列排序:
[例11]查全体男生的姓名, 要求查询结果按所在系升序排序, 对相同系的学生按年龄降序排序。
亲爱的读者:有时间可以点赞评论一下
全部评论