关系演算
操作语句格式
操作语句 工作空间名(表达式) :操作条件
表达式:用于说明要查询的结果在,它可以是关系名或属性名
操作条件:是一个逻辑表达式说明查询结果要满足的条件,用于将操作结果限定在满足条件的元组中,操作条件可以为空。除此之外还可以在基本格式的基础上加上排序要求
GET
查询所有被选修的课程号码
GET W(SC.Con)
W为工作空间名。这里条件为空
查询所有学生的数据
GET W(Students)
- 限定条件
查询信息系中年龄小于20的学生学号和年龄
(当面对多个条件时,要分析出多个条件之间的关系,是并?是或?)
GET W(Student.Sno,Student.Sage):Student.Sdept="IS" “并” Student.Sage<20 - 带升降序的检索
查询计科系(CS)学生的学号、年龄、结果按年龄降序排序
GET W(Student.Sno,Student.Sage):Student.Sdept="CS" DOWN Student.Sage (升序UP,不管升降,都是从上往下排) - 指定返回元组的个数
取出2个信息系学生的学号
GET W(2) (Student.Sno):Student.Sdept="IS"
括号中所填的数字,代表着届时名单顺序从上往下取几个 - 用元组变量的检索
元组变量是在某一关系范围内的变化(所以也称之为范围变量Range Variable),一个关系可以设置多个元组变量。元组变量主要有两方面的用途
1.简化关系名 如,Student可以用S来代替,方便
2.操作条件中使用两次是必须永远组变量
ALPHA语言用RANGE来说明元组变量,格式:RANGE Student 变量名
eg。查询信息系学生的名字
RANGE Student X
GET W(Student.Sname):X.Sdept="IS"; - 用 存在量词 的检索条件中使用量词是必须用元组变量(一般条件下:查询用到多个表时才会使用)
![]()
X的学号等于学生的学号,并且X的课号等于2
eg
![]()
括号中的存在量词可以提出
解决问题的思路是统一的,无论是要求什么表的什么属性需要满足什么条件,都必须先在前面声明两个表之间的联系
前面的例题中出现在“并”之前的“变量.属性 = 表名.属性”就是在声明两个表之间的联系。(当关联其他表的时候使用声明,获取本表属性直接.检索就可以了)
也就是说,限定条件的书写,分成各个小块,就是先写表之间联系的属性,再写寻找条件。
-
带有多个关系的表达式的检索
![]()
-
全称量词
![]()
可以先反向求解,而后添加“非”符号,或者转换为全称量词
-
蕴含(Implication)的检索,蕴含就是通过条件p,可以找出q,蕴含符号=>
![]()
-
聚集函数(使用:在输出的属性前面书写整体连属性再加一个括号)
![]()
COUNT在计数时会自动排除重复
更新操作
更新时要考虑到并发的问题(并发就是,对多人对同一数据读取或读写的情况进行处理)
- 修改操作
利用UPDATE##UPDATE
修改数据,步骤:
1.首先用HOLD语句将修改的元组从数据库中读到工作空间中(别名:加锁,以避免上述情况);(当用户将该数据读到工作空间中以后,在没有完成操作以前,别的用户便不能再对该数据进行操作)
2.然后使用宿主语言就该工作空间中元组的属性值
3.最后用UPDATE语句将修改后的元组返回到数据库中
注意:单纯的搜索数据只用GET,而GET也只能够将数据读出来,并不能够给数据加锁;所以当要修改数据时,必须要用HOLD。
所以说HOLD语句是带有并发的控制
eg.
![]()
HOLD语句与GET语句格式是一样的。
HOLD W (Student.Sno,Student.Sdept):Student.Sno='20121512'//从学生表中将该学生的数据读到操作空间,并且为数据加锁
MOVE 'IS' TO W.Sdept//注意,将需要填写的值传给操作空间W里的“要被修改的属性”,而不是直接传给目标表的属性。MOVE语句是用来传递值的
UPDATE W//把修改后的元组送回Student表内
说明:
1.如果修改操作涉及到两个关系的话,就要执行两次HOLD-MOVE-UPDATE操作序列
2.在ALPHA语言中,不允许进行修改主码的操作
3.主码的修改,要先删除元组,而后在添加元组
插入操作PUT
PUT
步骤:
1.首先庸俗诸语言在工作空间中建立新元组
2.然后用PUT语句把该元组存入指定的关系中
PUT语句只对一个关系操作,也就是说表达式必须为单个表单
eg.

MOVE '8' TO W.Cno//把某个值,传到属性值中去
MOVE '计算机与科学' TO W.Cname//同上
MOVE '6' TO W.Cpno
MOVE '2' TO W.Ceredit
PUT W (Course)//再把工作空间中现有数据,传到Course表中
删除(存在并发)
操作存在并发的可能性时,我们就需要将读到操作空间内的数据进行加锁,那就要使用HOLD
DELETE
eg.

HOLD W (Student):Student.Sno='201215230'//前面讲过,HOLD操作需要将整个表读进来,当明确要求需要两个属性时,才写进去两个属性
DELETE W//将工作空间内的数据删除
eg.修改主码实例

之前说过修改住吗需要将整个元组删去,那么,将目标学生读到操作空间,进行删除之后,用MOVE将值传给属性,而后再利用PUT语句将所有信息编号再插入到表里
eg.删除全部学生
HOLD W(Student)
DELETE W
当某一个表被删除时,与之关联的其他表中的参照属性,也必须删除(现在很多预言师子系统自动删除的)
元组关系演算
原子公式有三类

R是关系名,t是元组名

其中的c就代表一个常量
表示:元组t第i个分量于长亮c满足比某种较关系
在关系演算中定义了“自由元组变量”和“约束元组变量”的概念。这些概念和谓词演算中的概念完全一样。若公式中的一个元组变量前有“全称量词”或“存在量词”,则称该变量为约束变量,否则称自由元组变量。








浙公网安备 33010602011771号