第二章 关系数据库系统 ...

58
第第第 第第第第第第第第第第第第 第第第第第第第第第第第第第 第第 统统 E.F.Code 第 1970 第第第1976 第第第第第第第第第 第第第System-R Ingres QBE 第 第第第第第 第第第第第 第第第第第第第 第第第第 第第第第第 、、、 第第第第第第第第第第 第第第第第第第第第第第 第第第第第第第第第第 第第第第第第第第 第第第 ,、 第第第第第 第第第第第第第第第第 第 统统 第第第第第 第第第 第第第第 第第第第第第第第第第第第第 第第第 第第第 第第第第第第第第 第第第第第第 、、 第第 第第第第第第第第 第第第第第第第第第第第 、、 第第 第第第 第第第第第第第第第第第第第 体、。 第第第第第第 第第第 第第第第 第第第 第第第第第第第第 第第第 第第第第 第第第第第 第第第第第第第 、、 第第第 第第第第第第第第第 B

Upload: odette

Post on 11-Jan-2016

173 views

Category:

Documents


5 download

DESCRIPTION

B. 第二章 关系数据库系统 关系数据库系统是基于关系模型的数据库系统,由 E.F.Code 于 1970 年提出。 1976 年后出现实验性及商 品化系统 System-R 、 Ingres 、 QBE 等。 由于具有数 据结构简单、用户使用方便、功能强、数据独立性 高和理论基础深等优点,七十年代末以后问世的产 品绝大多数是关系模型,并逐渐替代网络、层次模 型数据库系统而成为主流数据库系统。 目前关系数 据库系统已经成熟,其产品发展表现在对多机种多 操作系统的适应、查询语言标准化、提供多种开发 工具、具有分布式功能、有较好的开放性以及提供 - PowerPoint PPT Presentation

TRANSCRIPT

第二章 关系数据库系统 关系数据库系统是基于关系模型的数据库系统,由E.F.Code 于 1970 年提出。 1976 年后出现实验性及商品化系统 System-R 、 Ingres 、 QBE 等。 由于具有数据结构简单、用户使用方便、功能强、数据独立性高和理论基础深等优点,七十年代末以后问世的产品绝大多数是关系模型,并逐渐替代网络、层次模型数据库系统而成为主流数据库系统。目前关系数据库系统已经成熟,其产品发展表现在对多机种多操作系统的适应、查询语言标准化、提供多种开发工具、具有分布式功能、有较好的开放性以及提供多媒体管理、知识管理和工程管理的功能。

第一节 关系数据模型 第二节 关系运算 第三节 关系运算的安全性 第四节 关系代数、元组演算、域演算的等价性 第五节 关系数据库查询语言

B

第一节 关系数据模型 数据模型一般包括三个部分:数据结构、数据操作和数据完整性约束。数据模型中的数据结构主要描述数据类型、性质以及数据间的联系。数据结构是数据模型的基础。数据操作与数据约束均建立在数据结构之上。不同的数据结构,对应着不同的数据操作和数据约束。因此,数据模型一般以数据结构分类。数据模型中的数据操作主要描述在相应数据结构上的操作类型与操作方式。数据模型中的数据完整性约束主要描述数据结构内数据间的语法、语义联系,它们间的制约和依存关系,以及数据动态变化的规则以保证数据的正确、有效与相容。

本节介绍的关系数据模型是关系数据库系统的基础。它由以下三个基本部分组成:

1. 关系数据结构 2. 关系中的完整性约束规则 3. 关系运算

B1

1. 关系数据结构关系的数学定义: 域是一个集合; n 个域 Di (i=1, ,n) 的笛卡儿乘积定义为 D1Dn ={(d1 , , dn ) |d1D1, ,dnDn } , (d1 , , dn ) 称为关系元组 , 各 di 称为元组的分量; 称 D1Dn 的任一子集为定义在域 D1 , , 域 Dn 的关系。在作为数据模型的数据结构时,关系概念作如下限定和扩充: (1) 关系必须是有限集合; (2) 通过对每个域附加属性名,取消关系元组的有序性, 一个元组不因其属性顺序的改变而改变。 对关系的域赋予名字,称为属性,而域称为属性的值域; 设属性 Ai 的值域是 Di ,具有属性 A1 ,A2 ,…,An 的关系是一个元 组集合 , 每个元组是一个映射集合 {{A1}D1,…,{An}Dn,} 关系模式是一个系统 R(U, D, DOM, I, F) ,简记为 R(U) R: 关系名 U: 属性集合 D: 属性的值域 DOM:U 到 D 的映射 I: 完整性约束集合 F: 属性间的函数依赖关系 ( 完整性约束与属性间的函数依赖这两个概念在后边叙述 )

B11

接下页

关系可用一个二维表来直观地表示,表的每一列表示一个属性,每一行表示一个元组。列的名字就是属性名。这种二维表有下述基本约束: 同一列的分量具有相同的数据类型,来自同一个域; 不同的列可以来自相同的域,但具有不同的属性名; 没有重复的行; 行的次序可以任意交换; 列的次序可以任意交换; 属性值必须是不可分的数据项。 关系和关系模式是密切相关而又有所不同的概念。关系模式描述了关系的数据结构和语义约束,不是集合。而关系 ( 关系实例 ) 是关系模式在某时刻的‘当前值’ , 是数据集合。关系模式是稳定的,而关系随着数据库的更新而变化。

B111 接下页

studentteacher

例:课程安排数据库的关系模式和关系实例关系模式 (这里仅列出属性集合 ) : teacher(教师编号 ,姓名 ,所属系 ) student(班级 ,人数 ,班主任 , 联系电话 ) course(课程名称 ,教师编号 ,班级 , 时间 ,地点 )

