第三章 关系模型
TABLE An arrangement of words, numbers, or signs, or combinations of them, as in parallel columns, to exhibit a set of facts or relations in a definite, compact, and comprehensive form; a synopsis or scheme. ——Webster’s Dictionary of the English Language
提纲 关系基本概念 关系模型 关系代数 元组关系演算 域关系演算
关系模型回顾 E.F.Codd于70年代初提出关系数据理论,他因此获得1981年的ACM图灵奖 关系理论是建立在集合代数理论基础上的,有着坚实的数学基础 早期代表系统 SystemR:由IBM研制 INGRES:由加州Berkeley分校研制 目前主流的商业数据库系统 Oracle,Informix,Sybase,SQL Server,DB2 Access,Foxpro,Foxbase
D1×D2×…×Dn = {(d1 , d2 , … , dn) | di∈Di , i=1,…,n} 关系基本概念 域(Domain) 一组值的集合,这组值具有相同的数据类型 如整数的集合、字符串的集合、全体学生的集合 笛卡尔积(Car’tesian Product) 一组域D1 , D2 ,…, Dn的笛卡尔积为: D1×D2×…×Dn = {(d1 , d2 , … , dn) | di∈Di , i=1,…,n} 笛卡尔积的每个元素(d1 , d2 , … , dn)称作一个n-元组(n-tuple) 元组的每一个值di叫做一个分量(component) 若Di的基数为mi,则笛卡尔积的基数为
关系基本概念 例:设 D1为教师集合(T)= {t1,t2} D2为学生集合(S)= {s1,s2 ,s3} D3为课程集合(C)= {c1,c2} 则D1×D2×D3是个三元组集合,元组个数为2×3×2,是所有可能的(教师,学生,课程)元组集合 笛卡尔积可表为二维表的形式 T S C t1 s1 c1 c2 s2 … t2 s3
关系基本概念 关系 笛卡尔积D1×D2×…×Dn的子集叫做在域D1 , D2 ,…, Dn上的关系,用R(D1 , D2 ,…, Dn )表示 R是关系的名字,n是关系的度或目 关系是笛卡尔积中有意义的子集 关系也可以表示为二维表 关系TEACH(T, S, C) 属性 T S C t1 s1 c1 c2 s2 t2 s3 元组
关系基本概念 关系的性质 列是同质的 不同的列可来自同一域,每列必须有不同的属性名。 行列的顺序无关紧要 即每一列中的分量来自同一域,是同一类型的数据。 如TEACH(T, S, C)={(t1 , s1 , c1), (t1 , t2 , c1)}是错误的 不同的列可来自同一域,每列必须有不同的属性名。 如P={t1,t2 , s1,s2 ,s3},C= {c1,c2},则TEACH不能写成TEACH (P, P, C),而应写成TEACH(T, S, C) 行列的顺序无关紧要 任意两个元组不能完全相同(集合内不能有相同的两个元素) 每一分量必须是不可再分的数据。满足这一条件的关系称作满足第一范式(1NF)的
关系模型 数据结构 单一的数据结构——关系 实体集、联系都表示成关系 学生 课程 选修 属于 系 教师 教授 工作 管理 DEPT(D# , DN , DEAN) S(S# , SN , SEX , AGE , D#) C(C# , CN , PC# , CREDIT) SC(S# , C# , SCORE) PROF(P# , PN, D# , SAL) TEACH(P# , C#)
关系模型 候选码(Candidate Key) 主码(Primary Key) 外部码(Foreign Key) 关系中的一个属性组,其值能唯一标识一个元组。若从属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选码 如DEPT中的D#,DN都可作为候选码 任何一个候选码中的属性称作主属性 如SC中的S#,C# 主码(Primary Key) 进行数据库设计时,从一个关系的多个候选码中选定一个作为主码 如可选定D#作为DEPT的主码 外部码(Foreign Key) 关系R中的一个属性组,它不是R的码,但它与另一个关系S的码相对应,则称这个属性组为R的外部码 如S关系中的D#属性
关系模型
关系模型
关系模型 关系模式 关系的描述称作关系模式,包括关系名、关系中的属性名、属性向域的映象、属性间的数据依赖关系等,记作R(A1 , A2 ,…, An ) 属性向域的映象一般直接说明为属性的类型、长度等 某一时刻对应某个关系模式的内容(元组的集合)称作关系 关系模式是型,是稳定的 关系是某一时刻的值,是随时间不断变化的
关系模型 关系数据库 其型是关系模式的集合,即数据库描述,称作数据库的内涵(Intension) 其值是某一时刻关系的集合,称作数据库的外延(Extension)
关系模型 关系操作 关系操作是集合操作,操作的对象及结果都是集合,是一次一集合(Set-at-a-time)的方式 而非关系型的数据操作方式是一次一记录(Record-at-a-time) 关系操作可以用关系代数和关系演算两种方式来表示,它们是相互等价的 如用关系代数来表示关系的操作,可以有选择、投影、连接、除、交、差、并等
关系模型 关系模式的完整性 实体完整性 关系的主码中的属性值不能为空值 空值:不知道或无意义 意义:关系对应到现实世界中的实体集,元组对应到实体,实体是相互可区分的,通过主码来唯一标识,若主码为空,则出现不可标识的实体,这是不容许的
关系模型 参照完整性 如果关系R2的外部码Fk与关系R1的主码Pk相对应,则R2中的每一个元组的Fk值或者等于R1 中某个元组的Pk 值,或者为空值 意义:如果关系R2的某个元组t2参照了关系R1的某个元组t1,则t1必须存在 例如关系S在D#上的取值有两种可能 空值,表示该学生尚未分到任何系中 若非空值,则必须是DEPT关系中某个元组的D#值,表示该学生不可能分到一个不存在的系中
关系模型 用户定义的完整性 系统支持 用户针对具体的应用环境定义的完整性约束条件 如S#要求是8位整数,SEX要求取值为“男”或“女” 实体完整性和参照完整性由系统自动支持 系统应提供定义和检验用户定义的完整性的机制
关系模型 供应商关系S(主码是“供应商号”) 供应商号 供应商名 所在城市 B01 红星 北京 S10 宇宙 上海 T20 黎明 天津 Z01 立新 重庆 今要向关系P中插入新行,新行的值分别列出如下。哪些行能够插入? A.(‘037’,‘绿’,null) B.(null,‘黄’,‘T20’) C.(‘201’,‘红’,‘T20’) D.(‘105’,‘蓝’,‘B01’) E.(‘101’,‘黄’,‘T11’) 零件关系P(主码是“零件号”,外码是“供应商号”) 零件号 颜色 供应商号 010 红 B01 312 白 S10 201 蓝 T20
关系数据语言概述 关系数据语言的特点 一体化 非过程化 面向集合的存取方式 一般关系系统的数据语言都同时具有数据定义、数据操纵和数据控制语言,而不是分为几个语言。对象单一,都是关系,因此操作符也单一。而非关系型系统,如DBTG,有对记录的操作,有对系的操作 非过程化 用户只需提出“做什么”,无须说明“怎么做”,存取路径的选择和操作过程由系统自动完成 面向集合的存取方式 操作对象是一个或多个关系,结果是一个新的关系(一次一关系)。非关系系统是一次一记录的方式
关系数据语言概述 抽象的查询语言 关系代数 关系演算 元组关系演算 域关系演算 用对关系的运算来表达查询,需要指明所用操作 用谓词来表达查询,只需描述所需信息的特性 元组关系演算 谓词变元的基本对象是元组变量 域关系演算 谓词变元的基本对象是域变量
关系数据语言概述 具体系统中的实际语言 SQL QUEL QBE 介于关系代数和关系演算之间,由IBM公司在研制System R时提出 基于Codd提出的元组关系演算语言ALPHA,在INGRES上实现 QBE 基于域关系演算,由IBM公司研制
关系代数运算汇总 基本运算 其它运算 扩展运算 修改操作 一元运算 多元运算 集合交、自然连接、除、赋值 广义投影、外连接、聚集 选择、投影、更名 多元运算 笛卡儿积、并、集合差 其它运算 集合交、自然连接、除、赋值 扩展运算 广义投影、外连接、聚集 修改操作 插入、删除、更新
关系代数的一些记号 给定关系模式R(A1 , A2 , … , An),设r是它的一个具体的关系,记为r(R),tr是关系的一个元组 分量 设tr,则t[Ai]表示元组t中相应于属性Ai的一个分量 属性列 Ai={Ai1, Ai2, … ,Aik}{A1, A2, … ,An},称Ai为属性组 A表示{A1 ,A2 , … ,An}中去掉A后剩余的属性组 t[Ai] = ( t[Ai1], t[Ai2], … , t[Aik])
F(r)={t | t r F(t) = ‘真’} 选择运算 基本定义 在关系r中选择满足给定条件的元组(从行的角度) F(r)={t | t r F(t) = ‘真’} F是选择的条件,t r, F(t)要么为真,要么为假 F的形式:由逻辑运算符连接算术表达式而成 逻辑表达式:,, 算术表达式:X Y X,Y是属性名、常量、或简单函数 是比较算符, { , , , , , ≠}
选择运算 r A<5(r) A<5 C=7(r) A B C 3 6 7 2 5 4 A B C 3 6 7 2 5 4
AGE≥20 ∧ SEX=‘male’(S) 选择运算 示例 找年龄不小于20的男学生 找出Perryridge分支机构带出的贷款额大于$1200的贷款
投影 r B , C(r) 定义 A(r) = { t[A] | tr } , AR 从关系r中取若干列组成新的关系(从列的角度) 投影的结果中要去掉相同的行 r B , C(r) c b f e d a C B A B C b c e f
投影 示例 SN, AGE(S) C#( S#=001 (SC)) 给出所有学生的姓名和年龄 找001号学生所选修的课程号 找出居住在Harrison的所有客户的姓名
并运算 定义 RS 所有至少出现在两个关系中之一的元组集合 rs={ t | tr ts } 对i,r的第i个属性的域必须和s的第i个属性的域相同 换言之,对于关系r(R)和s(S)来说,二者能进行并的充要条件是它们的属性集R,S同质
并运算 R S A B C 3 6 7 2 5 4 A B C 3 4 5 7 2 R∪S A B C 3 6 7 2 5 4
∏S#(C# = 001 (SC))∪∏S#(C# = 002(SC)) 并运算 示例 求选修了001号或002号课程的学生号 方案1: ∏S#(C# = 001∨ C# = 002(SC)) 方案2: ∏S#(C# = 001 (SC))∪∏S#(C# = 002(SC))
差运算 定义 所有出现在一个关系而不在另一关系中的元组集合 rs ={ t | tr ¬r s} r和s必须是相容的 rs
差运算 r s r-s s-r A B C 3 6 7 2 5 4 A B C 3 4 5 7 2 A B C 3 6 7 2 5 4 A
∏S#(C# = 001 (SC)) -∏S#(C# = 002(SC)) 差运算 示例 求选修了001号而没有选002号课程的学生号 ∏S#(C# = 001 (SC)) -∏S#(C# = 002(SC)) 求所有有账户而无贷款的客户姓名
交运算 rs ={ t | tr ts } rs = r (r s) 定义 RS 所有同时出现在两个关系中的元组集合 交运算可以通过差运算来重写 rs = r (r s) RS
交运算 r s A B C 3 6 7 2 5 4 A B C 3 4 5 7 2 r∩s A B C 7 2 3
∏S#(C# = 001 (SC))∩∏S#(C# = 002(SC)) 交运算 示例 求同时选修了001号和002号课程的学生号 ∏S#(C# = 001 C# = 002(SC)) 那个对? ∏S#(C# = 001 (SC))∩∏S#(C# = 002(SC))
交运算 求所有既有账户又有贷款的客户姓名。
广义笛卡尔积运算 元组的连串(Concatenation) 定义 若r = (R1,… ,Rn),s = (S1 ,… ,Sm),则定义r与s的连串为: 定义 两个关系r,s,其度分别为n,m,则它们的笛卡尔积是所有这样的元组集合:元组的前n个分量是r中的一个元组,后m个分量是s中的一个元组 rs的度为r与s的度之和, rs的元组个数为r和s的元组个数的乘积 rs = (R1,… ,Rn, S1 ,… ,Sm) rs={ rs | rR sS }
广义笛卡尔积运算 A B 1 2 C D 10 19 20 E a b r x s C D 10 20 E a b
广义笛卡尔积运算 A=C(r x s) r x s A B 1 2 C D 10 19 20 E a b A B C 10 19 20 E a b A B C D E 1 2 10 20 a b
更名运算 定义 x(E) x(A1, A2 , , An )(E) 给一个关系表达式赋予名字 返回表达式E的结果,并把名字x赋给E 返回表达式E的结果,并把名字x赋给E,同时将各属性更名为A1,A2, ,An 关系被看作一个最小的关系代数表达式,可以将更名运算施加到关系上,得到具有不同名字的同一关系。这在同一关系多次参与同一运算时很有帮助
广义笛卡尔积运算 R 示例 求数学成绩比王红同学高的学生 ∏S.姓名( R.成绩S.成绩 R.课程=数学 S.课程=数学 R.姓名=王红 (RS( R)) R 89 数学 张军 86 王红 93 物理 成绩 课程 姓名 可不可以优化? 86 数学 王红 R.成绩 R.课程 R.姓名 89 张军 93 物理 S.成绩 S.课程 S.姓名
广义笛卡尔积运算 找出所有在Perryridge分支机构中有贷款的客户姓名。
连接 定义 A B A B 从两个关系的广义笛卡儿积中选取给定属性间满足一定条件的元组 A,B为R和S上度数相等且可比的属性列 为算术比较符,为等号时称为等值连接 R S = t[A]y[B]( R×S) A B r s = { ty | tR yS t[A]y[B] } A B
连接 R S R S B < D 求数学成绩比王红同学高的学生。 A B C D E 1 2 3 6 4 5 9 8 7 6 5 4 3 2 1 C B A D E 3 1 6 2 求数学成绩比王红同学高的学生。 ∏S.姓名((课程=数学 姓名=王红(R)) ( 课程=数学S(R))) R.成绩<S.成绩
自然连接 定义 从两个关系的广义笛卡儿积中选取在相同属性列B上取值相等的元组,并去掉重复的行。 自然连接与等值连接的不同 自然连接中相等的分量必须是相同的属性组,并且要在结果中去掉重复的属性,而等值连接则不必。 当R与S无相同属性时,R S = R×S R S = { rs[B] | rR sS r[B]=S[B] }
自然连接 1 2 a b A B C D E r s A B 1 2 4 C D a b r B 1 3 2 s
∏DN(S# = 001(S) DEPT) 自然连接 R S R S 示例 求001号学生所在系的名称 9 8 7 6 5 4 3 2 1 C B A C D 3 1 6 2 A B C D 1 2 3 4 5 6 示例 求001号学生所在系的名称 ∏DN(S# = 001(S) DEPT)
To be or not to be?That’s a question. 自然连接 求001号学生所在系的名称 ∏DN(S# = 001(S DEPT)) OR ∏DN(S# = 001(S) DEPT) To be or not to be?That’s a question. --------Hamlet
Zx = { t[Z] | tr t[X]= x } 除运算 像集(Image Set) 关系r(X , Z), X, Z是属性组,x是X上的取值,定义x在r中的象集为 Zx = { t[Z] | tr t[X]= x } 从R中选出在X上取值为x的元组,去掉X上的分量,只留Z上的分量 X Z Zx 张军同学所选修的全部课程 x=张军 姓名 课程 张军 物理 王红 数学 课程 数学 物理
除运算 { x | x=r[S#] rSC CxC } 如何得到选修了全部课程的学生学号? 做法:逐个考虑选课关系SC中的元组r,求r在姓名SN上的分量x,再求x在选课关系中的像集课程Cx,若Cx包含了所有的课程C,则x是满足条件的一个元组 如何得到选修了全部课程的学生学号? x同学所选修 的全部课程 选修全部课 程的学生 全部课程 { x | x=r[S#] rSC CxC }
除运算 除定义 R(X , Y) S(Y) = { x | x=r[x] rR YxS} R(X, Y) S(Y) = { t | tX(R) uS(tu R) } RS = X(R) X(X(R) S X,Y(R))
除运算 严格的形式化定义: 设r(R)和s(S)是两个关系,并且 ,即模式S中的每个属性都在模式R中。关系 是模式R-S上的关系,即此模式中包含所有在R中而不在S中的属性。元组t属于 当且仅当以下两个条件同时成立: 1、t在 中。 2、对s中的每一个元组 ,在r中都有元组 同时满足以下两个条件: a) b)
除运算 = = = 所有学生选 修全部课程 没有选修全部 课程的学生 选修了全部 课程的学生 物理 数学 课程 王红 张军 姓名
除运算 R S AB (R) AB (R) CD (S) AB (R) CD (S)-R R S= - = A B C e f A B a b c e d A B C D a b c d e f C D c d e f A B a b c e d A B a b e d AB (R) CD (S)-R A B b c R S= A B C D b c d - =
∏S#,C#(SC) C# = 001 C# = 002 (C) 除运算 示例 求同时选修了001和002号课程的学生号 方案1: ∏S#,C#(SC) C# = 001 C# = 002 (C) 方案2: ∏S#(SC C# = 001 C# = 002 (C)) 哪一个正确?
除运算 = = 选修了全部 课程的学生 选修了全部课 程并且成绩都 相同的学生 姓名 课程 张军 物理 王红 数学 课程 数学 物理 93 王红 数学 86 92 课程 数学 物理 = 姓名 成绩 张军 93
赋值运算 定义 临时关系变量关系代数表达式 为使查询表达简单、清晰,可以将一个复杂的关系代数表达式分成几个部分,每一部分都赋予一个临时关系变量,该变量可被看作关系而在后面的表达式中使用 临时关系变量关系代数表达式 赋值给临时关系变量只是一种结果的传递,而赋值给永久关系则意味着对数据库的修改
赋值运算 示例 RS = X(R) X(X(R) Y(S) R) 用赋值重写为: temp1 X(R) temp2 X(temp1 Y(S) R) result temp1 temp2
赋值运算 求未选修001号课程的学生号 方案1:∏S#(S)-∏S#(C# = 001 (SC)) 哪一个 正确? S# SN AGE s1 … s2 s3 S# C# G s1 c1 90 s2 95 c2 96
关系代数查询实例 S# P02 求仅选修了001号课程的学生号 S# P01 P02 S# P01 P03 选修001号课程的学生-选其他课程的学生 =∏S#(C# = 001 (SC))-∏S#(SC-C# = 001 (SC)) S# C# SCORE P03 C02 88 P01 C03 92 S# P01 P02 S# P01 P03 S# P02
p#, INCOME-TAX (P# , SAL*5/100 (PROF)) 广义投影 定义 在投影列表中使用算术表达式来对投影进行扩展 F1 , F2 , … , Fn (E) F1 , F2 ,… , Fn 是算术表达式 示例 求教工应缴纳的所得税 P# , SAL*5/100 (PROF) p#, INCOME-TAX (P# , SAL*5/100 (PROF))
∏P# ,PN , SAL , C# , CN((PROF) PC C) 外连接 例:列出老师的有关信息,包括姓名、工资、所教授的课程 ∏P# ,PN , SAL , C# , CN((PROF) PC C) 500 李三 P04 600 700 800 SAL 孙立 P03 钱广 P02 赵明 P01 PN P# P04 C02 P02 P01 C01 P# C# 化学 C03 数学 C02 物理 C01 CN C# 问题:有关P03 号职工的姓名 和工资信息没 有显示出来 数学 C02 500 李三 P04 700 钱广 P02 物理 C01 800 赵明 P01 CN C# SAL PN P#
外连接 外连接 为避免自然连接时因失配而发生的信息丢失,可以假定往参与连接的一方表中附加一个取值全为空值的行,它和参与连接的另一方表中的任何一个未匹配上的元组都能匹配,称之为外连接 外连接 = 自然连接 + 失配的元组 外连接的形式:左外连接、右外连接、全外连接 左外连接 = 自然连接 + 左侧表中失配的元组 右外连接 = 自然连接 + 右侧表中失配的元组 全外连接 = 自然连接 + 两侧表中失配的元组
外连接 所有老师的信息 500 李三 P04 600 700 800 SAL 孙立 P03 钱广 P02 赵明 P01 PN P# P04 C02 P02 P01 C01 P# C# 化学 C03 数学 C02 物理 C01 CN C# 数学 C02 500 李三 P04 700 钱广 P02 物理 C01 800 赵明 P01 CN C# SAL PN P# 所有老师的信息
外连接 所有课程的信息 500 李三 P04 600 700 800 SAL 孙立 P03 钱广 P02 赵明 P01 PN P# P04 C02 P02 P01 C01 P# C# 化学 C03 数学 C02 物理 C01 CN C# 数学 C02 500 李三 P04 700 钱广 P02 物理 C01 800 赵明 P01 CN C# SAL PN P# 所有课程的信息
外连接 所有老师和 课程的信息 500 李三 P04 600 700 800 SAL 孙立 P03 钱广 P02 赵明 P01 PN P# C02 P02 P01 C01 P# C# 化学 C03 数学 C02 物理 C01 CN C# 数学 C02 500 李三 P04 700 钱广 P02 物理 C01 800 赵明 P01 CN C# SAL PN P# 所有老师和 课程的信息
聚集函数 定义 sumSAL((PROF)) sumSCORE(S# = 001 (SC)) 求一组值的统计信息,返回单一值 使用聚集的集合可以是多重集,即一个值可以重复出现多次。如果想去除重复值,可以用连接符‘-’将‘distinct’附加在聚集函数名后,如sum-distinct sum:求和 求全体教工的总工资 sumSAL((PROF)) 求001号学生的总成绩 sumSCORE(S# = 001 (SC))
count-distinctP#(PC) 聚集函数 avg:求平均 求001号同学选修课程的平均成绩。 avgSCORE(S# = 001(SC)) count:计数 求001号同学选修的课程数。 countC#(S# = 001(SC)) 求任课老师的总数。 count-distinctP#(PC)
maxSCORE(CN = 数学(C) SC)) 聚集函数 max:求最大值 min:求最小值 求学生选修数学的最高成绩 maxSCORE(CN = 数学(C) SC)) 分组 将一个元组集合分为若干个组,在每个分组上使用聚集函数。 属性下标 G 聚集函数属性下标(关系) 按此属性上的 值对关系分组 对此属性在每个分 组上运用聚集函数
S# G sumSCORE ,avgSCORE(SC) 聚集函数 分组运算G 的一般形式 G1 , G2 , ... , Gn G F1 , A1 , F2 , A2 , … , Fm , Am(E) Gi是用于分组的属性, Fi是聚集函数, Ai是属性名。 G 将E分为若干组,满足: 1)同一组中所有元组在G1 , G2 , ... , Gn上的值相同。 2)不同组中元组在G1 , G2 , ... , Gn上的值不同。 示例 求每位学生的总成绩和平均成绩 S# G sumSCORE ,avgSCORE(SC)
S S (∏S# (S) ∏S# (SC)) S 数据库修改 删除 将满足条件的元组从关系中删除 r r E 是对永久关系的赋值运算 例: 删除001号老师所担任的课程 PC PC P# = 001(PC) 删除没有选课的学生 S S (∏S# (S) ∏S# (SC)) S 关系 关系代数表达式
数据库修改 删除Smith的所有账户记录
数据库修改 删除贷款额在0~50之间的所有贷款
数据库修改 删除位于Needham的分支机构的所有账户
SC SC ∏S# (S DN =计算机系 (DEPT)) 数据库修改 插入 插入一个指定的元组,或者插入一个查询结果 r r E 示例:新加入一个老师 PC PC {(P07 ,“周正”, 750 , D08)} 示例:加入计算机系学生选修“数学”的信息 SC SC ∏S# (S DN =计算机系 (DEPT)) ∏C#(CN =数学(C))
数据库修改 插入 插入这样的信息:Smith在Perryridge分支机构的账户A-973上有$1200,则应写作:
数据库修改 插入 对Perryridge分支机构的每个贷款客户赠送一个新的$200的存款 客户,并将其贷款号码作为此账户的号码:
数据库修改 更新 利用广义投影改变元组的某些属性上的值 其中Fi当第i个属性不被修改时是r的第i个属性,当第
数据库修改 更新 如果只希望选出一些元组并只对这些元组进行修改,可以用一下表达式 其中P代表用来选择需要修改的元组的条件。
数据库修改 更新 示例:给每位老师上调10%的工资 PC P# , PN , SAL SAL* 1.1 , D# (PC) 示例:对工资超过800的老师征收5%所得税 PC P# , PN , SAL SAL* 0.95 , D# (SAL 800 (PC)) ∪P# , PN , SAL , D# (SAL 800 (PC))
数据库修改 更新 示例:付给所有账户5%的利息 示例:余额$1000以上的账户得到6%的利息,而其他账户得到5%的利息
create view view_name as <查询表达式> 视图 定义 视图是命名的、从基本表中导出的虚表,它在物理上并不存在,存在的只是它的定义 视图中的数据是从基本表中导出的,每次对视图查询都要重新计算 create view view_name as <查询表达式> 视图之上可以再定义视图 视图 Vs 临时关系变量 视图V1 视图V2 基本表B1 基本表B3 基本表B2
视图 视图的优点 个性化服务 安全性 逻辑独立性 简化了用户观点,使不同用户可以从不同角度观察同一数据 “知必所需”,限制用户数据的访问范围 视图作为基本表与外模式之间的映象
视图 示例 PN = 李明 (p_course) 给出老师所教授课程的信息 create view p_course As ∏PN , CN(PROF PC C) 给出李明老师所教授的课程名称 PN = 李明 (p_course)
p_salary p_salary ∪{(李明, 800)} 视图 视图更新 信息缺失 create view p_salary as ∏PN , SAL(PROF) 在视图p_salary上执行: p_salary p_salary ∪{(李明, 800)} 在基本表PROF上执行: PROF PROF ∪{(李明, 800)} 往PROF中加入元组(李明, 800),缺主码P#信息
视图 null = null? create view s_dean as ∏SN , DEAN(S DEPT) 在视图s_dean上执行: s_dean s_dean ∪{(李寻欢, 叶开)} 在基本表S上执行: S S ∪{(null, 李寻欢, null, null)} 在基本表DEPT上执行: DEPT S ∪{(null, null, 叶开)} null = null?
视图 带标识的null:⊥i ⊥i = ⊥i ⊥i ≠ ⊥k 视图定义中不包括连接属性D# 因此SDEPT结果中不包括(叶开, 伍魁) SN DEAN 张三 莫愁 李四 乐天 王五 安然 李寻欢 叶开 S# SN AGE D# s1 张三 20 d1 s2 李四 23 d2 s3 王五 22 d3 null 李寻欢 D# DN DEAN d1 物理 莫愁 d2 数学 乐天 d3 化学 安然 null 叶开 连接属性 连接属性 视图定义中不包括连接属性D# 因此SDEPT结果中不包括(叶开, 伍魁) 带标识的null:⊥i ⊥i = ⊥i ⊥i ≠ ⊥k
s_dean SN , DEAN安然(SN = 李四(s_dean)) 视图 信息歧义 在视图s_dean上执行: s_dean SN , DEAN安然(SN = 李四(s_dean)) S# SN AGE D# s1 张三 20 d1 s2 李四 23 d2 s3 王五 22 d3 D# DN DEAN d1 物理 莫愁 d2 数学 乐天 d3 化学 安然 SN DEAN 张三 莫愁 李四 乐天 王五 安然 S# SN AGE D# s1 张三 20 d1 s2 李四 23 d3 s3 王五 22 D# DN DEAN d1 物理 莫愁 d2 数学 安然 d3 化学 OR
视图 物化视图 视图的计算结果被实际存储起来 物化视图可以看成是数据库的cache 查询物化视图比重新计算视图要快许多 需要进行物化视图与基本表之间的一致性维护 应用场合 任何需要对派生数据的快速访问、或视图的重新计算非常昂贵、或查询需要耗费非常高的CPU和磁盘吞吐量的应用场合,都可以使用物化视图来提高效率
视图 如一个零售数据库,存储terabytes数量级的几个月的销售数据。而诸如某个商店的某件商品的销售总量这样的查询,每天可能要被零售商、仓库管理员、市场部人员执行若干次。这时可以将商品的销售总量查询结果定义为物化视图 如一个处理定单与产品的事务系统,大量的查询需要连接定单与产品表,可以将定单与产品表的连接结果定义为物化视图
元组关系演算 形式化定义 { t | P(t)} 表示所有使谓词P为真的元组集合 t为元组变量 P是公式 如果元组变量前有“全称”()或“存在”()量词,则称其为约束变量,否则称为自由变量 P是公式 由原子公式和运算符组成
元组关系演算 原子公式 s∈R s[x] u[y] s[x] c s是关系R中的一个元组
元组关系演算 公式的递归定义 原子公式是公式 如果P是公式,那么┑P也是公式 如果P1 , P2是公式,则P1 P2 , P1 P2 , P1 P2也是公式 如果P(t)是公式,R是关系,则tR (P(t))和tR (P(t)) 也是公式
元组关系演算 公式的等价性 P1 P2 ┑(┑P1 ┑P2) tR (P(t)) ┑t R (┑P(t)) q ┑p p q ┑p q T F
元组关系演算 R S { t | t S t[A] >2} { t | t R ┑tS } A B C 1 2 3 4 5 6 7 8 9 A B C 1 2 3 4 6 5 9 A B C 3 4 6 5 9 A B C 4 5 6 7 8 9 { t | t S t[A] >2} { t | t R ┑tS }
元组关系演算 { t | tS uR(t[C] < u[B])} A B C 1 2 3 4 6 A B C 4 5 6 7 8 9 { t | tS uR(t[C] < u[B])} { t | tR uS(t[C] > u[A])} R.B S.C R.A 5 3 4 8 7 6 9 { t | vS uR(u[A]>v[B] t[A]=u[B] t[B]=v[C] t[C]=u[A]))}
元组关系演算 表达式的安全性 元组关系演算有可能会产生无限关系,这样的表达式是不安全的 如{t | ┑(t R)},求所有不在R中的元组 引入公式P的域概念,用dom(P)表示 dom(P) = 显式出现在P中的值 + 在P中出现的关系的元组中出现的值(不必是最小集) 如dom ( t | ┑(t R) )是R中出现的所有值的集合 如果出现在表达式{t | P(t)}结果中的所有值均来自dom(P),则称{t | P(t)}是安全的
元组关系演算 { t |┑(t R) } R dom(┑(t R)) = {A1 , A2, B1 , B2 , B3} A B A1
元组关系演算 示例 {t | tPROF t[SAL] > 800} 找出工资在800元以上的老师 找出工资在800元以上的老师的姓名 {t | sPROF ( t[PNAME] s[PNAME] s[SAL] > 800 )} 给出计算机系老师的姓名 {t | uDEPT ( u[DNAME] = “计算机系” sPROF ( s[DNO] = u[DNO] t[PNAME] s[PNAME] ))}
{t | uC ( sSC ( s[CNO] = u[CNO] t[SNO] s[SNO] ))} 元组关系演算 求选修了全部课程的学生号 {t | uC ( sSC ( s[CNO] = u[CNO] t[SNO] s[SNO] ))} 求选修了张军同学所选修的全部课程的学生姓名 课程,张军选之 所求同学选之 {t | uC ( sSC wS ( s[CNO] = u[CNO] w[SNO] s[SNO] w[SNAME] = “张军” )) s¹SC w¹S ( s¹[CNO] = u[CNO] w¹[SNO] s¹[SNO] w¹[SNAME] = t[SNAME] )}
元组关系演算 元组关系演算与关系代数的等价性 投影 ∏A( R ) = { t | sR ( s[A] = t[A] ) } 选择 F(A)(R) = { t | tR F(t[A]) } 广义笛卡儿积 R(A) S(B) = { t | uRsS( t[A] = u[A] t[B] = s[B])} 并 RS={ t | tR tS} 交 RS={ t | tR ┑tS}
元组关系演算 R(A, B)是二元关系 { t | t∈R u∈R (t[A] ≠u[A] t[B]≠u[B])} 求R中的那些元组,其中在R中存在与之不同的元组,因此当R中元组个数为0或1时,结果为空;当R中元组个数大于1时,表达式的结果是R本身 { t | t∈R u∈R (t[A] ≠u[A] ∧ t[B]≠u[B])} all or none
{ < x1 , x2 , … , xn > | P( x1 , x2 , … , xn )} 域关系演算 形式化定义 { < x1 , x2 , … , xn > | P( x1 , x2 , … , xn )} xi代表域变量,P为由原子构成的公式 原子公式 < x1 , x2 , … , xn > R xi是域变量或域常量 x y 域变量x与y之间满足比较关系 x c 域变量x与常量c之间满足比较关系
域关系演算 R S W R1={< x, y, z> | A B C 1 2 3 4 5 6 7 8 9 A B C 1 2 3 4 6 5 9 D E 7 5 4 8 A B C 4 5 6 R1={< x, y, z> | < x, y, z>R x<5 y>3} A B C 1 2 3 4 5 6 7 8 9 B D A 5 7 4 8 R2={< x, y, z> | (u) (v) ( < z, x, u>R <y, v>W u>v)} R2={< x, y, z> | < x, y, z>R (< x, y, z>S y=4)}
域关系演算 示例 找出工资在800元以上的老师 {< a , b , c , d , e > | < a , b , c , d , e > PROF e > 800} 找出工资在800元以上的老师的姓名 {< b > | a , c , d , e ( < a , b , c , d , e > PROF e > 800 )} 给出计算机系老师的姓名 {< b > | l, m, n, s ( < l, m, n, s > DEPT m =“计算机系” a , c , d , e ( < a , b , c , d , e > PROF l = d ) ) }
域关系演算 R(A, B)是二元关系 求R中的那些元组,其属性列交换后组成的元组仍在R中 ∏R.A, R.B(R.A=S.BR.B=S.A(R S(R)) { t | t∈R u∈R (t[A]=u[B] ∧ t[B]=u[A])} {<a, b>| <a, b>∈R <b, a>∈R}
总结 考虑以下关系数据库。对于下述查询中的每一个,给出一个关系代数表达式、一个元祖关系演算表达式和一个域关系演算表达式: Employee(employee_name,street,city) Works(employee_name,company_name,salary) Company(company_name,city) Manages(employee_name,manager_name) 1、找出First Bank Corporation的所有员工姓名 2、找出First Bank Corporation的所有年收入在$10000以上的员工姓名和居住的街道、城市。
总结 3、找出与其经理居住在同一城市同一街道的所有员工姓名。 4、找出比Small Bank Corporation的所有员工收入都高的员工姓名。 5、用关系代数表达式写出如下应用: a、为数据库中所有工资不高于$100000的经理提工资10%,而高于$100000的经理提工资3%。 b、Small Bank Corporation的员工的所有元组。
总结 给定如下关系模式: R=(A,B,C) S=(D,E,F) 设r(R)和s(S)已知。给出与下面表达式等价的元祖关系演算表达式:
总结 设R=(A,B,C),r1和r2都是模式R上的关系。给出与下述表达式等价的域关系演算表达式: ⋈
总结 设R=(A,B)且S=(A,C),r(R)和s(S)是关系。给出与下述域关系演算表达式等价的关系代数表达式:
总结 用银行的例子,以如下方式书写关系代数查询以找出两个以上客户共有的账户: a、用聚集函数 b、不用任何聚集函数
Q33NY Q33NY