| 一、 |
检索操作 |
| |
检索操作用GET语句实现。 |
| |
(1)简单检索(即不带条件的检索) |
| |
|
| |
例1 查询所有被选修课程的课程号码 GET W (SC.Cno) 这里条件为空,表示没有限定条件。W为工作空间名。 例2 查询所有学生的数据 GET W (Student)
|
|
(2)限定的检索(即带条件的检索) |
| |
|
| |
例3 查询信息系(IS)中年龄小于20岁的学生的学号和年龄 GET W (Student.Sno, Student.Sage): Student.Sdept='IS' ∧ Student.Sage<20v举例:
|
|
(3)带排序的检索 |
| |
|
| |
例4 查询计算机科学系(CS)学生的学号、年龄,并按年龄降序排序 GET W (Student.Sno, Student.Sage): Student.Sdept='CS' DOWN Student.Sage
|
|
(4)带定额的检索 |
| |
|
| |
例5 取出一个信息系学生的学号 GET W (1) (Student.Sno): Student.Sdept='IS' 所谓带定额的检索是指指定检索出元组的个数,方法是在W后括号中加上定额数量。 排序和定额可以一起使用。 例6 查询信息系年龄最大的三个学生的学号及其年龄 GET W (3) (Student.Sno, Student.Sage): Student.Sdept='IS' DOWN Student.Sage
|
|
(5)用元组变量的检索 |
| |
|
| |
因为元组变量是在某一关系范围内变化的,所以元组变量又称为范围变量(Range variable)。元组变量主要有两方面的用途: ① 简化关系名。在处理实际问题时,如果关系的名字很长,使用起来就会感到不方便,这时我们可以设一个较短名字的元组变量来简化关系名。 ② 操作条件中使用量词时必须用元组变量。 元组变量是动态的概念,一个关系可以设多个元组变量。 例7 查询信息系学生的名字 RANGE Student X GET W (X.Sname): X.Sdept='IS' 这里元组变量X的作用是简化关系名Student。
|
|
(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=SC.Cno ∧ CX.Pcno='6')) 本例中的元组关系演算公式可以变换为前束范式(Prenex normal form)的形式: GET W (Student.Sname): ヨSCXヨCX (SCX.Sno=Student.Sno ∧ CX.Cno=SCX.Cno ∧ CX.Pcno='6') 例8、例9、例10中的元组变量都是为存在量词而设的。其中例10需要对两个关系作用存在量词,所以设了两个元组变量。
|
|
(7)带有多个关系的表达式的检索 |
| |
|
| |
(1) 上面所举的各个例子中,虽然查询时可能会涉及多个关系,即公式中可能涉及多个关系,但查询结果都只在一个关系中,即表达式中只有一个关系。实际上表达式中是可以有多个关系的。 例11 查询成绩为90分以上的学生名字与课程名字 本查询所要求的结果学生名字和课程名字分别在Student和Course两个关系中。 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)用两种量词的检索 |
| |
|
| |
例13 查询选修了全部课程的学生姓名 RANGE Course CX SC SCX GET W (Student.Sname): ∨CXヨSCX (SCX.Sno=Student.Sno ∧ SCX.Cno=CX.Cno)
|
|
(10)用蕴函(Implication)的检索 |
| |
|
| |
例14 查询最少选修了95002学生所选课程的学生学号 本例题的求解思路是,对Course中的所有课程,依次检查每一门课程,看95002是否选修了该课程,如果选修了,则再看某一个学生是否也选修了该门课。如果对于95002所选的每门课程该学生都选修了,则该学生为满足要求的学生。把所有这样的学生全都找出来即完成了本题。 RANGE Couse CX SC SCX SC SCY GET W (Student.Sno):∨CX(ヨSCX (SCX.Sno='95002' ∧ SCX.Cno=CX.Cno) => ヨSCY (SCY.Sno=Student.Sno ∧ SCY.Cno=CX.Cno))
|
|
(11)集函数 |
| |
|
| |
用户在使用查询语言时,经常要作一些简单的计算,例如要求符合某一查询要求的元组数,求某个关系中所有元组在某属性上的值的总和或平均值等。为了方便用户,关系数据语言中建立了有关这类运算的标准函数库供用户选用。这类函数通常称为集函数(Aggregation function)或内部函数(Build-in function)。关系演算中提供了COUNT,TOTAL,MAX,MIN,AVG等集函数,其含义如表2-5所示。
|
表2-5 关系演算中的集函数
|
| 函 数 名 |
功 能 |
| COUNT |
对元组计数 |
| TOTAL |
求总和 |
| MAX |
求最大值 |
| MIN |
求最小值 |
| AVG |
求平均值 |
例15 查询学生所在系的数目 GET W (COUNT(Student.Sdept)) COUNT函数在计数时会自动排除重复的Sdept值。 例16 查询信息系学生的平均年龄 GET W (AVG(Student.Sage): Student.Sdept='IS')
|
| 二、 |
更新操作 |
| |
(1) 修改操作 修改操作用UPDATE语句实现。其步骤是: ·首先用HOLD语句将要修改的元组从数据库中读到工作空间中 ·然后用宿主语言修改工作空间中元组的属性 ·最后用UPDATE语句将修改后的元组送回数据库中 |
| |
|
| |
需要注意的是,单纯检索数据使用GET语句即可,但为修改数据而读元组时必须使用HOLD语句,HOLD语句是带上并发控制的GET语句。有关并发控制的概念我们将在第五章中详细介绍。 例17 95007学生从计算机科学系转到信息系 HOLD W (Student.Sno, Student.Sdetp): Student.Sno='95007' (从Student关系中读出95007学生的数据) MOVE 'IS' TO W.Sdept (用宿主语言进行修改) UPDATE W (把修改后的元组送回Student关系) 在该例中我们用HOLD语句来读95007的数据,而不是用GET语句。 如果修改操作涉及到两个关系的话,就要执行两次HOLD-MOVE-UPDATE操作序列。 修改主码的操作是不允许的,例如不能用UPDATE语句将学号95001改为95102。如果需要修改关系中某个元组的主码值,只能先用删除操作删除该元组,然后再把具有新主码值的元组插入到关系中。
|
|
(2) 插入操作 |
|
插入操作用PUT语句实现。其步骤是: ·首先用宿主语言在工作空间中建立新元组 ·然后用PUT语句把该元组存入指定的关系中 |
| |
|
| |
例18 学校新开设了一门2学分的课程“计算机组织与结构”,其课程号为8,直接先行课为6号课程。插入该课程元组。 MOVE '8' TO W.Cno MOVE '计算机组织与结构' TO W.Cname MOVE '6' TO W.Cpno MOVE '2' TO W.Ccredit PUT W (Course) (把W中的元组插入指定关系Course中) PUT语句只对一个关系操作,也就是说表达式必须为单个关系名。如果插入操作涉及多个关系,必须执行多次PUT操作。
|
|
(3) 删除 |
|
删除操作用DELETE语句实现。其步骤为: ·用HOLD语句把要删除的元组从数据库中读到工作空间中 ·用DELETE语句删除该元组 |
| |
|
| |
例19 95110学生因故退学,删除该学生元组 HOLD W (Student): Student.Sno='95110' DELETE W 例20 将学号95001改为95102 HOLD W (Student): Student.Sno='95001' DELETE W MOVE '95102' TO W.Sno MOVE '李勇' TO W.Sname MOVE '男' TO W.Ssex MOVE '20' TO W.Sage MOVE 'CS' TO W.Sdept PUT W (Student) 例21 删除全部学生 HOLD W (Student) DELETE W 由于SC关系与Student关系之间的具有参照关系,为保证参照完整性,删除Student关系中全部元组的操作将导致DBMS自动执行删除SC关系中全部元组的操作: HOLD W (SC) DELETE W
|