关系实例: course

B112 接下页

课程名称 教师编号 班级 时间 地点量子力学 4409 物 01 4-12 1301数据结构 4410 信 00 4-34 1301微波原理 4413 电 99 4-56 1301

教师编号 姓名 所属系4409 周东 物理系4410 林西 信息系4413 赵南 电子系

班级 人数 班主任 联系电话物 01 50 陈春 84130291信 00 55 苏夏 84133310电 99 60 徐秋 84130780

课本经常引用的关系数据库 COMPANY(六个表 )employee(name,ssn,bdate,address,sex,salary, superssn, dno) 雇员 姓名 证号 生日 地址 性别 工资 负责人证号 部门department(dname, dnumber,mgrssn, mgrstartdate) 部门 部门名 部门号 负责人证号 负责人上任日期depart_location(dnumber, dlocation) 部门地址 部门号 部门所在地 project( pname, pnumber, dnum, plocaion) 工程项目 项目名 项目号 部门号 项目所在地works_on( essn, pno, hours) 工程人员 雇员证号 项目号 小时数dependent( essn, dependent_name, sex, bdate, relationship) 家属 雇员证号 家属姓名 性别 生日 与雇员的关系

一个关系数据库教学模型

B113接下页

候选键的属性称为键属性,关系模式的其它属性称为非键属性。在所有的键中 , 必须指定一个作为用户使用的键,称为主键。

外部键定义:若关系模式 R 的属性子集 X 是另一关系模式 S 的候选 键,则称 X 是 R 关于 S 的外部键。利用外部键可以实现关系模式之间的联系。[例 ] student(班级 ,人数 ,班主任 , 联系电话 ) ,班级是候选键。 course(课程名称 ,教师编号 ,班级 , 时间 ,地点 ) , 课程名称是候选键。 班级是 course 关于 student 的外部键。 利用这个外部键可以实现两个关系之间的联系。

候选键 (或称为关键字,简称为键 key) 定义: 若关系模式 R 的属性子集 K满足下列条件 , 则称为候选键 : (1)R 的任何实例的任两元组在 K 的值都不相同 (唯一性 ); (2)K 的任何真子集都不满足条件 (1)(最小性 )

B114

关系模型的完整性约束

实体完整性约束:主键不能接受空值。空值是指未知或不存在。 该约束可以这样理解:一个关系对应现实世界的一个实体 集。现实世界的实体是可以区分的,有某种唯一性标识。 关系模型以主键作为唯一标识。若主键接收空值,说明存 在某个不可识别的实体。这与‘有某种唯一标识’相矛盾。关联完整性约束:设 X 是关系模式 R 关于关系模式 S 的外部键。 若 R 的关系实例的某个元组在 X 取非空的值 k ,则 S 实例必 须存在某个元组在 X 取值 k 。 例: dno 是关系模式 employee 关于 department 的外部键。 employee 实例每个元组在 dno若取空值,表明该雇员未安排 到某个部门;若取非空值 k ,则表明他被安排到编号为 k 的 部门,因而要求 department 实例必须有某元组在 X 取值 k.

上述的完整性约束是由关系模型确定的。我们将在第四章学习由用户根据应用领域的要求而定义的完整性约束。

B12

第二节 关系运算

关系运算的特点是集合操作方式,即操作的对象和结果都是集合。故这种操作方式称为一次一集合方式。相应地,非关系数据模型的数据操作方式则为一次一记录方式。关系运算有两种定义方式:关系代数:这是用对关系的运算来表达查询要求的方式。 对有限个关系作有限运算所得的结果关系演算:这是用谓词来表达查询要求的方式。用满足条件 的元组的集合表示运算结果。条件称为演算公式。 按谓词变元的基本对象分为两种形式: 元组关系演算 域关系演算

三种关系运算的比较例子

B2

一、 关系代数 关系代数包括五个基本操作 : 1. 并 (二元运算 ):即相同属性结构的关系 R 和 S 的元组并运算; 2.差 (二元运算 ):即相同属性结构的关系 R 和 S 的元组差运算; 3. 笛卡儿乘积 (二元运算 ):定义关系 R 、 S 的笛卡儿乘积为 RS={(r,s)|rRsS}.即穷遍 R 和 S 元组 , 接驳为输出元组 4.投影 (一元运算 ): 定义关系 R 对其属性 i,j,k的投映为 i,j,k(R)={(ri , rj , rk)|rR}, 即仅取 R指定的属性 5.选择 (一元运算 ):定义关系 R 关于条件 F:ric的选择为 F(R)={r|rR ric},即取遍 R满足条件 F 的元组 {=,,>,<,,}.R 的选择操作定义为:附加操作: 6.交 (二元运算 ):同一关系模式两个实例 (元组集合 )的交运算; 7.连接 (二元运算 ):设 A、 B 分别是关系 R 、 S 的属性且有相同的域 , 算术比较运算符 {=,,>,<,,}, R 和 S 关于条件 F:AB 的连接操作定义为 RFS=F(RS)={rs|rRsSr[A]s[B]} 8. 商 (二元运算 ):

B21

查询的关系代数操作例子

并运算 (二元运算 ):设 R 和 S 的对应属性有相同的域,定义 RS={t|tRtS}为 R 与 S 之并

B21A

ABCa b cd a fc b d

ABCb g ad a f

关系 R关系 S

ABCa b cd a fc b db g a

并 RS动画

[例 ]教务处印发选课表给各系填写该系学生选课情况。表格收回后需要综合为一个总表。这可以理解为关系的并运算。

差运算 (二元运算 ):设 R 和 S 的对应属性有相同的域,定义 R-S={t|tRtS}为 R 与 S 之差 .

B21B

ABCa b cd a fc b d

ABCb g ad a f

