首页 > 数据库技术 > 详细

数据库——关系演算

时间:2019-06-16 16:39:28      阅读:373      评论:0      收藏:0      [点我收藏+]

关系演算

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

元组关系演算语言ALPHA

由E.F.Codd提出,以数理逻辑中的谓词演算为基础
语句


检索语句(查询)
GET


更新语句
PUT,HOLD,UPDATE,DELETE,DROP

一、检索操作

(1) 简单检索(即不带条件的检索)
(2) 限定的检索(即带条件的检索)
(3) 带排序的检索
(4) 带定额的检索
(5) 用元组变量的检索
(6) 用存在量词的检索
(7) 带有多个关系的表达式的检索
(8) 用全称量词的检索
(9) 用两种量词的检索
(10) 用蕴函(Implication)的检索
 

(1)简单检索

   GET 工作空间名 (表达式)

[例1]  查询所有被选修的课程号码。

GET  W  (SC.Cno) 

[例2]  查询所有学生的数据。

GET  W  (Student)

(2)限定的检索

    GET 工作空间名(表达式):操作条件

[例3]查询信息系(IS) 年龄小于20岁的学号和年龄。

 GET  W  (Student.Sno,Student.Sage): Student.Sdept=IS∧student.Sage<20

  [例 补充]查询选1号课的学生名和成绩

 GET W (Student.Sname,SC.grade): SC.CNO=1 ∧ Student.Sno=SC.Sno

(3)带排序的检索

[例4]  查询计算机科学系(CS)学生的学号、年龄,结果按年龄降序排序。

GET  W  (Student.Sno,Student.Sage): Student.Sdept=CS DOWN Student.Sage

排序关键字: UP升序  DOWN降序

(4)带定额的检索

[例6]  查询信息系年龄最大的三个学生的学号及其年龄,结果按年龄降序排序。

GET  W (3)  (Student.Sno,Student.Sage): Student.Sdept=IS DOWN Student.Sage

(5)用元组变量的检索

元组变量:  取值在某关系内元组的量,用于形成查询条件

定义元组变量
格式:    RANGE  关系名  变量名
例如:
         

    RANGE  STUDENT  X

  (6) 用存在量词的检索

[例8]  查询选修2号课程的学生名字。

   RANGE  SC  X
   GET W (Student.Sname): 存在X (X.Sno=Student.Sno∧X.Cno=2)

查询语义:查询这样的学生名,条件是存在选课元组X,X的学号与该生的学号相等并且X的课号为2(表明该生选了2号课)
记住:  当查询条件来自工作区以外的关系时, 要使用元组变量和量词.  
 先定义元组变量, 在查询条件中用量词引入元组变量.

请对比下面两个查询

查询选修2号课程的学生名字。

条件来自工作区外的关系

  RANGE  SC  X  
  GET W (Student.Sname):存在 X(X.Sno=Student.Sno∧X.Cno=2)

 

  查询选修2号课的学生名和成绩

条件来自工作区内的关系

  GET W (Student.Sname,SC.grade): Student.Sno=SC.Sno ∧ SC.CNO=2 

 


 [例9] 查询选修了这样课程的学生学号,其先行课是6号课程。

 RANGE Course  CX
 GET  W  (SC.Sno): 存在 CX (CX.Cno=SC.Cno∧CX.Pcno=6)

 

查询CS系选修2号课程的学生名字?

 RANGE  SC  X
 GET W (Student.Sname): Student.Sdept= CS ∧存在 X (X.Sno=Student.Sno∧X.Cno=2)

第一个条件只用到学生表,  直接给出,第二个条件则需要元组变量和存在量词来表示了。

[例10]查询选修了先行课为6号课的课程的学生名

  RANGE  Course  CX
  RANGE  SC  SCX
  GET W (Student.Sname):存在 SCX(SCX.Sno=Student.Sno ∧ 存在 CX(CX.Cno=SCX.Cno∧CX.Pcno=6))

 

改为前束范式形式:

 RANGE  Course  CX
 RANGE  SC  SCX
 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.Sno=Student.Sno ∧ Course.Cno=SCX.Cno ∧ SCX.Grade≥90)

练习

查询CS系的学生名

GET W(STUDENT.SNAME):STUDENT.SDEPT=CS

查询选1号课的学号,成绩

GET W(SC.SNO, SC.GRADE):SC.CNO=1

查询先行课为6的课名

GET W(COURSE.CNAME):COURSE.CPNO=6

查询选过课的学生名

RANGE  SC   X
GET W(Student.Sname): 存在 X (X.Sno=Student.Sno)

查询选1号课的学生名

RANGE  SC   X
GET W(Student.Sname): 存在 X (X.Sno=Student.Sno∧X.Cno=1)

查询CS系选1号课的学生名

RANGE  SC   X
GET W(Student.Sname):  Student.Sdept=CS ∧ 存在 X (X.Sno=Student.Sno∧X.Cno=1)

查询被选过的课名

RANGE  SC   X
GET W(Course.Cname): 存在 X(X.Cno=Course.Cno)

查询学号为95001学生选的课名

RANGE  SC   X
GET W(Course.Cname):存在 X (X.Cno=Course.Cno∧X.Sno=95001)

查询CS系学生的课号,成绩

RANGE  Student   X
GET W(SC.Cno, SC.Grade):存在 X (X.Sno=SC.Sno ∧ X.Sdept=CS)

查询选修数据库原理课的学号,成绩

RANGE   Course  X
GET W(SC.Sno, SC.Grade):存在 X (X.Cno=SC.Cno∧X.Cname=数据库原理)

查询CS系选修数据库原理课的学生姓名

RANGE  SC    SCX
RANGE  Course    CX
GET W(Student.Sname):  Student.Sdept=CS ∧ 存在 SCX 存在 CX (SCX.Sno=Student.Sno ∧ CX.Cno=SCX.Cno ∧ CX.Cname=数据库原理课)

(8)用全称量词的检索 

[例12]  查询不选1号课程的学生名字。查询语义:查询这样的学生,条件是对所有选课元组, 都不表明该生选了1号课(或者与该生学号不同, 或者课号不是1)

  RANGE  SC  SCX
  GET  W (Student.Sname): 任意 SCX ( SCX.Sno≠Student.Sno ∨ SCX.Cno≠1 )

用存在量词代替全称量词

技术分享图片


对所有的x,P为真==不存在这样的x,P不为真






 



















数据库——关系演算

原文:https://www.cnblogs.com/wkfvawl/p/11031826.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!