关系演算

关系演算

 

前情回顾:关系代数

整理自教材《数据库系统概论》(第五版)(王珊、萨师煊)

关系演算基于符号逻辑的一个分支:谓词演算,分为两种,元组关系演算(ALPHA语言)和域关系演算(QBE语言)。

元组变元是给定关系上的一个变量,取值范围是该关系上的所有元组。

 

ALPHA的查询操作

基本格式为:操作语句 工作空间名(表达式):操作条件

其中工作空间名差不多都写的W,不知道它存在在这儿的意义是什么。稍微翻译一下就是:[一般是GET] [一般是W](你要查询的列名):限制和要求

 

检索操作

 

简单检索

不带限定条件的检索,比如\(GET\ W(Student.Sno)\),也就是检索所有学生的学号。

 

限定的检索

带条件的检索,条件在冒号后。比如小于20岁学生的学号

\(GET\ W(Student.Sno):Student.age<20\)

 

带排序的检索

查询小于20岁学生的学号并且按年龄降序排列。

\(GET\ W(Student.Sno):Student.age<20\ DOWN\ Student.age\)

 

指定返回元组条数的检索

取出3个AI系学生的学号。

\(GET\ W(3)(Student.Sno):Student.Sdept='AI'\)

 

用元组变量的检索

可以简化关系名,而且使用量词\(\exists\)\(\forall\)时必须用到。

查询AI系学生的名字。

\(RANGE\ Student\ X\)

\(GET\ W(X.Sname):X.dept='AI'\)

 

当查询条件来自工作区以外的关系(也就是别的表)时,要用元组变量和量词。

 

用存在量词的检索

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

\(RANGE\ SC\ X\)

\(GET\ W(Student.Sname):\exists X(X.Sno=Student.Sno\wedge X.Cno='2')\)

把SC(Student-Course)关系的元组叫做X,找到的X的学号\(Sno\)是Student的学号,并且\(Cno\)是2。

多个关系多个条件\(\wedge\)在一起,可以写成前束范式。

这里的\(\exists\)是说,只要这个学生所选修的所有课当中,找到有\(X.Cno\)含有2就可以。

 

用全称量词的检索

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

\(RANGE\ SC\ X\)

\(GET\ W(Student.Sname):\forall X(X.Sno\ne Student.Sno\vee X.Cno\ne'2')\)

这里的\(\forall\)是说,必须这个学生选修的所有课都不含2。

 

用两种量词的检索

查询选修了全部课程的学生姓名。

\(RANGE\ Course\ CX\)

\(SC\ SCX\)

\(GET\ W(Student.Sname):\forall CX\exists SCX(SCX.Sno=Student.Sno\wedge SCX.Cno=CX.Cno)\)

对所有的课程,存在这样的选课关系,使得选课学生学号是Student表中的学号,且课号是Course中的课号。

 

用蕴涵的检索

啊啊我懒得写了,总之就是条件形如p可以推出q。

 

更新操作

 

修改

首先用HOLD语句把要修改的元组读入工作空间,然后用宿主语言修改元组属性(MOVE语句),最后用UPDATE语句写回数据库。

 

插入

首先用宿主语言在工作空间中新建元组,然后用PUT语句把该元组存入指定关系。

 

删除

首先用HOLD语句把要删除的元组读入工作空间,然后用DELETE语句删除该元组。

 

QBE的查询操作

开局一张空白表格,用户在最左上格输入关系名,然后第一行剩下的格会被系统填入关系的属性名。

用户在下面的行构造查询要求,其中P.是操作符,表示打印(也就是显示)。

查询条件中可以使用比较运算符(大于小于不等于……等于的情况就直接写val而不是=val)。

示例元素(域变量)是这个域中可能的一个值,不一定是查询结果中的元素。也就是随便在这个域里面挑一个值出来给系统做示范?

然后系统就显示查询结果,也就是之前写了P.的列对应的结果。

SPJ SNO PNO JNO QTY
P.S1 J1

这个的意思就是要查询SPJ表中所有JNO是J1的SNO,其中示例就是S1,表示S1是SNO属性的一个可能取值。

 

具体的应用见下一篇的习题!

posted @ 2023-09-23 21:24  Alouette29  阅读(232)  评论(0)    收藏  举报