关系 R关系 S

ABCa b cc b d

交 R-S

动画

[例 ]根据学生名册和学生运动员名册产生学生非运动员名册,这可以理解为关系的差运算。

笛卡儿乘积运算 (二元运算 ):定义关系 R 、 S 的笛卡儿乘积为RS={(r,s)|rRsS}.

B21C

DEFp q rx y z

关系 TABCa b cd a fc b d

关系 R ABCDEFa b c p q ra b c x y zd a f p q rd a f x y zc b d p q rc b d x y z

笛卡儿乘积 RT动画

[例 ]两队散打运动队均由三名队员组成。现作循环比赛,赛事表可看成是两队名单的笛卡儿乘积。

投影 (一元运算 ): 定义关系 R 对其属性 i,j,k的投映为i,j,k(R)={(ri , rj , rk)|rR}

B21D

ACa cd f

AC (R)

ABCa b cd e fa a c

关系 R

动画

[例 ]教务处印发的教学安排表描述了所有课程上课的时间地点。现在仅需列出各门课程及上课时间。这可以理解为关系的选择运算。

ABa bd ea a

AB (R)

选择 (一元运算 ):定义关系 R 关于条件 F:ric的选择为F(R)={r|rR ric},{=,,>,<,,}.

B21E

ABCa b cc b d

B=b(R)ABCa b cd a fc b d

关系 R

动画

[例 ]教务处印发的教学安排表详细地描述了所有课程上课的时间地点。现在需要列出在某一教学时间上课的全部课程。这可以理解为关系的选择运算。

交 (二元运算 ):设 R 和 S 是同一关系模式的两个实例,定义 RS={t|tRtS}=R-(R-S)为 R 与 S 之交。

B21F

ABCd a f

RSABCa b cd a fc b d

ABCb g ad a f

关系 R关系 S

动画

[例 ]根据某系学生名册和全校学生运动员名册产生该系学生运动员表格,这可以理解为关系的交运算。

连接 (二元运算 ):设 A、 B 分别是关系 R 、 S 的属性且有相同的域, 算术比较运算符 {=,,>,<,,}, R 和 S 关于条件 F:AB 的连接操作定义为 RFS=F(RS)={rs|rRsSr[A]s[B]} [ 自然连接 ]设 B 是关系 R 、 S 的共同属性。称满足 R.B=S.B 并限制 B 在 结果关系中只出现一次的连接操作为自然连接,记为 RS [ 复合连接 ]类似于自然连接,但运算结果不含连接属性。 [ 半连接 ]RABS :在连接结果中仅保留 R 的属性。

ABC1 2 34 5 67 8 9

DE3 16 2

ABCDE1 2 3 3 11 2 3 6 24 5 6 6 2 ABC

a b cd b cb d fc a d

BEDb c db c ea d b

ABCEDa b c c da b c c ed b c c dd b c c ec a d d b

RB<DS

自然连

ABCa b cd b cb c fc a d

BEDb c db c ea d b

ABCa b cd b cc a dRR.B=S.BS

半连接

连接

B21G

动画R S

R S

R S

接下页

产品号 价格001 111 002 222003 333 004 444

则 R 和 S 的自然连接为 RS=

产品号 销量001 11002 22

产品号 价格 销量001 111 11002 222 22

R 和 S 的半连接为 RS=产品号 价格001 111002 222

[ 例 ]设关系 R ,S 的实例分别为

R S

B21G1

商操作 (二元运算 ):设关系 R 和 S 的属性集合分别是 Z和 X,并设 ZX, Y=Z-X,定义 R 对 S 的商操作为 D=RS={t|tY(R) 且 sS,tsR}.即在 Y(R)中取最大元组子集 D,使 DSR.

关系 R

ABCDa b c da b e fb c e fe d c de d e fa b d e

CDc de f

关系 S

ABa be d

T=RS

商操作

RTS

ABa bb ce d

Y(R)不符合商操作定

义去掉后得到商关

商关系

B21H

例 使用关系代数在数据库 COMPANY 查询: 研究部所有工作人员的名字和地址。 查询的关系代数表达式 : name,addressdname=‘ 研究部’

(department dnumber=dno employee)

Employee证号 姓名 部门号 地址128 陈大 04 康乐 902 赵二 02 唐湾673 张三 04 东山 290 李四 03 康乐686 王五 01 东山

Department部门号 部门名01 开发部 02 财务部 03 经理部 04 研究部

R1=departmentEmployee证号 姓名 部门号 地址 部门名128 陈大 01 康乐 研究部 902 赵二 02 唐湾 财务部 676 张三 03 东山 研究部 290 李四 02 康乐 经理部 686 王五 01 东山 开发部

B21I

R2=( R1)证号 姓名 部门号 地址 部门名128 陈大 01 康乐 研究部 676 张三 03 东山 研究部

R3=(R2)姓名 地址陈大 康乐 张三 东山

( 二 ) 元组关系演算 用元组集表示关系运算的结果 :{ t |(t) }. { t |(t) } 称为元组演算表达式 , 其中 t 是元组 , (t) 是元组 t 必须满足的逻辑表达式 , 称为元组关系演算公式 , 布尔运算的元组关系演算公式可有限次使用下边五条规则得到:(1) 三种基本演算公式 R(t)=真 ,当且仅当元组 t 属关系 R; t[i]u[j]=真 ,当且仅当元组 t 的分量 i 与元组 u 的分量 j满足算术比较 ; t[i]c=真 ,当且仅当元组 t 的分量 i 与值 c满足算术比较 .(2) 用逻辑算符 连结演算公式 .(3) 用存在量词作用演算公式 . t[]=真 ,当且仅当有元组 t 使算式为真 .(4) 用全称量词作用演算公式 . t[]=真 ,当且仅当任元组 t 使算式为真 .(5) 元组演算公式中运算的优先序 : 括号 , , , , , ,

