一、数据库系统
二、关系模型之基本概念
基本内容
1.关系模型概述?
2.什么是关系?
3.关系模型中的完整性约束
重点与难点
●一组概念的区分:围绕关系的相关概念,如域、笛卡尔积,关系,关系模式,关键字/键/码,外码/外键,主码/主键,主属性与非主属性。●三个完整性:实体完整性,参照完整性和用户自定义的完整性;
2.1关系模型概述?
1.形象地说,一个关系(relation)就是一个Table≥关系模型就是处理Table的,
它由三个部分组成:
描述DB各种数据的基本结构形式(Table/Relation)描述Table 与Table之间所可能发生的各种操作(关系运算)描述这些操作所应遵循的约束条件(完整性约束)
2.关系模型的三个要素
**基本结构:**Relation/Table
**基本操作:**Relation Operator
基本的:∪(并, UNION)、-(差,DIFFERENCE)、×(广义积,PRODUCT)、σ(选择, SELECTION)、π(投影, PROJECTION)。
扩展的:∩(交, lNTERSECTION)、⨝ (连接,JOIN)、÷(除, DIVISION)运算
**完整性约束:**实体完整性、参照完整性和用户自定义的完整性
3.关系模型与关系数据库语言的关系
关系运算:关系代数和关系演算;关系演算:元组演算和域演算。
基于关系代数设计的数据库语言(ISBL):用计算机可识别的符号表征关系代数的运算符号
基于元组演算(基于逻辑)设计的数据库语言(Ingres系统的QUEL):用计算机可识别的符号表征元组演算的运算符号
基于域演算设计的数据库语言示例:(QBE: Query By Example)
2.2什么是关系?
1.“表”的严格定义——关系
“列”的取值范围“域”,域(Domain):一组值的集合,这组值具有相同的数据类型
集合中元素的个数称为域的基数(Cardinality)
笛卡尔积:“元组”及所有可能组合成的元组:
元组(d, d2 ,… , d)的每一个值d,叫做一个分量(component)
元组(d1 , d2 ,… , dn)是从每一个域任取一个值所形成的一种组合,笛卡尔积是所有这种可能组合的集合,即:笛卡尔积是由n个域形成的所有可能的n-元组的集合
若Di的基数为mi,则笛卡尔积的基数,即元组个数为m1×m2×m3...×mn若D_{i}的基数为m_{i},则笛卡尔积的基数,即元组个数为m_{1}×m_{2}×m_{3}...×m_{n}若Di的基数为mi,则笛卡尔积的基数,即元组个数为m1×m2×m3...×mn
(1)关系:
一组域D1,D2,...DnD_{1},D_{2} ,...D_{n}D1,D2,...Dn的笛卡尔积的子集笛卡尔积中具有某一方面意义的那些元组被称作一个关系(Relation)
ps:由于关系的不同列可能来自同一个域,为区分,需要为每一列起一个名字,该名字即为属性名。
比如,域名为女人,跳出来的那些元组的那一列名是妻子
(2)关系模式(schema)
关系可用R(A:D1,Az:D2 ,… ,An:Dn )表示,可简记为R(Af ,A2 , … ,An ),这种描述又被称为关系模式或表标题(head)
R是关系的名字,A是属性, D,是属性所对应的域, n是关系的度或目(degree),关系中元组的数目称为关系的基数(cardinality)
例如下图的关系为一3目关系,描述为
家庭(丈夫:男人,妻子:女人,子女:儿童)或家庭(丈夫,妻子,子女)
关系模式R(A:D1,A2:D2 , …,An:Dn)中属性向域的映象在很多DBMS中一般直接说明为属性的类型、长度等,
(3)关系模式与关系
同一关系模式下,可有很多的关系关系模式是关系的结构,关系是关系模式在某一时刻的数据关系模式是稳定的;而关系是某一时刻的值,是随时间可能变化的
2.关系的特性
列是同质:即每一列中的分量来自同一域,是同一类型的数据不同的列可来自同一个域,称其中的每一列为一个属性,不同的属性要给予不同的属性名。
例,我们定义一个域为Person =所有男人、女人和儿童的集合={李基,张鹏,王芳,刘玉,李健,张睿,张峰},则下述“家庭”关系的三个列将来自同一个域Person,因此需要不同的属性名“丈夫”“妻子”“子女”以示区分。
列位置互换性:区分哪一列是靠列名
行位置互换性:区分哪一行是靠某一或某几列的值(关键字/键字/码字)>关系是以内容(名字或值)来区分的,而不是属性在关系的位置来区分
属性不可再分特性:又被称为关系第一范式
3.关系上的一些概念
候选码(Candidate Key)/候选键
关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选码。
有时,关系中有很多组候选码,例如:
学生(S#, Sname, Sage, Sclass, Saddress)
其中属性S#是候选码,属性组(Sname, Saddress)也是候选码(同名同地址的两个同学是不存在的)
主码(Primary Key)/主键
当有多个候选码时,可以选定一个作为主码。
DBMS以主码为主要线索管理关系中的各个元组。
主属性与非主属性
包含在任何一个候选码中的属性被称作主属性,而其他属性被称作非主属性
如“选课”中的S#,C#为主属性,而Sname, Cname, Grade则为非主属性;
最简单的,候选码只包含一个属性
最极端的,所有属性构成这个关系的候选码,称为全码(All-Key)。
比如:关系“教师授课”(T#,C#)中的候选码(T#,C#)就是全码。
外码(Foreign Key)/外键
关系R中的一个属性组,它不是R的候选码,但它与另一个关系S的候选码相对应,则称这个属性组为R的外码或外键。
例如“合同”关系中的客户号不是候选码,但却是外码。因它与“客户”关系中的候选码“客户号”相对应。
两个关系通常是靠外码连接起来的。
2.3关系模型中的完整性
1.实体完整性
关系的主码中的属性值不能为空值。
空值:不知道或无意义的值;
空值:不知道、不存在或无意义的值;
在进行关系操作时,有时关系中的某属性值在当前是填不上的,比如档案中有“生日不详”、“下落不明”、“日程尚待公布”等,这时就需要空值来代表这种情况。关系模型中用‘?'表征
数据库中有了空值,会影响许多方面,如影响聚集函数运算的正确性,不能参与算术、比较或逻辑运算等
意义:关系中的元组对应到现实世界相互之间可区分的一个个个体,这些个体是通过主码来唯一标识的;若主码为空,则出现不可标识的个体,这是不容许的。
2.参照完整性
如果关系R1的外码Fk与关系R2的主码Pk相对应,则R1中的每一个元组的Fk值或者等于R2中某个元组的Pk值,或者为空值
意义:如果关系R1的某个元组t1参照了关系R2的某个元组t2,则t2必须存在
例如关系Student在D#上的取值有两种可能:
√空值,表示该学生尚未分到任何系中
√若非空值,则必须是Dept关系中某个元组的D#值,表示该学生不可能分到一个不存在的系中
3.用户自定义完整性
用户针对具体的应用环境定义的完整性约束条件
如S#要求是10位整数,其中前四位为年度,当前年度与他们的差必须在4以内
实体完整性和参照完整性由DBMS系统自动支持
DBMS系统通常提供了如下机制:
1)它使用户可以自行定义有关的完整性约束条件
2)当有更新操作发生时,DBMS将自动按照完整性约束条件检验更新操作的正确性,即是否符合用户自定义的完整性
三、关系模型之关系代数
3.1关系代数的特点
基于集合,提供了一系列的关系代数操作:并、差、笛卡尔积(广义积)、选择、投影和更名等基本操作
以及交、连接和关系除等扩展操作,是一种集合思维的操作语言。
1.关系代数运算的约束
某些关系代数操作,如并、差、交等,需满足**“并相容性”**
并相容性:
参与运算的两个关系及其相关属性之间有一定的对应性、可比性或意义关联性
定义:关系R与关系S存在相容性,当且仅当:
(1)关系R和关系S的属性数目必须相同;
(2)对于任意i,关系R的第i个属性的域必须和关系S的第i个属性的域相同
假设:R(A1,A2, … , An),S(B1,B2,… ,Bm)
R和S满足并相容性: n=m并且 Domain(Ai)= Domain(Bi)
并相容性的示例
STUDENT(SID char(10), Sname char(8),Age char(3))
PROFESSOR(PID char(10), Pname char(8), Age char(3))
关系STUDENT与关系PROFESSOR是相容的,因为:
(1)关系R和关系S的属性数目都是3
(2)关系R的属性SID与关系S的属性PID的域都是char(10)
(3)关系R的属性Sname与关系S的属性Sname的域都是char(8)
(4)关系R的属性Age与关系S的属性Age的域都是char(3)
3.2关系代数操作
1.“笛卡尔积”操作
Rx S=SxR:Rx S为R中的每一个元组都和S中的所有元组进行串接。SxR为S中的每一个元组都和R中的所有元组进行串接。结果是相同的。
两个关系R和S,它们的属性个数分别为n和m(R是n度关系,S是m度关系)
则笛卡尔积Rx S的属性个数=n+m。即元组的前n个分量是R中元组的分量,后m个分量是S中元组的分量(RXS是n+m度关系).
两个关系R和S,它们的元组个数分别为x和y(关系R的基数x, S的基数y),
则笛卡尔积RxS的元组个数=x×y。(RX S的基数是x×y).
2.“投影”操作
定义:给定一个关系R,投影运算结果也是一个关系,记作∏∏∏A®,它从关系R中选出属性包含在A中的列构成。
投影操作从给定关系中选出某些列组成新的关系,而选择操作是从给定关系中选出某些行组成新的关系
3.连接操作
(1)“Θ-连接”操作:
(2)“等值-连接”操作
(3)“自然连接”操作:
3.3复杂操作扩展
1.“除”操作
除法运算经常用于求解“查询.…全部的/所有的.…”问题
前提条件:给定关系R(A1 ,A2y… ,An)为n度关系,关系S(B1,B2,… ,Bm)为m度关系。如果可以进行关系R与关系S的除运算,当且仅当:
属性集{ B1,B2,…,Bm}是属性集{A1,A2,…,An}的真子集,即m 示例: R÷S的结果与S组成的任何元组都在R当中 2.“外连接”操作 示例: 四、关系模型之关系演算 4.1概述 关系演算形式:并运算定义中: R∪s= {r l r∈R ∨r ∈S },再如,差运算定义中:R-S= {r l r∈R ∧r∉S } 关系演算是以数理逻辑中的谓词演算为基础的 关系演算是描述关系运算的另一种思维方式 SQL语言是继承了关系代数和关系演算各自的优点所形成的 按照谓词变量的不同,可分为关系元组演算和关系域演算 关系元组演算是以元组变量作为谓词变量的基本对象 关系域演算是以域变量作为谓词变量的基本对象 4.2关系元组演算公式的形式 例如 “检索出年龄不是最小的所有同学” 4.2存在量词和全程量词公式 4.3等价性变换 4.4元组演算公式与关系代数 4.5关系域演算 4.6关系演算的安全性 关系运算的安全性 “不产生无限关系和无穷验证的运算被称为是安全的” 关系代数是一种集合运算,是安全的 √集合本身是有限的,有限元素集合的有限次运算仍旧是有限的。 关系演算不一定是安全的 例如:{t |¬(R(t))},{ t | R(t)∨ t[2]>3}可能表示无限关系 R(t)是有限的,但不在R(t)中的元素就可能是无限的,后例中的t[2]>3是无限的。 五、SQL语言 5.1概述 SQL语言是集DDL、DML和DCL于一体的数据库语言 SQL语言主要由以下9个单词引导的操作语句来构成,但每一种语句都能表达复杂的操作请求 DDL语句引导词: Create(建立),Alter(修改), Drop(撤消) 模式的定义和删除,包括定义Database, Table, View, Index,完整性约束条件等,也包括定义对象(RowType行对象,Type列对象) DML语句引导词:Insert , Delete, Update, Select 各种方式的更新与检索操作,如直接输入记录,从其他Table(由SubQuery建立)输入 各种复杂条件的检索,如连接查找,模糊查找,分组查找,嵌套查找等 各种聚集操作,求平均、求和、.…等,分组聚集,分组过滤等 DCL语句引导词:Grant, Revoke 安全性控制:授权和撤消授权 5.2SQL语言建立数据库 建立数据库包括两件事:定义数据库和表(使用DDL),向表中追加元组(使用DML ) DDL: Data Definition Language 创建数据库(DB)——Create Database创建DB中的Table(定义关系模式)——Create Table定义Table及其各个属性的约束条件(定义完整性约束)定义View(定义外模式及E-C映像)定义Index、Tablespace… …等(定义物理存储参数)上述各种定义的撤消与修正 DDL通常由DBA来使用,也有经DBA授权后由应用程序员来使用 1.创建Database 数据库(Database)是若干具有相互关联关系的Table/Relation的集合 数据库可以看作是一个集中存放若干Table的大型文件 create database的简单语法形式: create database 数据库名; 2.创建Table create table简单语法形式: Create table 表名(列名 数据类型[Primary key |Unique] [Not null] [,列名 数据类型[Not null], ... ]); “[]”表示其括起的内容可以省略,“|”表示其隔开的两项可取其一 Primary key:主键约束。每个表只能创建一个主键约束。 Unique:唯一性约束(即候选键)。可以有多个唯一性约束。 Not null:非空约束。是指该列允许不允许有空值出现,如选择了Not null表月该列不允许有空值出现。 语法中的数据类型在SQL标准中有定义 建立数据库包括两件事:定义数据库和表(使用DDL),向表中追加元组(使用DML) DML:Data Manipulation Language 向Table中追加新的元组:Insert修改Table中某些元组中的某些属性的值:Update删除Table中的某些元组:Delete对Table中的数据进行各种条件的检索:Select DML通常由用户或应用程序员使用,访问经授权的数据库 3.向表中追加元组的值-INSERT INTO insert into简单语法形式: insert into 表名[(列名[,列名]... ] values(值[,值],...); values后面值的排列,须与into子句后面的列名排列一致 若表名后的所有列名省略,则values后的值的排列,须与该表存储中的列名排列一致 4.简单查询 Select的简单语法形式: Select列名[[,列名]...] From表名 [Where检索条件]; 示例: (1)检索学生表中所有学生的信息 (2)检索学生表中所有学生的姓名及年龄 (3)检索学生表中所有年龄小于等于19岁的学生的年龄及姓名 #(1): Select S#, Sname, Ssex,Sage, Sclass, D# From Student ; Select * From Student ;//如投影所有列,则可以用*来简写 #(2): Select Sname, Sage //投影出某些列 From Student ; #(3): Select Sage, Sname //投影的列可以重新排定顺序 From Student Where Sage <= 19; 结果唯一性问题 关系模型不允许出现重复元组。但现实DBMS,却允许出现重复元组,但也允许无重复元组。在Table中要求无重复元组是通过定义Primary key或Unique来保证的;而在检索结果中要求无重复元组,是通过DISTINCT保留字的使用来实现的。 结果排序问题 DBMS可以对检索结果进行排序,可以升序排列,也可以降序排列。Select语句中结果排序是通过增加order by子句实现的 order by 列名 [asc | desc] 意义为检索结果按指定列名进行排序,若后跟asc或省略,则为升序;若后跟desc,则为降序。 示例:按学号由小到大的顺序显示出所有学生的学号及姓名 示例:检索002号课大于80分的所有同学学号并按成绩由高到低顺序显示 Select S#, Sname From Student Order By S# ASC; Select S# From sc Where C#='002' and Score > 80 Order By Score DESC ; 模糊查询问题 比如检索姓张的学生,检索张某某;这类查询问题,Select语句是通过在检索条件中引入运算符like来表示的 含有like运算符的表达式 列名 [not] like“字符串” 匹配规则: “%”匹配零个或多个字符 “_”匹配任意单个字符 “\”转义字符,用于去掉一些特殊字符的特定含义,使其被作为普通字符看待,如用“%”去匹配字符%,用\_去匹配字符_ 5.3SQL语言多表联合查询 1.Θ-连接之等值连接 示例:按“001”号课成绩由高到低顺序显示所有学生的姓名(二表连接) Select Sname From Student, SC Where Student.S# = SC.S# and SC.C# ='001' Order By Score DESC; 多表连接时,如两个表的属性名相同,则需采用表名.属性名方式来限定该属性是属于哪一个表 示例:按‘数据库’课成绩由高到低顺序显示所有同学姓名(三表连接) Select Sname From Student, SC, Course Where Student.S# = SC.S# and sC.C# = Course.C# and Cname =‘数据库’ Order By Score DESC; 2.表更名与表别名 重名之处理 连接运算涉及到重名的问题,如两个表中的属性重名,连接的两个表重名(同一表的连接)等,因此需要使用别名以便区分 Select列名 as 列别名[[,列名 as 列别名]...] From 表名1 as 表别名1,表名2 as 表别名2,... Where 检索条件; 上述定义中的as可以省略 当定义了别名后,在检索条件中可以使用别名来限定属性 3.不等值连接 0-连接之不等值连接 示例:求有薪水差额的任意两位教师 Select T1.Tname as Teacher1,T2.Tname as Teacher2 From Teacher T1,Teacher T2 Where T1.Salary > T2.Salary; 示例:求年龄有差异的任意两位同学的姓名 Select S1.Sname as Stud1, S2.Sname as Stud2 From Student S1,Student S2 Where S1.Sage > S2.Sage ; 5.4SQL语言进行增-删-改 1.INSERT命令 元组新增Insert命令有两种形式 单一元组新增命令形式:插入一条指定元组值的元组 insert into 表名 [(列名[,列名].….)] values (值[,值]...); 批数据新增命令形式:插入子查询结果中的若干条元组。待插入的元组由子查询给出。 insert into 表名[(列名[,列名].….)] 子查询; 示例:新建Table: SCt(S#,C#, Score),将检索到的成绩及格同学的记录新增到该表中 Insert Into SCt(S#, C#, Score) Select S#, C#, Score From SC Where Score>=60 ; 示例:追加成绩优秀同学的记录 Insert Into SCt(S#, C#, Score) Select S#, C#, Score From SC Where Score>=90 ; 2.DELETE命令 元组删除Delete命令:删除满足指定条件的元组 Delete From 表名[ Where 条件表达式]; 如果Where条件省略,则删除所有的元组。 3.UPDATE命令 元组更新Update命令:用指定要求的值更新指定表中满足指定条件的元组的指定列的值 Update 表名 Set 列名=表达式|(子查询) [[,列名=表达式|(子查询)].…. ] [ Where条件表达式]; 如果Where条件省略,则更新所有的元组。 示例:将所有计算机系的教师工资上调10% Update Teacher Set Salary = Salary *1.1 Where D# in (Select D# From Dept Where Dname ='计算机'); 5.5SQL语言修正与撤销数据库 1.DDL之撤销与修改 修正数据库∶修正数据库的定义,主要是修正表的定义修正基本表的定义 alter table tablename [add {colname datatype,...}] 增加新列 [drop {完整性约束名}] 删除完整性约束 [modify {colname datatype,..] 修改列定义 示例:在学生表Student(S#,Sname,Ssex,Sage,D#,Sclass)基础上增加二列Saddr, PID Alter Table Student Add Saddr char[40],PID char[18] ; 撤消基本表 drop table表名 示例:撤消学生表Student Drop Table Student; 示例:撤消教师表Teacher Drop Table Teacher; 2.DDL之指定与关闭命令 有些DBMS提供了操作多个数据库的能力,此时在进行数据库操作时需要指定待操作数据库与关闭数据库的功能。 指定当前数据库 use 数据库名; 关闭当前数据库 close 数据库名; 六、SQL语言之查询与视图 6.1复杂查询 1.子查询概述 为什么需要子查询? 现实中,很多情况需要进行下述条件的判断 集合成员资格 √某一元素****是否是某一个集合的成员 集合之间的比较 √某一个集合是否包含另一个集合等 集合基数的测试 √测试集合是否为空 √测试集合是否存在重复元组 子查询:出现在Where子句中的Select语句被称为子查询(subquery),子查询返回了一个集合,可以通过与这个集合的比较来确定另一个查询集合。 三种类型的子查询:(NOT)IN-子查询; Θ-Some/Θ-All子查询; (NOT)EXISTS子查询 2.IN与NOTIN谓词子查询 基本语法: 表达式 [not] in (子查询) 语法中,表达式的最简单形式就是列名或常数。 语义:判断某一表达式的值是否在子查询的结果中。 示例:列出选修了001号课程的学生的学号和姓名 示例:列出没学过李明老师讲授课程的所有同学的姓名 Select S#, Sname From Student WhereS#in ( Select S# From sc Where C#=‘001'); Select Sname From Student Where S# not in ( Select S# From SC, Course C, Teacher T Where T.Tname ='李明' and SC.C# = C.C# and T.T#= C.T#); 3.非相关子查询 非相关子查询:内层查询独立进行,没有涉及任何外层查询相关信息的子查询 前面的子查询示例都是非相关子查询 4.相关子查询 相关子查询:内层查询需要依靠外层查询的某些参量作为限定条件才能进行的子查询 外层向内层传递的参量需要使用外层的表名或表别名来限定 示例:求学过001号课程的同学的姓名 Select Sname From Student Stud Where S# in ( Select S# From SC Where S# = Stud.S# and C# =‘001’); 5.Θ-Some/Θ-All子查询 表达式 Θ some(子查询) 表达式 Θ all(子查询) 语法中,Θ是比较运算符:<,>,>= ,<=,=,>。 示例:找出所有课程都不及格的学生姓名(相关子查询) Select Sname From Student Where 60 > all ( Select Score From SC Where S# =Student.S# ); 等价性变换需要注意 如下两种表达方式含义是相同的 表达式 = some(子查询) 表达式in(子查询) 如下两种表达方式含义却是不同的,请注意 表达式 not in (子查询) 表达式 <>some (子查询) not in等价的是 表达式 <> all (子查询) 6.(NOT) EXISTS子查询 基本语法: [not] Exists (子查询) 语义:子查询结果中有无元组存在 示例:检索学过001号教师主讲的所有课程的所有同学的姓名 Select Sname From Student Where not exists //不存在 (Select * From Course //有一门001教师主讲课程 Where Course.T# ='001' and not exists //该同学没学过 (Select* From SC Where S# = Student.S# and C# = Course.C#) ); 上述语句的意思:不存在有一门001号教师主讲的课程该同学没学过 6.2结果计算与聚集计算 1.结果计算 示例:求有差额(差额>0)的任意两位教师的薪水差额 示例:依据学生年龄求学生的出生年份,当前是2015年 Select T1.Tname as TR1,T2.Tname as TR2, T1.Salary - T2.Salary From Teacher T1,Teacher T2 Where T1.Salary > T2.Salary; Select S.S#, s.Sname, 2015-S.Sage+1 as Syear From Student S; 2.聚集函数 SQL提供了五个作用在简单列值集合上的内置聚集函数agfunc,分别是:COUNT、SUM、AVG、MAX、MIN SQL聚集函数的参数类型、结果作用如下: 求个数、求和、求平均、求最大、求最小 除了count(*)之外所有的聚集函数都忽略其输入集合中的空值。 6.3分组查询与分组过滤 1.分组查询 分组:SQL可以将检索到的元组按照某一条件进行分类,具有相同条件值的元组划到一个组或一个集合中,同时处理多个组或集合的聚集运算。 分组的基本语法: Select 列名|expr | agfunc(列名)[L,列名 |expr | agfunc(列名)]….] From 表名1[,表名2...] [ Where 检索条件 ] [ Group by 分组条件]; 分组条件可以是 列名1,列名2,… 示例:求每一个学生的平均成绩 Select S#, AVG(Score) From SC Group by S#; 上例是按学号进行分组,即学号相同的元组划到一个组中并求平均值 2.分组过滤 分组过滤:若要对集合(即分组)进行条件过滤,即满足条件的集合/分组留下,不满足条件的集合/分组剔除。 Having子句,又称分组过滤子句。需要有Group by子句支持,换句话说,没有Group by子句,便不能有Having子句。 Select 列名|expr | agfunc(列名)[[,列名|expr | agfunc(列名)]...] From 表名 1[,表名2.….] [ Where检索条件] [ Group by分组条件[Havinq 分组过滤条件]]; 示例:求不及格课程超过两门的同学的学号 Select S# From SC Where Score < 60 Group by S# Having Count(*)>2; 6.4SQL语言实现关系代数操作 1.并-交-差的处理 SQL语言:并运算UNION,交运算INTERSECT,差运算EXCEPT。 基本语法形式: 子查询 {Union [ALL] | Intersect [ALL]| Except [ALL]子查询} SQL差运算 示例:假定所有学生都有选课,求没学过002号课程的学生学号 Select DISTINCT S# From SC EXCEPT Select S# From sC Where C# =‘002'; 注意oracle没有except,是minus 通常情况下自动删除重复元组:不带ALL。若要保留重复的元组,则要带ALL。 假设子查询1的一个元组出现m次,子查询2的一个元组出现n次,则该元组在: 子查询1 Union ALL子查询2,出现m +n次 子查询1 Intersect ALL子查询2,出现min(m,n)次 子查询1 Except ALL子查询2,出现max(0, m-n)次 2.空值的处理 空值检测 is [not ] null 测试指定列的值是否为空值 除is [not] null之外,空值不满足任何查找条件 如果null参与算术运算,则该算术表达式的值为null 如果null参与比较运算,则结果可视为false。在SQL-92中可看成unknown 如果null参与聚集运算,则除count(*)之外其它聚集函数都忽略null 3.内连接、外连接 Select列名[[列名].…..] From表名1 [NATURAL] [ INNER |{LEFT RIGHT |FULL} [OUTER]] { ON连接条件|Using (Colname {, Colname ...}) } [Where检索条件]...; 示例:求所有教师的任课情况(没有任课的教师也需列在表中) Select Teacher.T#, Tname, Cname From Teacher Left Outer Join Course ON Teacher.T# = Course.T# Order by Teacher.T# ASC ; 6.5视图及其应用 对应概念模式的数据在SQL中被称为基本表(Table),而对应外模式的数据称为视图(View)。视图不仅包含外模式,而且包含其E-C映像。 定义视图 create view view_name[(列名[,列名].….)] as子查询[with check option] 如果视图的属性名缺省,则默认为子查询结果中的属性名;也可以显式指明其所拥有的列名。 示例:定义一个视图CompStud为计算机系的学生,通过该视图可以将Student表中其他系的学生屏蔽掉 Create View CompStud AS (Select * From Student Where D# in ( Select D# From Dept Where Dname ='计算机')); 使用视图:定义好的视图,可以像Table一样,在SQL各种语句中使用 示例:检索主讲数据库课程的教师姓名,我们可使用Teach Select T.Tname From Teach T Where T.Cname ='数据库'; SQL视图更新的可执行性 如果视图的select目标列包含聚集函数,则不能更新如果视图的select子句使用了unique或distinct,则不能更新如果视图中包括了group by子句,则不能更新如果视图中包括经算术表达式计算出来的列,则不能更新如果视图是由单个表的列构成,但并没有包括主键,则不能更新 对于由单一Table子集构成的视图,即如果视图是从单个基本表使用选择、投影操作导出的,并且包含了基本表的主键,则可以更新 撤消视图 Drop View view name 示例:撤消视图Teach Drop View Teach; 撤消基本表 Drop Table 表名 示例:撤消学生表Student Drop Table Student; 七、数据库完整性和安全性 7.1数据库完整性的概念及分类 1.数据库完整性 数据库完整性(DB Integrity)是指DBMS应保证的DB的一种特性–在任何情况下的正确性、有效性和一致性 √广义完整性:语义完整性、并发控制、安全控制、DB故障恢复等 √狭义完整性∶专指语义完整性,DBMS通常有专门的完整性管理机制与程序来处理语义完整性问题。(本讲专指语义完整性) 关系模型中有完整性要求 实体完整性 参照完整性 用户自定义完整性 为什么会引发数据库完整性的问题呢? 不正当的数据库操作,如输入错误、操作失误、程序处理失误等>数据库完整性管理的作用 数据库完整性管理的作用: 防止和避免数据库中不合理数据的出现 DBMS应尽可能地自动防止DB中语义不合理现象 DBMS怎样自动保证完整性呢? DBMS允许用户定义一些完整性约束规则(用SQL-DDL来定义) 当有DB更新操作时,DBMS自动按照完整性约束条件进行检查,以确保更新操作符合语义完整性 2.完整性约束条件 完整性约束条件(或称完整性约束规则)的一般形式 lntegrity Constraint ::=(O,P,A,R) √ O:数据集合:约束的对象? 列、多列(元组)、元组集合 √P:谓词条件:什么样的约束? √A:触发条件:什么时候检查? √R:响应动作:不满足时怎么办? 3.数据库完整性的分类 (1)按约束对象分类: 域完整性约束条件 √施加于某一列上,对给定列上所要更新的某一候选值是否可以接受进行约束条件判断,这是孤立进行的 关系完整性约束条件 √施加于关系/table上,对给定table上所要更新的某一候选元组是否可以接受进行约束条件判断,或是对一个关系中的若干元组和另一个关系中的若干元组间的联系是否可以接受进行约束条件判断 (2)按约束来源分类 结构约束 √来自于模型的约束,例如函数依赖约束、主键约束(实体完整性)、外键约束(参照完整性),只关心数值相等与否、是否允许空值等; 内容约束 √来自于用户的约束,如用户自定义完整性,关心元组或属性的取值范围。例如Student表的Sage属性值在15岁至40岁之间等。 (3)按约束状态分类 静态约束 √要求DB在任一时候均应满足的约束;例如Sage在任何时候都应满足大于0而小于150(假定人活最大年龄是150)。 动态约束 √要求DB从一状态变为另一状态时应满足的约束;例如工资只能升,不能降:工资可以是800元,也可以是1000元;可以从800元更改为1000元,但不能从1000元更改为800元。 7.2SQL语言实现静态完整性 1.约束的方法-Create Table 列约束: 表约束: 2.触发器 7.3数据库安全性概念及分类 1.概念 数据库安全性是指DBMS应该保证的数据库的一种特性(机制或手段):免受非法、非授权用户的使用、泄漏、更改或破坏 数据的安全级别:绝密(Top Secret),机密(Secret),可信(Confidential)和无分类(Unclassified) 数据库系统DBS的安全级别:物理控制、网络控制、操作系统控制、DBMS控制 DBMS的安全机制 **自主安全性机制:**存取控制(Access Control) √通过权限在用户之间的传递,使用户自主管理数据库安全性 强制安全性机制: √通过对数据和用户强制分类,使得不同类别用户能够访问不同类别的数据 推断控制机制 数据加密存储机制 DBMS怎样自动实现自主安全性呢? DBMS允许用户定义一些安全性控制规则(用SQL-DCL来定义) 当有DB访问操作时,DBMS自动按照安全性控制规则进行检查,检查通过则允许访问,不通过则不允许访问 2.数据库自主安全性访问规则 AccessRule ::=(S, O, t,P) √S:请求主体(用户) √O:访问对象 √ t:访问权利 √P:谓词 {AccessRule }通常存放在数据字典或称系统目录中,构成了所有用户对DB的访问权利; 用户多时,可以按用户组建立访问规则 访问对象可大可小(目标粒度Object granularity):属性/字段、记录/元组、关系、数据库 权利:包括创建、增、删、改、查等 谓词:拥有权利需满足的条件 2.自主安全性的实现方式 存储矩阵 视图:视图是安全性控制的重要手段 7.4SQL实现数据库自主安全性 1.SQL语言的用户与权利 授权命令(重点) GRANT {all PRIVILEGES | privilege {,privilege....}} ON [TABLE] tablename | viewname TO {public| user-id {, user-id...}] [WITH GRANT OPTION]; user-id,某一个用户账户,由DBA创建的合法账户 public,允许所有有效用户使用授予的权利 privilege是下面的权利 √ SELECT INSERT |UPDATE| DELETE |ALL PRIVILEDGES WITH GRANT OPTION选项是允许被授权者传播这些权利 示例: 假定高级领导为Emp0001,部门领导为Emp0021,员工管理员为Emp2001,收发员为Emp5001(均为Userld,也即员工的P#) Grant All Priviledges ON Employee TO Emp2001; Grant SELECT ON EmpV2 TO Emp5001 ; Grant SELECT ON EmpV3Topublic; Grant SELECT ON EmpV4 TO Emp0021; 收回授权命令 REVOKE {all privilEges | priv {, priv...}} ON tablename / viewname FROM{public [ user {, user...} ; 示例 revoke select on employee from UserB; 2.强制安全性机制 强制安全性通过对数据对象进行安全性分级 绝密(Top Secret),机密(Secret),可信(Confidential)和无分类(Unclassified) 同时对用户也进行上述的安全性分级 从而强制实现不同级别用户访问不同级别数据的一种机制 解释上面,因为高等级用户修改了低等级数据之后就会把数据等级提高,那么低等级用户就不能再修改这个数据了 八、数据库建模思想与方法 8.1数据建模之基本思想 1.E-R模型 基本观点:世界是由一组称作实体的基本对象和这些对象之间的联系构成的 实体、属性、联系、关键字/码 参与发生联系的实体的数目,称为联系的度或元。 联系有一元联系、二元联系和多元联系 实体之间的联系有很多种类 二元联系∶—对一、一多和多对多联系 一对一联系**(1:1)∶实体A的实例只能和实体B的一个实例发生联系,反之,实体B的实例也只能和实体A的一个实例发生联系。 一个“经理”只管理一个“商店”,一个“商店”只能有一个“经理” 一对多联系(1:m和m:1):实体A的实例能和实体B的多个实例发生联系,反之,实体B的实例只能和实体A的一个实例发生联系。 一个“画家”可以绘制多幅“作品”,一幅“作品”只能由一个“画家”来完成 多对多联系(m:n)**:实体A的实例可以和实体B的多个实例发生联系,反之,实体B的实例也可以和实体A的多个实例发生联系。 一位同学可以选学多门课程,一门课程可由多个人来选学 联系的**基数(Cardinalities)😗*实体实例之间的联系的数量,即一个实体的实例通过一个联系能与另一实体中相关联的实例的数目 通常以实体参与联系的最小基数和最大基数来标记(MinCard…MaxCard) “书架”参与“存放图书”联系的基数为(0…m),而“图书”参与此联系的基数为(1…1) 一个“书架”可以存放0或多本“图书”,一本“图书”只能存放在1个“书架” **完全参与联系:**即该端实例至少有一个参与到联系中,最小基数为1(1…m) 部分参与联系:即该端实例可以不参与联系,最小基数为0(0…m) 2.Crow’s foot方法 实体:矩形框,实体的名称写在横线上面 属性:实体框横线的下面 关键字:属性下加下划线 联系:菱形框表示,也可以将菱形框省略而直接以联系名来替代 强调:一种图形代表着一类业务规则 强调:不是在画图,而是在表达业务规则 九、数据库设计过程 9.1概述 需求分析:收集需求和理解需求,“源” 概念数据库设计:建立概念模型,“E-R图/IDEF1x图” 逻辑数据库设计:建立逻辑模型,“关系模式”包括全局模式和用户模式(外模式) 物理数据库设计:建立物理模型,“Create Table”,包括物理数据组织等,依赖于具体的DBMS 9.2概念数据库设计 1.设计思路 先局部后全局 先全局后局部 **局部E-R模式设计:**需求分析的“源”——确定局部结构范围——实体定义——联系定义——属性分配——全局E-R模式设计 **全局E-R模式设计:**局部E-R模式——确定公共实体类型——合并两个局部E-R模式——检查并消除冲突——(还有未合并的局部模式?)——全局E-R模式优化 2.消除冲突 属性冲突 -属性域的冲突:属性的类型、取值范围不同 如不同学校的学号编码方式不同 一属性取值单位冲突 如重量分别采用磅、千克 结构冲突 一同一对象在不同应用中的抽象不同 如职工在某应用中是实体,在另一应用中则抽象为属性 -同一实体在不同E-R图中属性组成不同 -实体之间的联系在不同E-R图中呈现不同的类型 命名冲突 -同名异义∶不同意义的对象具有相同的名字 -异名同义:同一意义的对象具有不同的名字 3.数据库设计理论 数据依赖理论关系范式理论模式分解理论 十、函数依赖及其公理/定理 10.1函数依赖 1.定义 函数依赖: 设R(U)是属性集合U={A1,A2.....An}U=\{A_{1},A_{2}.....A_{n}\}U={A1,A2.....An}上的一个关系模式,X, Y是U上的两个子集,若对R(U)的任意一个可能的关系r,r中不可能有两个元组满足在X中的属性值相等而在Y中的属性值不等,则称“X函数决定Y”或“Y函数依赖于X”,记作X→Y。 2.特性 函数依赖的特性 (1)对X→Y,但Y∉X,则称X→Y为非平凡的函数依赖; (⑵)若X→Y,则任意两个元组,若X上值相等,则Y上值必然相等,则称X为决定因素; (3)若X→Y ,Y→X,则记作X↔Y ; (4)若Y不函数依赖于X,则记作X[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5LrbfFpT-1687768073955)(E:/typeraa/image/Snipaste_2023-05-25_21-28-29.png)]Y; (5)X→Y,有基于模式R的,则要求对任意的关系r成立;有基于具体关系r的,则要求对某一关系r成立; (6)如一关系r的某属性集X,r中根本没有X上相等的两个元组存在,则X→恒成立; 例如:学生(学号,姓名,班级,课号,课程名,成绩,教师,教师职务) √学号→{姓名,班级};课号→课程名;{学号,课号}→成绩 √教师→教师职务 √{班级,课号}→教师 10.2完全函数依赖与传递函数依赖 1.完全函数依赖定义 例如:U={学号,姓名,年龄,班号,班长,课号,成绩} 2.传递函数依赖定义 ●图书(书号,书名,出版日期,出版社,书架号,房间号,管理员) {书号,书架号}→房间号;房间号→管理员 {书号,书架号}→管理员 ●客户(客户号,客户名称,类别,联系电话,产品编码,产品名称,数量,要货日期) {客户号,产品编码}→{产品名称,数量};{产品名称,数量}→要货日期 {客户号,产品编码}→要货日期 3.候选键的定义 4.外来键(外键)的定义 [Definition]外来键: 若R(U)中的属性或属性组合X并非R的候选键,但X却是另一关系的候选键,则称X为R的外来键(Foreign Key),简称外键。 5.逻辑蕴涵的定义 比如:F含有依赖关系A→B,B→C, 则可推出A→C,所以F逻辑蕴含A→C 6.闭包的定义 闭包是由关系模式R直观得到的函数依赖F所推出的所有隐含的或未隐含的(直观的)函数依赖的集合小集合大闭包,包含了平凡的函数依赖 示例:设R=ABC,F={A→B,B→C},则F+的组成如下,即由如下形式的X→Y构成: (1)X包含A,而Y任意, 如ABC→AB,A→C,AB→BC,… (2)X包含B但不含A且Y不含A,如BC→B,B→C,B→Φ,… (3)X→Y是C→C或C→Φ 10.3关于函数依赖的公理和定理 1.函数依赖的Armstrong公理 设R(U)是属性集U={A1,A2.....An}U=\{A_{1},A_{2}.....A_{n}\}U={A1,A2.....An}上的一个关系模式,F为R(U)的一组函数依赖,记为R(U, F).则有如下规则成立∶ [A1]自反律(Reflexivity rule):若Y⊆X⊆U,则X→Y被F逻辑蕴涵。 [A2]增广律(Augmentation rule):若X→Y属于F,且Z⊆U,则XZ→YZ被F逻辑蕴涵。 [A3]传递律(Transtivity rule):若X→Y∈F, 且Y→Z,则X→Z被F逻辑蕴涵。 其他一些定理 (a)合并律(Union Rule):若X→Y且X→→Z.则X →YZ. (b)伪传递律(Pseudo Transitivity):若X→Y且WY→Z,则XW→Z。 ©分解律(Decomposition Rule):若X→Y且Z⊆Y,则X→Z。 【引理3】如果A1,A2.....AnA_{1},A_{2}.....A_{n}A1,A2.....An是属性,则X→A1,A2.....AnA_{1},A_{2}.....A_{n}A1,A2.....An当且仅当对每个AiA_{i}Ai;有X→AiA_{i}Ai(1
2.属性闭包 简单说就,就是能由X在F范围内,能推导出来的所有属性的集合 10.4函数依赖集的最小覆盖 1.概念 2.计算方法 简单来说就是求出X(0)X^{(0)}X(0)之后,对于函数依赖X→Y,X在集合里面,Y不在的,就把Y放进去,然后继续遍历依赖。 3.性质 [引理6]每个函数依赖集F可被一个其右端至多有一个属性的函数依赖之集G覆盖。 4.最小覆盖 若F满足以下条件,则称F为最小覆盖(minimal Cover)或最小依赖集 F中每个函数依赖的右部是单个属性; (右边只有一个属性) 对任何X→A∈F, 有F - { X→A }不等价于F;(每个函数依赖不可或缺) 对任何X→A∈F, Z→X, ( F - { X→A })∪{Z→A}不等价于F。(每个函数依赖的左端都没有多余属性) 定理:每个函数依赖集F都有等价的最小覆盖F’。 十一、关系模式设计之规范形式 11.1关系的第1范式和第2范式 1.1NF概念 [Definition] 1NF: 若关系模式R(U)中关系的每个分量都是不可分的数据项(值、原子),则称R(U)属于第一范式,记为:R(U)∈1NF. 示例:Star( name, address(street,city) ) Star不属于1NF,因为属性address仍包含了street和city两个属性,其分量不是原子。 1NF要求关系中不能有复合属性、多直属性及其组合 将非1NF转换为1NF情况 示例:Star( name, address(street,city) ) Star( name, address)或者Star ( name, street, city) 将复合属性处理为简单属性;将多值属性与关键字单独组成—新的关系 2.2NF概念 [Definition] 2NF 若R(U)∈1NF且 U中的每一非主属性完全函数依赖于候选键,则称R(U)属于第二范式,记为:R(U)∈2NF。 11.2.关系的第3范式和Boyce-Codd范式 1.3NF概念 指表中的所有数据元素不但要能唯一地被主关键字所标识,而且它们之间还必须相互独立,不存在其他的函数关系, 也就是说,在2NF的基础之上,消除了非主属性对于码的传递函数依赖,如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。 示例: 关系模式分解成3NF 2.BCNF概念 关系模式分解成BCNF 3.总结 1NF消去对主键的部分函数依赖后=2NF。 2NF消去对主键的传递函数依赖后=3NF。 3NF消去对候选键的部分函数依赖和传递函数依赖后 = BCNF。 BCNF是对3NF的改进,即在3NF的基础的又把范围从主码扩大为候选码。 11.3多值依赖 1.概念 设R(U)是一个属性集合U上的一个关系模式,X,Y,和z是U的子集,并且Z=U-X-Y,多值依赖X->->Y成立当且仅当对R的任一个关系r,r在(X,Z)上的每个值对应一组Y的值,这组值仅仅决定于X值而与Z值无关。 若X->->Y,而Z=空集,则称X->->Y为平凡的多值依赖。否则,称X->->Y为非平凡的多值依赖。 2.特性 1)直观地,对于X给定值,Y有一组值与之对应(O或n个)且这组Y值不以任何方式与U-X-Y中属性值相联系,有X→>→Y。 2)若交换t, s的Y值而得到的新元组仍在r中,则X→→Y。 3)X, Y不必不相交,u,v可以与t,s相同。 4)函数依赖是多值依赖的特例。 5)令Z=U-X-Y,有X→→Z,若Z=∅,则必有X→→Y。 学校里一门课程由多名讲师教讲授,一门课程有多本参考书 例如对于物理这门课,有老师李勇和王军,参考书有普通物理学、光学原理、物理习题集 参考书和老师是没有关系的,不管老师怎么换,只要是物理这门课程,那么参考书就不会变,把李勇和王强交换位置不会改变整张表,这就称参考书多值依赖于课程,之所以是多值那是因为参考书不是一本。 3.多值依赖的公理 11.4关系的第4范式和弱第4范式 1.4NF的概念 第四范式消除了非主属性对候选键以外属性的多值依赖。 [定理]若R∈4NF, 则必有R∈BCNF。 [定理]若R上仅存在函数依赖,则若有R∈BCNF 即有R∈4NF,反之,若R∈4NF,也有R∈BCNF。 2W4NF的概念 十二、模式分解存在的问题 12.1模式分解 1.模式分解的概念 12.2无损连接分解 1.概念 2.无损连接分解的检验算法 其实就是相当于: 3.性质 无损连接分解下去的小分解也是无损连接分解 12.3保持依赖分解 1.概念 就是指关系模式的函数依赖集在分解后仍在数据库中保持不变,即关系模式R到ρ=R1,R2,...,Rkρ={R_{1},R_{2},..., R_{k}}ρ=R1,R2,...,Rk的分解,使函数依赖集F被F这些RiR_{i}Ri上的投影蕴涵 2.保持依赖分解的检验算法 (1)求每个Fi{}; (2)求原F中左侧元素的闭包一,将其补齐在Fi中 (3)求G,同时看F中的关系是否都在G中 (4)如果都在,则保持依赖。如果有不在的,就对它求闭包(在G中求闭包)。如果闭包包含它的左侧元素,那么就是保持函数依赖,否则就不保持。 例:R={A, B, C, D, E}, F={B->A, D->A, A->E, AC-B}.判断分解P={R1(ABCE), R2(CD)} 是否保持函数依赖? 这里分成了两个,R1和R2.所以第一步求F1{}和F2{}。 R1中包括ABCE四个元素,在F中找由这4个元素构成的依赖。得到F1={B->A, A->E, AC->B}。同理我们求F2,但F中没有CD组成的依赖,所以F2={空}。 F1={B->A, A->E, AC->B}。 F2={空} 第二步,求F中左侧元素的闭包,目的是为了找出所有传递函数依赖。 B+={BAE};可以得到B能推E,B->E。 D+={DA};得到D->A. A+={AE};得到A->E. AC+={ACBE};得到AC->A,AC->E。这里平凡函数依赖可以不用写,我这里为了展示过程完整性,就写上了。 然后补齐在F1,F2中。要记住,F1是由ABCE4个元素组成的;F2只由CD2个元素组成。 F1={B->A, A->E, AC->B,B->E,AC->A, AC->E} F2={空}; (注:斜体加粗的是补进去的。) 第三步,求G。 G=F1 ∪ F2 ∪ F3…∪Fn 这里G=F1 ∪F2 得: G={B->A,,A->E, AC->B,B->E,AC->A,AC->E} 然后看F中的依赖是否都在G中,发现D->A 不在。 第四步,求D的闭包。 此时范围应该是在G中来找。 得D+={D},没有包含它右侧的A。所以没有保持函数依赖。如果这里算出来D的闭包D={DA…}包含了D->A中的右侧元素,则它就是保持了函数依赖。 12.4将关系模式分解成3NF或BCNF 1.最小依赖集求法: 口诀:右侧先拆单,依赖依次删。 还原即可删,再拆左非单。 示例: R=(A, B,C) F={A→BC,B→C,A →B,AB→C} 第一步∶右侧先拆单,即A->B,A->C .·.F=A→B,A→C ,B→C,A→B(重复删去),AB→C 第二步∶依赖依次删 即考虑将F中各个依赖依次删除,是否还能推出还原,还原即可删。 ■考虑到有A→C,B为多余属性,去掉AB →C ■考虑到A→C可由A→B,B→C得到,去掉A→C .·.F=A→B ,B→C 第三步∶再拆左非单 由于此时左侧已经全为单元素,故不用执行此步,若左侧还有非单元素,考虑能否将其拆成单元素 2.3NF分解 口诀: 保函依赖分解题,先求最小依赖集。 依赖两侧未出现,分成子集放一边,剩余依赖变子集。 若要连接成无损,再添候选做子集。 例1.已知R(ABCDE), F={A ->D,E->D,D->B,BC->D,DC->A}求保持函数依赖的3NF分解,和具有无损连接性及保持函数依赖的3NF分解 第一步:保函依赖分解题,先求最小依赖集。先求出R的最小依赖集,可得F={A ->D,E->D,D->B,BC->D,DC->A} 第二步:依赖两侧未出现,分成子集放一边。首先可以发现没有不出现在两侧的元素不用单独分出一个子集,“剩余依赖变子集”然后我们将各依赖分别划分为子集得到:{AD} {ED} {DB} {BCD} {DCA},即为所求保持函数依赖的3NF分解 第三步:若要连接成无损,再添候选做子集。 (1)候选码的求解:所谓候选码即能决定整个关系的,我们通过找未出现在依赖右边的和两侧均未出现的元素即可求得, (2)可以发现C E未出现在右边,因此候选码为{CE}。故所求具有无损连接性及保持函数依赖的3NF分解为{AD} {ED} {DB} {BCD} {DCA} {CE} 例2.关系模式R,有U={A,B,C,D,E,G},F={B->G,CE->B,C->A,CE->G,B->D,C->D},将关系模式分解为3NF且保持函数依赖 将关系模式分解为3NF且保持函数依赖: 第一步:保函依赖分解题,先求最小依赖集。先求出R的最小依赖集, 假设B->G冗余,则(B)+=BD,没有G故不冗余。 假设CE->B冗余,则(CE)+=CEGDA,没有B故不冗余。 假设C->A冗余,则(C)+=CD,故不冗余。 一次可以得到最小函数依赖集Fm={B->G,CE->B,C->A,B->D,C->D} 第二步:依赖两侧未出现,分成子集放一边,剩余依赖变子集。首先可以发现没有不出现在两侧的元素,然后我们将各依赖分别划分为子集得{BG} {CEB} {CA} {BD} {CD},即为所求保持函数依赖的3NF分解 第三步:若要连接成无损,再添候选做子集。找到R的一个候选码为{CE}。故所求具有无损连接性及保持函数依赖的3NF分解为{BG} {CEB} {CA} {BD} {CD} {CE} (注:范式分解并不唯一,正确即可) 3.BCNF分解 将关系模式R分解为一个BCNF的基本步骤是 1)先求最小依赖集,候码非码成子集 2**)余下左侧全候码,完成BCNF题。** 例.关系模式R,有U={A,B,C,D,E,G},F={B->G,CE->B,C->A,CE->G,B->D,C->D},将关系模式分解为3NF且保持函数依赖 将关系模式分解为3NF且保持函数依赖: 第一步:先求最小依赖集。可以发现CE->G多余,因此最小依赖集为F={B->G,CE->B,C->A,B->D,C->D}。 第二步:候码非码成子集。由于候选码为(CE)因此将CE->B划分出子集(BCE),而B->G,B->D左侧均不含主属性(C、E)中的任何一个故划分出(BG),(BD) 第三步:此时剩余依赖F={C->A,C->D}剩余元素{A,C,D}检查发现函数依赖左侧都是候选码即完成BCNF分解,如果不满足则继续分解余下的。 于是BCNF分解的最后结果为{(BG),(BD),(ACD),(BCE)}。 十三、数据库管理系统实现技术 13.1数据库事务处理技术 1.什么是事务? (1)概念 事务(Transaction) 事务是数据库管理系统提供的控制数据操作的一种手段,通过这一手段,应用程序员将一系列的数据库操作组合在一起作为一个整体进行操作和控制,以便数据库管理系统能够提供一致性状态转换的保证。 (2)事务的宏观性和微观性 **事务的宏观性(应用程序员看到的事务)😗*一个存取或改变数据库内容的程序的一次执行,或者说一条或多条SQL语句的一次执行被看作一个事务。 Begin Transaction exec sql ... exec sql ... exec sql commit work | exec sql rollback work End Transaction **事务的微观性(DBMS看到的事务)😗*对数据库的一系列基本操作(读、写)的一个整体性执行。 事务的并发执行:多个事务从宏观上看是并行执行的,但其微观上的基本操作(读、写)则可以是交叉执行的。 (3)事务的特性:ACID 原子性Atomicity : DBMS能够保证事务的一组更新操作是原子不可分的,即对DB而言,要么全做,要么全不做一致性Consistency: DBMS保证事务的操作状态是正确的,符合一致性的操们规则,不能出现三种典型的不一致性。它是进一步由隔离性来保证的。隔离性Isolation: DBMS保证并发执行的多个事务之间互相不受影响。例如两个事务T1和T2,即使并发执行,也相当于或者先执行了T1,再执行T2;或者先执行了T2,再执行T1。持久性Durability: DBMS保证已提交事务的影响是持久的,被撤销事务的影响是可恢复的。 2.事务调度与可串行性 (1)基本概念 事务调度(schedule):一组事务的基本步**(读、写、其他控制操作如加锁、解锁等)**的一种执行顺序称为对这组事务的一个调度。 并发(或并行)调度:多个事务从宏观上看是并行执行的,但其微观上的基本操作(读、写)则是交叉执行的。 **可串行性:**如果不管数据库初始状态如何,一个调度对数据库状态的影响都和某个串行调度相同,则我们说这个调度是可串行化的(Serializable)或具有可串行性(Serializability)。 注意:可串行化调度一定是正确的并行调度,但正确的并行调度,却未必都是可串行化的调度。 并行调度的正确性是指内容上结果正确性,而可串行性是指形式上结果正确性,便于操作(如右侧图T2中的B=B-20改为B=B-0,则调度是正确的,但是不可串行化) (2)一种简单的事务调度的标记模型 rT(A)r_{T}(A)rT(A):事务T读A。 wT(A)w_{T}(A)wT(A):事务T写A T1:r1(A);w1(A);r1(B);w1(B)T1:r_1(A); w_1(A); r_1(B); w_1(B)T1:r1(A);w1(A);r1(B);w1(B) T2:r2(A);w2(A);r2(B);w2(B)T2: r_2(A); w_2(A); r_2(B); w_2(B)T2:r2(A);w2(A);r2(B);w2(B) (3)冲突可串行性 冲突:调度中一对连续的动作,它们满足:如果它们的顺序交换,那么涉及的事务中至少有一个事务的行为会改变。 有冲突的两个操作是不能交换次序的,没有冲突的两个事务是可交换的 几种冲突的情况∶ √同一事务的任何两个操作都是冲突的 ri(X);wi(Y)r_i(X); w_i(Y)ri(X);wi(Y) wi(X);ri(Y)w_i(X); r_i(Y)wi(X);ri(Y) √不同事务对同一元素的两个写操作是冲突的 wj(X);wj(X)w_j(X); w_j(X)wj(X);wj(X) √不同事务对同一元素的一读一写操作是冲突的 $ w_i(X); r_j(X)$ $ r_i(X); w_j(X)$ **冲突可串行性:**一个调度,如果通过交换相邻两个无冲突的操作能够转换到某一个串行的调度,则称此调度为冲突可串行化的调度。 冲突可串行性判别算法 构造一个前驱图(有向图) 结点是每一个事务Ti。如果TiT_iTi的一个操作与TjT_jTj的一个操作发生冲突,且TiT_iTi在TjT_jTj前执行,则绘制一条边,由TiT_iTi指向TjT_jTj,表征TjT_jTj要在TiT_iTi前执行。 测试检查:如果此有向图没有环,则是冲突可串行化的! 13.2基于封锁的并发控制方法 1.两段封锁协议 读写数据之前要获得锁。每个事务中所有封锁请求先于任何一个解锁请求 **两阶段:加锁段,解锁段。**加锁段中不能有解锁操作,解锁段中不能有加锁操作 两段封锁协议是可以保证冲突可串行性的