关系演算

关系演算

 

前情回顾:关系代数

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

关系演算基于符号逻辑的一个分支:谓词演算,分为两种,元组关系演算(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

 

用元组变量的检索

可以简化关系名,而且使用量词时必须用到。

查询AI系学生的名字。

RANGE Student X

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

 

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

 

用存在量词的检索

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

RANGE SC X

GET W(Student.Sname):X(X.Sno=Student.SnoX.Cno=2)

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

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

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

 

用全称量词的检索

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

RANGE SC X

GET W(Student.Sname):X(X.SnoStudent.SnoX.Cno2)

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

 

用两种量词的检索

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

RANGE Course CX

SC SCX

GET W(Student.Sname):CXSCX(SCX.Sno=Student.SnoSCX.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 @   Alouette29  阅读(111)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示