B22

接下页

例 在数据库 COMPANY 查询: 研究部所有工作人员的名字和地址 . 要求使用元组关系演算表达式 .在关系 employee找出所有元组 e满足 : 在关系 department 存在元组 d满足 选择条件以及和 e 的连接条件 .所有这些 e都仅取属性 name,address.所得元组 t 的集合就是查询结果 .

用元组关系演算表达式{t|employee(e)(…)(...)(d(…))}t[name]=e[name]t[address]=e[address]department(d) (d[dname]=‘研究部’ ) (d[dnumber]=e[dno])employee(name,ssn,bdate,address,sex,salary,superssn,dno)

雇员 姓名 证号生日 地址 性别 工资 上司证号 部门department(dname, dnumber,mgrssn, mgrstartdate) 部门 部门名 部门号 负责人证号 负责人上任日期

B221

( 三 ) 域关系演算 用元组集合表示关系运算的结果 {t1..tk|(t1..tk)}.{t1..tk|(t1..tk)}称为域演算表达式 ,其中 t1..tk 是元组 t 的域变量 .(t1..tk) 是元组 (t1..tk) 必须满足的逻辑表达式 , 称为域关系演算公式 ,布尔运算的域关系演算公式可有限次使用下边五条规则得到:(1)三种基本演算公式 R(t1..tk)= 真 , 当且仅当以 t1..tk 为属性的元组在关系 R 中 , tiuj= 真 , 当且仅当元组 t 的分量 i与元组 u的分量 j 满足算术比较关系 tic= 真 , 当且仅当元组 t 的分量 i 与值 c满足算术比较 .(2)用逻辑运算符 连结公式 .(3)用存在量词作用域关系演算公式 : 若是域关系演算公式 ,则 ti() 也是域关系演算公式 .(4)用全称量词作用域关系演算公式 : 若是域关系演算公式 ,则 ti() 也是域关系演算公式 .(5)元组演算公式中运算优先序 :括号 ,,,,, ,

B23

接下页

用域关系演算表达式{ na | (z)(employee(nsbasxyz) ( (l) (m) (…) ) ) }

department(l m n o) (l=‘研究部’ ) (m=z)

名 证 生 地 部门号

部门名 部门号

employee(name,ssn,bdate,address,sex,salary,superssn,dno) 雇员 姓名 证号生日 地址 性别 工资 上司证号 部门department(dname, dnumber,mgrssn, mgrstartdate) 部门 部门名 部门号 负责人证号 负责人上任日期

相当于关系代数的投映,选择,连接

例 在数据库 COMPANY 查询: 研究部所有工作人员的名字和地址 . 要求使用域关系演算表达式 .在关系 employee寻找这样的元组 , 其部门号 z满足 : 与 department 的连接条件 (department预先经过选择操作 ) 这些元组仅取属性 n,a,这就是查询的结果 .

B231

查询研究部所有工作人员的姓名地址的三种关系运算方式

用元组关系演算表达式{t|EMPLOYEE(e)(.)(.)(d(.))}t[name]=e[name]t[address]=e[address]department(d) (d[dname]=‘研究部’ ) (d[dnumber]=e[dno])

用域关系演算表达式{ na | (z)(employee(nsbasxyz) ( (l) (m) (…) ) ) }

department(l m n o) (l=‘研究部’ ) (m=z)

名 证 生 地 部门号

部门名 部门号

用关系代数表达式 : NAME,ADDRESS(……)

DNAME=‘ 研究部’ DEPARTMENT DNUMBER=DNO EMPLOYEE

B24

第三节 关系运算的安全性关系运算的安全性是指对有限关系运算时要求不导致无限关系和无穷验证。关系代数具有这种性质,但关系演算却有一些反例。例如 若关系 R 的某属性具无限值域时, 则表示式 {t| R(t)}就是一个具有无限个元组的关系。 若变量 t 的定义域是无限域时,则判断 tF(t) 为假或判断 tF(t) 为真,都发生无穷验证。这正是我们所不希望发生的,因为这与计算机资源的有限性冲突。为避免出现这种情况,必须对关系演算作出约束。[ 定义 1] 设是一个元组关系演算公式,的符号集 DOM() 定义为 由如下两类符号构成的集合: (1) 中的常量; (2) 中出现的关系所有元组所有分量值。 在所有关系都有限的情况下, DOM() 是有限集合。[ 定义 2] 元组关系演算表达式 ={t|(t)} 的安全性定义为 (1) 使 (t) 为真的 t, 其分量必属于 DOM(); (2) 对中形如 tF(t) 的子式,使 F(u) 为真的 u, 其分量必属于 DOM(); (3) 对中形如 tF(t) 的子式,使 F(u) 为假的 u, 其分量必属于 DOM().

B3

接下页

[例 1] 设关系 R 、 S 的实例为如右图示。考虑元组关系演算表达式 ={t|t[1]=b R(t) S(t)}, 其符号集为DOM={b}A (R) B (R) C (R) D (S) E (S) F (S)={b,a,3,g,5,h,1,d,f,6,c,7,e}

[例 2] 设元组关系演算表达式 {t|1(t)} 是安全的,而元组关系演算公式 2(t) 不包含可能破坏安全性的形为 tF(t) 、 tF(t) 的子式, 求证任何形如 ={t|1(t)2(t)} 的元组关系演算表达式是安全的 .证明: 若 t 使 (t) = 1(t) 2(t) 为真 ,当然使 1(t) 为真 . 因 {t|1(t)} 是安全的 , 故 t 的分量属于 DOM(1(t))DOM(1(t)2(t))=DOM((t)), 故元组关系演算表达式满足安全性定义的条件 (1). 因 2(t) 不含形为 tF(t) 、 tF(t) 的子式,故 (t)所包含的形 为 tF(t) 、 tF(t) 的子式其实是属于 1(t) 的, 故满足安全性定义的条件 (2) 和 (3) 。

