通知
此博客运行在jpress系统上,如果你喜欢此博客模板,请加QQ群:1061691290(whimurmur模板/jpress插件),免费下载使用

数据库系统概论基础7 关系演算

2096人浏览 / 0人评论 | 作者:whisper  | 分类: 数据库系统概论  | 标签: 数据库系统概论  | 

作者:whisper

链接:http://proprogrammar.com:443/article/505

声明:请尊重原作者的劳动,如需转载请注明出处


    关系演算

  • 关系演算

    以数理逻辑中的谓词演算为基础

  • 按谓词变元不同 进行分类

    1.元组关系演算
    以元组变量作为谓词变元的基本对象
    元组关系演算语言ALPHA
    2.域关系演算
    以域变量作为谓词变元的基本对象
    域关系演算语言QBE

    元组关系演算语言ALPHA

    语句格式

    表达式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

    元组变量的用途

    ① 简化关系名:设一个较短名字的元组变量来代替较长的关系名。
    ② 条件中使用量词时必须用元组变量。

    定义元组变量

  • 格式: RANGE 关系名 变量名
  • 一个关系可以设多个元组变量

    (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

    一种典型的域关系演算语言

  • 以元组变量的分量即域变量作为谓词变元的基本对象
  • 1978年在IBM370上得以实现
  • QBE也指此关系数据库管理系统

    QBE: Query By Example

  • 基于屏幕表格的查询语言
  • 查询要求:以填写表格的方式构造查询
  • 用示例元素(域变量)来表示查询结果可能的情况
  • 查询结果:以表格形式显示

    QBE操作框架

 

    一、检索操作

    1.简单查询

    [例1]求信息系全体学生的姓名
    操作步骤为:
    (1) 用户提出要求;
    (2) 屏幕显示空白表格;

    (3)用户在最左边一栏输入要查询的关系名Student;

    (4)系统显示该关系的属性名

    (5)用户在上面构造查询要求

    T是示例元素,即域变量

    (6)屏幕显示查询结果

    构造查询的几个要素

  • 示例元素 即域变量 一定要加下划线

    示例元素是这个域中可能的一个值, 它不必是查询结果中的元素

  • 打印操作符P. 实际上是显示
  • 查询条件

    可使用比较运算符>, ≥,<, ≤,=和≠
    其中=可以省略

    [例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.对查询结果排序

    升序排序:

  • 对查询结果按某个属性值的升序排序, 只需在相应列中填入“AO.”

    降序排序:

  • 按降序排序则填“DO.”

    多列排序:

  • 如果按多列排序, 用“AO(i).”或“DO(i).”表示, 其中i为排序的优先级, i值越小, 优先级越高

    [例11]查全体男生的姓名, 要求查询结果按所在系升序排序, 对相同系的学生按年龄降序排序。 

 


亲爱的读者:有时间可以点赞评论一下

点赞(0) 打赏

全部评论

还没有评论!