第2章关系数据库2.1关系数据结构及形式化定义2.2关系操作2.3关系的完整性2.4关系代数2.5关系演算2.6小结山东师范大学2.5关系演算•关系演算–以数理逻辑中的谓词演算为基础•种类:按谓词变元不同分类–元组关系演算:以元组变量作为谓词变元的基本对象–域关系演算:以域变量作为谓词变元的基本对象山东师范大学2.5关系演算•2.5.1元组关系演算语言ALPHA•2.5.2元组关系演算•2.5.3域关系演算语言QBE山东师范大学2.5.1元组关系演算语言ALPHA•一种典型的元组关系演算语言,但未实际实现–由E.F.Codd提出–INGRES所用的QUEL语言是参照ALPHA语言研制的•语句–检索语句•GET–更新语句•PUT,HOLD,UPDATE,DELETE,DROP山东师范大学一、检索操作•语句格式:GET工作空间名[(定额)](表达式1)[:操作条件][DOWN/UP表达式2]–定额:规定检索的元组个数•格式:数字–表达式1:指定语句的操作对象•格式:关系名|关系名.属性名|元组变量.属性名|集函数[,…]–操作条件:将操作结果限定在满足条件的元组中•格式:逻辑表达式–表达式2:指定排序方式•格式:关系名.属性名|元组变量.属性名[,…]山东师范大学(1)简单检索•格式GET工作空间名(表达式1)[例1]查询所有被选修的课程号码。GETW(SC.Cno)[例2]查询所有学生的数据。GETW(Student)山东师范大学(2)限定的检索•格式GET工作空间名(表达式1):操作条件[例3]查询信息系(IS)中年龄小于20岁的学生的学号和年龄。GETW(Student.Sno,Student.Sage):Student.Sdept='IS'∧Student.Sage20山东师范大学(3)带排序的检索•格式GET工作空间名(表达式1)[:操作条件]DOWN/UP表达式2[例4]查询计算机科学系(CS)学生的学号、年龄,结果按年龄降序排序。GETW(Student.Sno,Student.Sage):Student.Sdept='CS'DOWNStudent.Sage山东师范大学(4)带定额的检索•格式GET工作空间名(定额)(表达式1)[:操作条件][DOWN/UP表达式2][例5]取出一个信息系学生的学号。GETW(1)(Student.Sno):Student.Sdept='IS'山东师范大学带定额的检索(续)[例6]查询信息系年龄最大的三个学生的学号及其年龄,结果按年龄降序排序。GETW(3)(Student.Sno,Student.Sage):Student.Sdept='IS'DOWNStudent.Sage山东师范大学(5)用元组变量的检索•元组变量的含义–表示可以在某一关系范围内变化(也称为范围变量RangeVariable)•元组变量的用途–①简化关系名:设一个较短名字的元组变量来代替较长的关系名。–②操作条件中使用量词时必须用元组变量。•定义元组变量–格式:RANGE关系名变量名–一个关系可以设多个元组变量山东师范大学用元组变量的检索(续)[例7]查询信息系学生的名字。RANGEStudentXGETW(X.Sname):X.Sdept='IS'山东师范大学(6)用存在量词的检索[例8]查询选修2号课程的学生名字。RANGESCXGETW(Student.Sname):X(X.Sno=Student.Sno∧X.Cno='2')[例9]查询选修了这样课程的学生学号,其直接先行课是6号课程。RANGECourseCXGETW(SC.Sno):CX(CX.Cno=SC.Cno∧CX.Pcno='6')山东师范大学(7)带有多个关系的表达式的检索[例11]查询成绩为90分以上的学生名字与课程名字。RANGESCSCXGETW(Student.Sname,Course.Cname):SCX(SCX.Grade≥90∧SCX.Sno=Student.Sno∧Course.Cno=SCX.Cno)山东师范大学(8)用全称量词的检索[例12]查询不选1号课程的学生名字。RANGESCSCXGETW(Student.Sname):SCX(SCX.Sno≠Student.Sno∨SCX.Cno≠'1')用存在量词表示:RANGESCSCXGETW(Student.Sname):SCX(SCX.Sno=Student.Sno∧SCX.Cno='1')山东师范大学(9)用两种量词的检索[例13]查询选修了全部课程的学生姓名。RANGECourseCXSCSCXGETW(Student.Sname):CXSCX(SCX.Sno=Student.Sno∧SCX.Cno=CX.Cno)山东师范大学(10)用蕴函(Implication)的检索[例14]查询最少选修了95002学生所选课程的学生学号。RANGECouseCXSCSCXSCSCYGETW(Student.Sno):CX(SCX(SCX.Sno='95002'∧SCX.Cno=CX.Cno)SCY(SCY.Sno=Student.Sno∧SCY.Cno=CX.Cno))山东师范大学(11)集函数•常用集函数(Aggregationfunction)或内部函数(Build-infunction)函数名功能COUNT对元组计数TOTAL求总和MAX求最大值MIN求最小值AVG求平均值山东师范大学集函数(续)[例15]查询学生所在系的数目。GETW(COUNT(Student.Sdept))COUNT函数在计数时会自动排除重复值。[例16]查询信息系学生的平均年龄。GETW(AVG(Student.Sage)):Student.Sdept='IS'山东师范大学二、更新操作•(1)修改操作•(2)插入操作•(3)删除操作山东师范大学(1)修改操作•步骤①用HOLD语句将要修改的元组从数据库中读到工作空间中HOLD工作空间名(表达式1)[:操作条件]HOLD语句是带上并发控制的GET语句②用宿主语言修改工作空间中元组的属性③用UPDATE语句将修改后的元组送回数据库中UPDATE工作空间名山东师范大学修改操作(续)[例17]把95007学生从计算机科学系转到信息系。HOLDW(Student.Sno,Student.Sdetp):Student.Sno='95007'(从Student关系中读出95007学生的数据)MOVE'IS'TOW.Sdept(用宿主语言进行修改)UPDATEW(把修改后的元组送回Student关系)山东师范大学(2)插入操作•步骤–①用宿主语言在工作空间中建立新元组–②用PUT语句把该元组存入指定关系中PUT工作空间名(关系名)•PUT语句只对一个关系操作山东师范大学插入操作(续)[例18]学校新开设了一门2学分的课程“计算机组织与结构”,其课程号为8,直接先行课为6号课程。插入该课程元组。MOVE'8'TOW.CnoMOVE'计算机组织与结构'TOW.CnameMOVE'6'TOW.CpnoMOVE'2'TOW.CcreditPUTW(Course)山东师范大学(3)删除操作•步骤①用HOLD语句把要删除的元组从数据库中读到工作空间中②用DELETE语句删除该元组DELETE工作空间名山东师范大学删除操作(续)[例19]95110学生因故退学,删除该学生元组。HOLDW(Student):Student.Sno='95110'DELETEW山东师范大学元组关系演算语言ALPHA•检索操作GETGET工作空间名[(定额)](表达式1)[:操作条件][DOWN/UP表达式2]•插入操作–建立新元组--PUT•修改操作–HOLD--修改--UPDATE•删除操作–HOLD--DELETE山东师范大学2.5关系演算•2.5.1元组关系演算语言ALPHA•2.5.2元组关系演算•2.5.3域关系演算语言QBE山东师范大学2.5.2元组关系演算•在元组关系演算系统中,{t|R(t)}为元组演算表达式,其中t是元组变量,R(t)为元组关系演算公式,简称公式。•原子公式有三类–R(t)关系R可表示为{t|R(t)}–t[i]Ѳu[j]Ѳ是算术比较运算符。该公式表示“元组t的第i个元组与元组u的第j个分量满足比较关系Ѳ”–t[j]Ѳc或cѲt[j]该公式表示“t的第i个分量与常理c满足比较关系Ѳ”山东师范大学2.5.2元组关系演算•设r目关系R和s目关系S的谓词分别为R(u)和S(v),则:–(1)并:R∪S={t|R(t)∨S(t)}–(2)差:R-S={t|R(t)∧S(t)}–(3)笛卡尔积:R×S={t(r+s)|(u(r))(v(s))(R(u)∧S(v)∧t[1]=u[1]∧…∧t[r]=u[r]∧t[r+1]=v[1]∧…∧t[r+s]=v[s])}–(4)选择:σF(R)={t|R(t)∧F'}–其中F'是条件表达式F在谓词演算中的表示形式。–(5)投影:π(R)={t(k)|(u)(R(u)t[1]=u[i1]…t[k]=u[ik])}–其中t(k)表示元组t有k个分量,而t[i]表示元组t的第i个分量,u[j]表示元组u的第j个分量。山东师范大学2.5.2元组关系演算•【例2-15】设有关系模式STUDENT(借书证号,姓名,专业,性别,出生时间,借书数,照片,办证日期),试用元组关系演算来表达下述查询。–(1)列出计算机专业的所有学生:S计算机={t|STUDENT(t)∧t[3]='计算机'}–(2)列出所有1980年以前出生的学生:S出生年月={t|S(t)∧t[5]1980}山东师范大学2.5关系演算•2.5.1元组关系演算语言ALPHA•2.3.2元组关系演算•2.5.3域关系演算语言QBE山东师范大学2.5.3域关系演算语言QBEl一种典型的域关系演算语言–由M.M.Zloof提出–1978年在IBM370上得以实现–QBE也指此关系数据库管理系统lQBE:QueryByExample基于屏幕表格的查询语言–查询要求:以填写表格的方式构造查询•用示例元素(域变量)来表示查询结果可能的情况–查询结果:以表格形式显示山东师范大学域关系演算语言QBE(续)lQBE操作框架关系名属性名操作命令元组属性值或查询条件或操作命令山东师范大学一、检索操作•操作步骤(1)用户提出要求;(2)屏幕显示空白表格;(3)用户在最左边一栏输入要查询的关系名,例如Student;Student山东师范大学检索操作(续)(4)系统显示该关系的属性名(5)用户在上面构造查询要求StudentSnoSnameSsexSageSdeptP.TAO.CStudentSnoSnameSsexSageSdept山东师范大学检索操作(续)(6)屏幕显示查询结果StudentSnoSnameSsexSageSdept李勇张立C山东师范大学1.简单查询[例1]查询全体学生的全部数据。StudentSnoSnameSsexSageSdeptP.95001P.李勇P.男P.20P.CS山东师范大学简单查询(续)显示全部数据也可以简单地把P.操作符作用在关系名上。StudentSnoSnameSsexSageSdeptP.山东师范大学2.条件查询•(1)简单条件•(2)不同属性条件的与•(3)同一属性条件的与•(4)或条件•(5)多表连接•(6)非条件山东师范大学2.条件查询•(1)简单条件[例2]求信息系全体学生的姓名。StudentSnoSnameSsexSageSdeptP.李勇IS山东师范大学条件查询(续)[例3]求年龄大于19岁的学生的学号。StudentSnoSnameSsexSageSdeptP.9500119山东师范大学条件查询(续)•(2)不同属性条件的与–表示方法•把两个条件写在同一行上;•把两个条件写在不同行上,但使用相同的示例元素值。山东师范大学条件查询(续)[例4]求计算机科学系年龄大于19岁的学生的学号。方法(