ABCa 3 gb 5 h

DE F1 d g5 b f6 c c7 d e

R SB31

B4 第四节 关系代数、元组演算、域演算的等价性 ‘两个关系运算表达式是等价的’,指的是:它们表达的关系相同。 本节证明关系代数、元组演算、域演算在下述意义下是等价的: (1) 任意关系代数表达式 E ,都有等价的安全元组演算表达式; (2) 任意安全元组演算表达式 E ,都有等价的安全域演算表达式 (3) 任意安全域演算表达式 E ,都有等价的关系代数表达式现仅证明 (1). 对 E 的运算符数目 m ,运用数学归纳法。当 m=0,E 是关系变量 R或一个常关系 (t1,, tk). 当 E 是关系变量 R, E 等价于元组演算式 {t|R(t)},该表达式是安全的 ; 当 E 是一个常关系 (t1,, tk),即 k 个元组的集 ,E 等价于 {t|t=t1,,tk} 此时 (1) 的结论为真。设 mN 时, (1) 的结论成立,往证 m=N+1 时 (1) 的结论也成立。 设 E=E1E2 ,则 E1 和 E2 内的运算符数目 N ,结论 (1) 成立。 逐一考虑关系代数操作符的五种基本情况 : , , , , . 这里仅考虑基本情况 1,即 E=E1E2 , 设 E1={t|1(t)}, E2={t|2(t)}, 令 (t)=1(t)2(t) ,则 E1E2={t|(t)} ,若 t满足 (t) ,由 E1 和 E2 的安 全性, t 的分量在 DOM(1(t))或在 DOM(2(t)) 中,而 (t) 的形为 tF(t) 、 tF(t) 的子式必在 1(t)或 2(t) 内,故 E1E2={t|(t)} 是安全的

第五节 关系数据库查询语言 绝大多数关系数据库查询语言都是以关系代数、元组关系演算 和域关系演算的运算系统为基础建立起来的。

查询语言 关系运算类型 设计者 应用范围 数据库系统(1)ISBL 关系代数 IBM英国中心 少用(2)QUEL 元组演算 加州大学 较广泛 INGRES(3)QBE 域演算 IBM公司 广泛 DB2(4)SQL (1)+(2)+(3) IBM 最广泛

数据库语言的两种使用方式:1 。交互使用:用户直接向数据库系统输入语句,请求服务。2 。嵌入式使用:把数据库语言嵌入到某个程序设计语言中。 这个程序设计语言称为宿主语言。宿主语言程序中的数据库 语言语句,其功能是向数据库系统提出操作要求。

B5

一 .ISBL 语言简介这是 IBM英国科学中心为 PRTV 设计的一种纯关系代数查询语言,

LIST 打印句后表达式的结果‘=’ 把表达式结果赋给一个关系变量‘N!’ 把表达式形式地赋给一个关系变量 R, 后边的语句用到 R 时 ,才即时赋值 .

关系代数 ISBLRS R+SR-S R-SRS RS(R) R:FA (R) R%ARS R*S

除了关系代数操作语句之外,还增加了下述语句:

下表列出了 ISBL 基本操作符号与关系代数的对照情况

ISBL 的集合运算与关系代数标准定义的区别1. 并 /交运算要求两个关系对应属性同名;2.当 R 和 S 属性不同名时 ,R-S 的定义是: 设 R 、 S 的属性集分别是、, R-S=R-(S-R )

为了灵活运算, ISBL 的投影操作允许属性重命名。

B51

二 .QUEL 语言简介

这种语言近似于元组关系演算语言,是 INGRESS 数据库系统的数据定义和操纵语言,可作交互式语言和程序设计语言的子语言使用。其功能分为以下四类:

1. 数据定义 2. 数据查询 3. 数据维护 4. 视图定义

B52

1. 数据定义:建立关系 create, 建立索引 index, 修改关系结构 modify, 删除关系或索引 destory

[例 ] 建立关系 employeeCreate employee{name=test(15), /*15 字节变长字串 */ ssn=c9, /*9 字节定长字串 */ bdate=date, /*日期型数据 */ address=test(30), /*30 字节变长字串 */ sex=c1, /*1 字节定长字串 */ salary=money, /*16位数 , 末两位是角分 */ supperssn=c9, /*9 字节定长字串 */ dno=i4, /*4 字节正数 */}

B52a

2. 数据查询:查询语句的符号形式是 RANGE OF V1 IS R1

RANGE OF V2 IS R2

RANGE OF Vk IS Rk

RETRIVE (V1.Ai1 , , Vn.Ain ) WHERE C(V1 , ,Vk ) 这个语句等价于元组关系演算表达式: { t | (V1)(Vk) ( ** ) } ** : R1(V1)Rk(Vk)t[1]= V1[i1]t[n]=Vn[in] C(V1Vk)

指出每个关系的元组变量

查询元组的属性查询元组的条件

[例 ] 查询研究部雇员的姓名地址reange of E is employeereange of D is departmentretrieve (E.name,E.address)where D.name=‘研究部’ and D.dnunber=E.dno

B52b

3. 数据维护 条件追加元组 append :当满足条件时为指定的关系增加元组; 条件删除元组 delete : 对指定的关系删除满足条件的元组; 条件修改元组 replace :对指定的关系修改满足条件的元组;[例 1]为关系 employee增加一个元组range of E is employeeappend to employee(name=‘王明’ ,ssn=‘653298653’,bdate=’30/03/1952’,address=‘哈尔滨市学府路 24号’ ,sex=‘男’ ,salary=672superssn=‘967523453’,dno=4)

[例 2]对研究部雇员工资提高 10%range of E is employeerange of D is departmentreplce E (salary=salary*1.1)where E.dno=D.number and D.dname=‘研究部’

B52c

4.视图定义 RANGE OF V1 IS R1

RANGE OF V2 IS R2

RANGE OF Vk IS Rk

DEFINE VIEW view_name(A1=Vi1.Bi1 ,,An=Vin.Bin ) WHERE C(V1 , ,Vk ) 其中视图 view_name 的属性 Aj 是 Rij 的属性 Bij ,1jn.

[例 ] 使用关系 employee,works_on 和 project 定义视图 works_on1range of E of employeerange of W of works_onrange of P of projectdefine view works_on1 (name=E.name , pname==P.name, hours=W.hours)where E.ssn=W.ssn and P.pnumber=W.pno

B52d

B53

三 .QBE 语言

QBE 是 IBM公司商品化关系数据库系统 DB2 的可选用户界面之一。 QBE 是一个基于域演算的数据库语言。用户工作方式是在关系框架上填写简单的示例信息作为查询请求。所有操作符后跟圆点,域变量或样板的格式为‘ _ 字符串’,其它类型的字串为常值。下边介绍 QBE 的功能:

1. 数据定义 2. 数据查询 3. 数据维护 4. 视图定义

B53a

关系名 属性名 属性名 属性名操作命令 1 元组属性操作命令 2 或操作命令 3 查询要求信息

关系框架的一般格式

1. 数据定义QBE 系统维护一个表,即关系目录表。它包含数据库中所有关系的名字、属性和说明信息。

[例 ] 建立关系 DEPARTMENT对首行各纵栏,从左到右填 :(命令 ) I. department I.( 第一属性名称 )DNAME( 第二属性名称 )DNUMBER( 第三属性名称 )MGRSSN ( 第四属性名称 )STARTDT然后按首列提示定义各属性 :KEY I.( 是否主属性 )TYPE I.( 数据类型 )DOMAIN I.( 值域名称 )INVERSION I.( 是否索引 )

I.DEPARTMENT I. DNAME DNUMBER MGRSSN STARTDTKEY I. N Y N NTYPE I. CHAR INTEGER INTEGER INTEGERDOMAIN I. NAMES NUMBERS SSN DATE INVERSION I. N Y N N

B53b2. 数据查询用户通过终端的按键,要求 QBE 系统显示所有关系名。然后选择感兴趣的关系属性框架。之后填上域变量和常数表示查询要求。在数据查询框架中,若域变量名前出现操作符‘ P.’ ,系统显示该域变量对应的关系属性值。[例 1] 查询雇员张平的生日和地址。

Employee name ssn bdate address sex salary superssn dno 张平 P. P.

[例 2] 查询为工程项目 5或 7 每周工作时间超过 20小时的雇员证号。works_on essn pno hours P. 5 >20 P. 7 >20

不同行的条件表示‘或’关系

works_on essn pno hours P. _PX _HX

条件框架_HX>20 AND (_PX=5 OR _PX=7)

或者:

3. 数据维护 QBE 有三个数据维护操作:插入元组 I. 删除元组 D. 修改元组 U.[例 1]插入新雇员。

Employee name ssn bdate address sex salary superssn dno I. 张平 123 03/22/57 东山路 2号 男 678 128 5

[例 2]删除工资 <500 元的雇员元组。Employee name ssn bdate address sex salary superssn dno D. <500

[例 2]把张平工资增加 10%.

Employee name ssn bdate address sex salary superssn dno 张平 U._S*1.1

B53c

B53d

4.视图定义 建立视图的方法类似于建立关系。[例 ] 建立视图 BILLS , 包括定货人 (name) 、定购商品 (item) 和应付款项 (charge) 。应付款 项是按所有供应商品最低价格计算,即数量 _q 乘以最低价格。 查询时,视图的数据由相关的关系即时算出,即:按视图指示的 订货人,在关系 ORDER 查出订购商品和数量 _q 。按订购商品, 在关系 SUPPLIERS 查出价格集合,取最小值 _p 。最后在视图显示 最低价格与数量的乘积,即应付款项。I. VIEW BILLS I. name item charge _oakes _hotdog _q*min.all._P

ORDERS name item quantity _oakes _hotdog _q

SUPPLIERS name saddr item price _hotdog _P

B54

肆 结构查询语言 SQL SQL 的全名是 Structured Query Language ,即‘结构查询语言’。SQL 具有定义、查询、更新和控制等多种功能。 第一个 SQL 语言版本是由 IBM公司 SAN JOSE 实验室设计的。从二十世纪七十年代开始,在推出的关系型数据库系统产品如ORACLE 、 SQL/DS 、 DB2 、 SYBASE 上实现了 SQL 语言。 1986 年美国国家标准局 (ANSI)颁布了美国标准的 SQL 。次年,国际标准化组织 (ISO)采纳为国际标准。经过修改和扩充,在 1992 年推出新标准,即 SQL2(或称 SQL92) 。新标准 SQL3将包括了数据库的许多新概念。 SQL既可以交互方式使用,也可以作为程序设计语言子语言使用,是一个兼有关系代数和元组关系演算特征的语言。它包含数据定义语句和数据操纵语句,提供四类功能: 1. 数据定义 2. 数据查询 3. 数据维护 4.视图定义

1. 数据定义 建立关系 create table 修改关系 alter table 删除关系 drop table 建立索引 create index 删除索引 drop index

[例 1] 建立关系 employeeCreate table employee(name varchar(15),/* 变长字串 */ssn char(9), /* 定长字串 */bdate char(9),address varchar(30),sex char(1), salary integer, 四字节整数superssn char(9),dno integer).

B54a

接下页

B54a1

[例 2] 对关系 employee增加属性 job : alter table employee add job varchar(12)

[例 3] 删除关系 employee : drop table employee

[例 4] 删除索引 ssn_index : drop index ssn_index

[例 5] 在关系 employee 建立按键 ssn升序排列的 聚集索引文件 ssn_index : create unique index ssn_index on employee(ssn asc) cluster

接下页

2. 数据查询 SQL 数据查询格式是 SELECT < 属性表 > FROM < 关系名 > WHERE <条件式 >

B54b

例 1 列出工资 <2000 元的雇员姓名和证号 SELECT name,ssn,bdate

FROM employee WHERE salary<2000

例 2 列出全体雇员工资 ( 不重复 ) SELECT distinct salary FROM employee

接下页

employee(name,ssn,bdate,address,sex,salary,superssn,dno) 雇员 姓名 证号生日 地址 性别 工资 上司证号 部门department(dname, dnumber, mgrssn, mgrstartdate) 部门 部门名 部门号 负责人证号 负责人上任日期#project( pname, pnumber, dnum, plocaion) 工程项目 项目名 项目号 部门号 项目所在地

按部门号 dnum找元组得 mgrssn

按所在地哈尔滨找元组得 dnum

按证号 mgrssn找元组 , 完成查询

部门号 所在地------- ----dnum 哈尔滨

负责人 部门号------- ----mgrssn dnum

姓名 地址 证号----------------------------------- mgrssn 1:#prot2:department3:employee3:employee 1:#project

例 3 列出哈尔滨工程项目的项目号 , 部门号 ,负责人的姓名和地址SELECT pnumber,dnum,name,bdate,address FROM employee,department,#projectWHERE ssn = mgrssn and dnumber = dnum and plocation=‘哈尔滨’

接下页

B54b1

employee(name,ssn,bdate,address,sex,salary,superssn,dno) 雇员 姓名 证号生日 地址 性别 工资 上司证号 部门

证号 上司证号0001 e.superssn00020003

逐行扫描取出e.superssn

证号 姓名---- --------- --------- -----

按 e.superssn=s.ssn

找元组 , 取姓名返回

1:employee E2:employee S

循环扫

描证号 e.superssn的雇员叫什么名 ?

返回 :证号 e.superssn的雇员姓名

例 4 列出每位雇员及其领导的姓名SELECT E.name , S.name FROM employee E SWHERE e.superssn=s.ssn

接下页

B54b2

例 5 列出研究部雇员名字地址SELECT E.name,E.address FROM employee E,department DWHERE E.dno =D.dnumber and D.name=‘研究部’

employee(name,ssn,bdate,address,sex,salary,superssn,dno) 雇员 姓名 证号生日 地址 性别 工资 上司证号 部门department(dname, dnumber, mgrssn, mgrstartdate) 部门 部门名 部门号 负责人证号 负责人上任日期

找到研究部元组取得 dnumber

部门号 部门名 ------- ----------- ----dnumber 研究部

1:department

姓名 地址 部门号---- --------- --------- -----

逐行扫描 ,按条件dno=dnumber找元组

2:employee

给出研究部的部门号 dnumber

取出部门号为dnumber 的所有员工的姓名地址

1:department2:employee

B54b3

接下页

例 6 列出项目的编号和名称 , 要求张平是部门领导或参与者 (SELECT pnumber,pname FROM #project,department,employee WHERE dnum==dnumber and mgrssn=ssn and name=‘张平’ )UNION (SELECT pnumber,pname FROM project,works_on,employee WHERE pnumber=pno and essn=ssn and name=‘张平’ )

#project( pname, pnumber, dnum, plocaion)工程项目 项目名 项目号 部门号 项目所在地department(dname, dnumber, mgrssn, mgrstartdate) 部门 部门名 部门号 负责人证号 负责人上任日期employee(name,ssn,bdate,address,sex,salary,superssn,dno) 雇员 姓名 证号生日 地址 性别 工资 上司证号 部门

证号 姓名---- -----ssn 张平找出雇员张平的证号 ssn

1:employee

查出经理证号为 ssn的部门编号 dnumber

经理证号 部门号------- ----ssn dnumber

2:department项目号 部门号 ------- ----pppp dnumber

3:#project

查出部门号为dnumber 的项目号

查询‘张平是项目 部门领导‘的项目

B54 b4

接下页

证号 姓名---- --------- -----ssn 张平找出雇员张平的证号 ssn

1:employee

查出项目成员证号为 ssn 的项目号 pno

雇员证号 项目号------- ----------- ----ssn pno

2:works_on

项目号 项目名 ------- ----------- ----pno dnumber

3:#project

查出项目号为pno 的项目名

查询‘张平是项目成员‘的项目

#project( pname, pnumber, dnum, plocaion) 工程项目 项目名 项目号 部门号 项目所在地works_on( essn, pno, hours) 工程人员 雇员证号 项目号 小时employee(name,ssn,bdate,address,sex,salary,superssn,dno) 雇员 姓名 证号生日 地址 性别 工资 上司证号 部门

例 6 列出项目的编号和名称 , 要求张平是部门领导或参与者 (SELECT pnumber,pname FROM #project,department,employee WHERE dnum==dnumber and mgrssn=ssn and name=‘张平’ )UNION (SELECT pnumber,pname FROM project,works_on,employee WHERE pnumber=pno and essn=ssn and name=‘张平’ )

B54 b5

接下页

例 7 列出项目编号 , 要求张平是部门领导或参与者 SELECT distinct pnumber FROM #project WHERE pnumber in (SELECT pnumber FROM department,employee WHERE dnum=dnumber and mgrssn=ssn and name=‘张平’ )OR pnumber in (SELECT pnumber FROM works_on,employee WHERE pnumber=pno and essn=ssn and name=‘张平’ )

项目表部门表雇员表

项目表工程人员表雇员表

#project( pname, pnumber, dnum, plocaion) 工程项目 项目名 项目号 部门号 项目所在地department(dname, dnumber, mgrssn, mgrstartdate) 部门 部门名 部门号 负责人证号 负责人上任日期works_on( essn, pno, hours) 工程人员 雇员证号 项目号 小时employee(name,ssn,bdate,address,sex,salary,superssn,dno) 雇员 姓名 证号生日 地址 性别 工资 上司证号 部门

B54 b6

接下页

employee(name,ssn,bdate,address,sex,salary,superssn,dno) 雇员 姓名 证号生日 地址 性别 工资 上司证号 部门dependent( essn, dependent_name, sex, bdate, relationship) 家属 雇员证号 家属姓名 性别 生日 与雇员的关系department(dname, dnumber, mgrssn, mgrstartdate) 部门 部门名 部门号 负责人证号 负责人上任日期

按雇员证号 =ssn选出元组子集 S1

雇员证号 家属名------- ----------- ----ssn ----

2:dependent

证号 姓名---- --------- -----ssn

1:employee

逐行循环把 ssn送出

经理证号 部门号------- ----------- ----ssn -----

3:department

按经理证号 =ssn选出元组子集 S2

若集合S1 和 S2都非空 ,则返回ssn 及姓名

例 8 列出有家属的领导的姓名SELECT name FROM employee WHERE exists (SELECT *FROM dependent WHERE essn=ssn)andexists (SELECT * FROM department WHERE mgrssn=ssn)

B54 b7

接下页

例 9 列出无家属的雇员姓名 SELECT name FROM employee WHERE not exists (SELECT * FROM dependent WHERE essn=ssn)

employee(name,ssn,bdate,address,sex,salary,superssn,dno) 雇员 姓名 证号生日 地址 性别 工资 上司证号 部门dependent( essn, dependent_name, sex, bdate, relationship) 家属 雇员证号 家属姓名 性别 生日 与雇员的关系

按雇员证号 =ssn选出元组子集 S

雇员证号 家属名------- ----------- ----ssn ----

2:dependent

证号 姓名---- --------- -----ssn

1:employee 若集合 S是空集合 , 则返回 ssn及姓名

逐行循环把 ssn送出

B54 b8

接下页

例 10 列出参加工程项目 1,2,3 的雇员的证号 , 使用枚举有限集 . SELECT essn FROM works_on WHERE pno in {1,2,3}

若 pno=1,2,3 则返回对应的 essn

雇员证号 项目号------- ----------- ----essn pno

works_on

works_on( essn, pno, hours) 工程人员 雇员证号 项目号 小时

B54 b9

3. 数据维护

SQL 提供了三个数据维护语句,实现关系元组的插 入、删除和修改。下边学习这三个语句的语法格式。

(1)插入语句 (2)修改语句 (3)删除语句

B54c

B54c1

(1)插入语句 语法形式是 INSERT INTO < 关系名 > [(<列名 >,,<列名 > )] (VALUES(<常值 >, , <常值 >)) | SELECT 语句

[例 1] 为 EMPLOYEE 关系增加一个元组 . INSERT INTO employee VALUES (‘王明’ ,‘655325678’,‘1950 年 7月 11日’ , ‘海市东方路 3号’ ,‘男’ ,‘872’,‘655678887’,‘5’)

[例 2]把关系 EMPLOYEE 工资低于 300 元的雇员存入新关系 EM1. CREATE TABLE em1 (name varchar(10),ssn integer,salary integer). INSERT INTO em1(name,ssn,salary) SELECT name,ssn,salary FROM employee WHERE salary<300.

(2)修改语句 语法形式是 UPDATE < 关系名 > SET <列名 >=<常值 >,, <列名 >=<常值 > [WHERE <条件表达式 >][例 1]把关系 project 的 10号工程项目的地址和所属部门 修改为‘北京’和‘ 5’. UPDATE project SET plocation=‘北京’, dnum=‘5’ WHERE pnumber=10 [例 2]把研究部所有雇员的工资提高 10%. UPDATE employee SET salary=salary*1.1 WHERE dno in (SELECT dnumber FROM department WHERE dname=‘研究部’ )

B54c2

(3)删除语句 语法形式是 DELETE FROM < 关系名 > [WHERE <条件表达式 >][例 1]从关系 EMPLOYEE删除在研究部的雇员 . DELETE FROM employee WHERE dno in (SELECT dnumber FROM department WHERE dname=‘研究部’ ) [例 2]删除关系 EMPLOYEE 的全体雇员 DELETE FROM employee

B54c3

B54d 4.视图定义 语法形式是 CREATE VIEW <视图名 > [(<列名 >, ,<列名 >,)] AS <SELECT 语句 >.[例 1] 定义视图 :列出全体工程人员的姓名 ,项目名 , 工作时数 CREATE VIEW works_on1 AS SELECT name,pname,hours FROM employee E, #project P, works_on W WHERE E.ssn=W.essn and P.pnumber=W.pno[例 2] 删除视图 works_on1 : DROP VIEW works_on1

works_on( essn, pno, hours) 工程人员 雇员证号 项目号 小时#project( pname, pnumber, dnum, plocaion) 工程项目 项目名 项目号 部门号 项目所在地employee(name,ssn,bdate,address,sex,salary,superssn,dno) 雇员 姓名 证号生日 地址 性别 工资 上司证号 部门