发展过程 人工管理
文件系统 数据只能是定长的 文件间是独立的 数据整体无结构 最小存取单位是记录
数据库系统 数据结构化 数据的共享性高,冗余度低,易扩充 数据独立性高 数据由DBMS统一管理和控制 最小存取单位是数据项
DBMS提供的数据控制功能具有:
安全性(Security) 完整性(Integrity) 并发(Concurrency) 恢复(Recovery) 概念 数据库(DB) 存放数据的仓库,长期存储在计算机内,有组织的数据集合
数据库管理系统(DBMS) 用户与操作系统之间的数据管理软件,负责对数据库的管理和维护
数据库系统(DBS) 在计算机系统中引入数据库后的系统,一般由数据库、数据库管理系统(及其开发工具)、应用系统 、数据库管理员 构成。
数据库管理员(DBA) 进行数据库建立,使用和维护的专门人员
数据模型 对现实世界的模拟 ,表示现实世界中的各种事物 及其联系 的方法
组成 数据结构 数据操作 数据完整性约束:对数据静态和动态特性的限定,定义相容数据库状态的集合及可允许的状态改变 概念模型(信息模型) 独立于计算机之外,不涉及信息在计算机中的表示
e. g. 实体-联系模型,语义数据模型
数据模型 面向计算机
e. g. 层次模型,网状模型,关系模型
三级模式结构 外模式(External Schema) 亦称子模式(Subschema),对数据库用户的数据视图 ,体现用户的数据观点,是对用户数据结构的逻辑描述
模式(Schema) 亦称概念模式或逻辑模式,数据库的总框架,对全体数据逻辑结构和特性的描述,独立于应用程序 和物理存储
内模式(Internal Schema) 亦称存储模式,对数据库存储结构和存取方法 的描述,规定数据在存储介质上的物理组织方式,记录寻址方式,定义物理存储块大小,溢出处理方法。
数据抽象 三级模式结构提供了视图级,概念级和物理级的数据抽象
二级映像
数据库技术发展 第一代层次、网状数据库系统 第二代关系数据库系统 新一代数据库系统 E-R数据模型(Entity-Relationship) 实体(集)【方框】:现实世界中存在的(具有同类特性的)个体(的集合) 属性【椭圆】:实体具有的特性或特质 联系【菱形】: 一对一,一对多,多对多 实体的参与度:参与联系的最小和最大次数 弱实体【双框双线】:依赖于其他实体存在的实体 EER模型(extended E-R) 增加了子类和超类的概念,使E-R数据模型具有更多的语义
下层实体用两竖边为双线的矩形框表示,上层实体和下层实体之间用加小圈 的直线连接起来,下层实体称为上层实体的子 类,上层实体称为超类。
层次数据模型 也叫树形结构,树中的每个节点代表一种记录类型,其应满足:
有且仅有一个结点无双亲,这个结点称为根结点 其他结点有且仅有一个双亲结点 层次模型中的基本数据结构是记录和由记 录组成的层次结构
网状数据模型 允许
关系模型 关系模式(relation schema) 对关系结构的描述,可用
关系名(属性名1,属性名2,…,属性名n)
关系 (relation) 一张二维表,可用于描述一个实体集
属性 (attribute) 每一列为关系的一个属性
域 (domain) 属性的取值范围
元组 (tuple) 一个元组对应实体集中的一个个体
键 (key) 一个或多个属性组成,能唯一标识一个元组
一个关系可能有多个键,选取一个作为主键,其余作为候选键
关系 D1 X D2 X D3 … X Dn 的子集称为在域D1, D2, … , Dn上的关系,表示为 R(D1, D2, … , Dn)
关系是笛卡尔积的有限 子集 关系满足交换律而笛卡尔积不满足,因此为关系的每个列附加一个属性名以取消有序性 三类关系 基本关系(基本表/基表):实际存在的表,是实际存储数据的逻辑表示 查询表 :查询结果对应的表 视图表 : 由基本表或其他视图表导出的虚表 基本关系性质 列是同质的 不同列可出自同一个域 分量应为不可分的数据项 关系模式(Relation Schema) 关系模式**(型):对关系 (值)**的描述,静态且稳定
元组集合的结构
属性构成
属性来自的域
属性与域之间的映象关系
元组语义以及完整性约束条件
属性间的数据依赖关系集合
关系 关系模式在某一时刻的状态或内容
动态、随时间变化
二者往往统称为关系,关系模式为关系的内涵,关系的值为关系的外延
模式中属性到对应域映射的有限集,通常写为r(R)
关系模式的形式化表示 R(U, D, dom, F)
R: 关系名 U: 组成该关系的属性名集合 D: 属性组U中属性来自的域 dom: 属性向域的映象集合 F: 属性间的数据依赖关系集合 简记为 R(U) 或 R(A1, A2, ……, An )
关系数据库模式 关系模式的集合 ,是对数据库中所有数据逻辑结构的描述,表示为R={R1, R2,……, Rp}
关系数据库 关系数据库模式中每个关系模式上的关系的集合,表示为d={r1, r2, …, rp} ,其中ri对应关系模式Ri上的一个关系
候选键(Candidate Key) 能唯一标识一个元组的某一属性组 ,最简单情况下只包含一个属性,最极端情况下所有属性组为候选键,成为全键(All Key)
主键(Primary Key) 多个候选键中选定一个,其余作为隐含键(Implicit Key)或候补键(Alternate Key)
主属性(Prime Attribute) Prime attributes are the attributes of the candidate key which defines the uniqueness .
包含在任何一个候选键中的属性
完整性约束 对关系的某种约束条件
实体完整性(Entity Integrity Constraint ) 主属性不能取空值
参照完整性(Referential Integrity Constraint ) 对作为外键(Foreign Key)的值的约束
R的外键为其他基本关系S的主键:
称R为参照关系(Referencing Relation)
称S为被参照关系(Referenced Relation)或目标关系 (Target Relation)
外键为空或等于S中的某个主键值
用户定义的完整性(User-defined integrity ):保证一个数据的取值合理 关系代数 一种抽象的查询语言 用对关系的运算 来表达查询 关系数据操纵语言的一种传统表达方式 表示记号
运算符 集合运算符
关系运算符
又称为限制(Restriction),从行的角度进行
从R中选择出若干属性列组成新的关系,从列的角度进行运算(但可能为了避免重复取消某些元组)
从两个关系的笛卡尔积 中选取属性间满足一定条件的元组
等值连接(equijoin):比较关系为等号 自然连接(Natural join)
同时从行和列的角度进行运算
关系代数表达式 关系代数运算经过有限次复合后形成的式子
典型关系代数语言 ISBL(Infotmation System Base Language)
关系演算 以元组变量 作为谓词变元的基本对象
典型代表:ALPHA
以域变量 作为谓词变元的基本对象
典型代表:QBE (Query By Example)
ALPHA 检索语句: GET
元组变量检索
元组变量
存在量词检索
更新语句:PUT,HOLD,UPDATE,DELETE,DROP
宿主语言 :开发软件赖以生存的软件环境的程序语言
存储异常 原因:数据库模式没有反映数据间的依赖关系
规范化 规范化理论用于改造 关系模式,通过分解关系模式 来消除不合适的数据依赖,以解决存储异常问题。
函数依赖 定义 平凡与非平凡函数依赖 在关系模式R(U)中,对于U的子集X和Y ,若X→Y
且Y不属于X,则称X→Y是非平凡 的函数依赖;
但Y属于X, 则称 X→Y是平凡 的函数依赖。
完全与部分函数依赖 在关系模式R(U)中,如果X→Y,
传递与直接函数依赖 在关系模式R(U)中,如果X→Y,Y→Z ,
且Y不属于X,Y-/>X,则称Z传递函数依赖于 X 且X ←→Y,则Z直接依赖 于X 键 设K为关系模式R中的属性或属性组合。若K→U(f),则K称为R的一个侯选键 (Candidate Key)。若关系模式R有多个 候选键,则选定其中的一个做为主键( Primary Key)。
范式 范式是符合某一种级别要求 的关系模式的集合 。
第一范式(NF) 一个关系模式R的所有属性都是不可分 的基本数据项
第一范式实际上是对关系增加了一个约束 ,即关系中元组的每个属性都只能取一个值 。第一范式是对关系模式的基本要求, 不满足第一范式的数据库就不是关系数据库。
第二范式(2NF) 第三范式(3NF) 不存在键X、属性组Y及非主属性Z(Z 不属于Y), 使得X→Y,Y -/> X,Y→Z成立 ( 关系中每一个非主属性必须只依赖于主键) 在第二范式的基础上,消除非主属性对主键的传递函数依赖 可达到3NF。
若R∈3NF,则R的每一个非主属性既不部 分函数依赖于候选键也不传递函数依赖于 候选键。
通常认为BCNF是修正的第三范式,所以有时也称为扩充的第三范式
1NF 若X→Y且Y不属于X时X必含有键 (每一个决定属性因素都包含键) 若R∈BCNF,
– 所有非主属性对每一个键都是完全函数依赖
– 所有的主属性对每一个不包含它的键,也是完全函数依赖
– 没有任何属性完全函数依赖于非键的任何一组属性
多值依赖 ####### 定义
设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为非平凡的多值依赖
####### 性质
多值依赖具有对称性 ,若X→→Y,则X→→Z,其中Z=U-X - Y 多值依赖具有传递性 ,若X→→Y,Y→→Z, 则X→→Z –Y 函数依赖是多值依赖的特殊情况,若X→Y,则X→→Y 若X→→Y,X→→Z,则 第四范式(4NF) 1NF 对于R的每个非平凡多值依赖X→→Y(Y不属于X),X都含有候选键 如果R ∈ 4NF
–不允许有非平凡且非函数依赖的多值依赖
–允许的非平凡多值依赖是函数依赖
连接依赖 设R是一个关系模式,R的属性子集为R1, R2,R3,R4,R5,…,当且仅当R的每个合法值都等于R1,R2,R3,R4,R5,…, 的投影连接时,称R满足连接依赖
第五范式(5NF) R的每一个非平凡连接依赖都被R的候选键所蕴含(4NF中消除非候选键所蕴含的连接依赖)
Armstrong公理系统 逻辑蕴含 对于满足一组函数依赖 F 的关系模式R ,其任何一个关系r,若函数依赖X→Y都成立, (即r中任意两元组t,s,若t[X]=s[X],则 t[Y]=s[Y]),则称F逻辑蕴含X →Y
推理规则 A1. 自反律(Reflexivity):若Y 属于X 属于 U, 则X →Y为F所蕴含 A2. 增广律(Augmentation):若X→Y为F所蕴含,且Z属于U,则XZ→YZ为F所蕴含 A3. 传递律(Transitivity):若X→Y及Y→Z 为F所蕴含,则X→Z为F所蕴含 进而:
合并规则:由X→Y,X→Z,有X→YZ 伪传递规则:由X→Y,WY→Z,有XW→Z 分解规则:由X→Y及Z属于Y,有X→Z 根据合并规则和分解规则,可得如下引理 X→A1 A2 …Ak成立⇔X→Ai成立(i=1,2, … ,k)
有效与完备 闭包 在R中,X ⊆U,X_F^+= {A | X→A能由F根据 Armstrong公理导出},称X_F^+为属性集X关于函数依赖集F的闭包。
计算方法 计算X(i)(i=0,1,…)
(1)X(0)=X
(2)X(i+1)=X(i)A 其中A是这样的属性:在F中寻找尚未用过的左边是 X(i)的子集的FD:Y→A,其中Y是X(i)的子集。
(3)判断X(i+1)=X(i),若是转(4),否则转(2 )
(4) 输出X(i),即为X+
等价与覆盖 等价:F,G为FD集,F+=G+ 覆盖:F,G为FD集,G属于F,称F覆盖G 最小依赖集 满足:
右部单属性化 :F中任一函数依赖X→ A,A必是单属性不存在多余FD :F中不存在X→ A,使得F与F-{X→ A}等价每个FD左部没有多余属性 :F中不存在X→ A,使得X存在真子集Z,使得F与F-{X→ A}并{Z→ A}(先减后并)等价模式分解 三种模式分解等价的定义
分解具有无损连接性(一定能达到4NF) 分解保持函数依赖(一定能达到3NF) 既保持函数依赖又具有无损连接性(一定能达到3NF) 关键字求解 给定关系模式S和FD集F,按F中函数依赖将S中属性分为
L类:仅在FD左部出现 R类:仅在FD右部出现 LR类:左右均出现 N类:左右均未出现 引理 X为L类或N类 属性,则必为主属性 (包含在候选键中)
推论:
X为S中N类和L类组成的属性集 且X+包含S中全部 属性,X必为S的唯一 候选键 X为S中的R类属性 ,即X为S的非主属性 设计步骤 需求分析和概念设计独立于任何数据库管理系统
逻辑设计和物理设计与选用的DBMS密切相关
需求分析 任务 明确用户的各种需求 确定新系统的功能 充分考虑今后可能的扩充和改变 结构化分析方法(Structured Analysis)
从最上层的系统组织机构入手,自顶向下、逐层分解分析系统
系统抽象为
分解处理功能和数据
征取用户认可
数据字典 ####### 用途
进行详细的数据收集和数据分析所获得的主要结果
####### 内容
数据项
不可再分 的数据单位
描述={数据项名,数据项含义说明,别名,数据类型,长度,取值范围,取值含义,与其他数据项的逻辑关系,数据项之间的联系}
数据结构
反映数据之间的组合关系
可以由若干个数据项组成,也可以由若干数据结构组成,或若干二者混合
描述={数据结构名,含义说明,组成:{数据项或数据结构}}
数据流
数据结构在系统内的传输路径
描述={数据流名,说明,数据流来源,数据流去向,组成:{数据结构},平均流量,高峰期流量}
数据存储
数据结构停留或保存的地方,数据流的来源和去向之一
描述={数据存储名,说明,编号,输入的数据流,输出的数据流,组成:{数据结构},数据量,存取频度,存取方式}
处理过程
一般用判定表或判定树来描述
描述={处理过程名,说明,输入:{数据流},输出:{数据流},处理:{简要说明}}
数据字典是关于数据库中数据的描述,是元数据 ,而不是数据本身。
数据字典在需求分析阶段建立,在数据库设计过程中不断修改、充实、完善。
概念设计 将需求分析得到的用户需求抽象为信息结构即概念模型 的过程就是概念结构设计
工具 E-R模型
设计方法 自顶向下:首先定义全局概念结构的框架,然后逐步细化 自底向上:首先定义各局部应用的概念结构,然后将其集成起来 逐步扩张:首先核心概念结构,然后向外扩充 混合策略:自顶向下设计全局概念框架 ,自底向上设计各局部概念结构 常用策略 自顶向下进行需求分析
自底向上设计概念结构
抽象数据并设计局部视图 集成局部视图,得到全局概念结构 数据抽象 分类(Classification):
定义某一类概念作为现实世界中一组对象的类型。
抽象了对象值与型之间的“is member of ”的语义
聚集(Aggregation):
定义某一类型的组成成分
抽象了对象内部类型和成分之间“is part of ”的语义
概括(Generalization):
定义类型只见那的一种子集联系
抽象了类型之间的“is subset of ”的语义
局部视图设计 在多层的数据流图中选择一个适当层次的数据流图,作为设计分E-R图的出发点
通常以中层数据流图作为设计分E-R图的依据
####### 准则
属性不能再具有需要描述的性质,即属性必须是不可分的数据项 属性不能与其他实体具有联系,联系只发生在实体之间 集成 ####### 消除冲突
属性冲突 命名冲突同名异义:不同意义的对象在不同的局部应用中具有相同的名字 异名同义:同一意义的对象在不同的局部应用中具有不同名字 结构冲突同一对象在不同应用中具有不同的抽象。 同一实体在不同分E-R图中所包含的属性个数
和属性排列次序不完全相同。 实体之间的联系在不同局部视图中呈现不同的
类型。 ####### 消除冗余
冗余的数据是指可由基本数据导出的数据
冗余的联系是指可由其他联系导出的联系
冗余数据和冗余联系容易破坏数据库的完整性,给数据库维护增加困难
方法:
求 F L的最小覆盖 GL ,差集为D = F L-G L。逐一 考察 D中的函数依赖,确定是否是冗余的联系, 若是,就把它去掉
冗余的联系一定在D中,而 D中的联系不一定是冗余的 当实体之间存在多种联系时要将实体之间的联系在形式上加以区分 逻辑设计 把概念结构设计阶段设计好的基本E-R图转换 为与选用DBMS产品所支持的数据模型相符合 的逻辑结构
步骤 将概念结构转化为一般的关系、网状、层次模型 将转换来的关系、网状、层次模型向特定DBMS支持下的数据模型转换 对数据模型进行优化 设计用户子模式 ER图转关系模型 将实体、实体的属性和实体之间的联系转换为关系模式
一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。 一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。 一个m:n联系转换为一个关系模式。 三个或三个以上实体间的一个多元联系转 换为一个关系模式。 具有相同键的关系模式可合并 优化 确定数据依赖 消除冗余联系 确定所属范式 确定合并或分解 ####### 水平分解
把(基本)关系的元组分为若干子集合,定义每个子集合为一个子关系,以提高系统的效率
满足“80/20原则”的应用 并发事务经常存取不相交的数据 ####### 垂直分解
把关系模式R的属性分解为若干子集合,形成若干子关系模式
设计用户子模式 使用更符合用户习惯的别名。 针对不同级别的用户定义不同的外模式,以满足系统对安全性的要求。 简化用户对系统的使用。 物理设计 数据库在物理设备上的存储结构 与存取方法 称为数据库的物理结构,依赖于选定的数据库管理系统
为一个给定的逻辑数据模型选取一个最适合应用环境的物理结构的过程,就是数据库的物理设计
对物理结构进行评价,评价的重点是时间和空间效率
内容 为关系模式选择存取方法(建立存取路径)索引方法:B+树索引方法(最普遍) 局促方法(Cluster) HASH方法 设计关系、索引等数据库文件的物理存储结构 数据库实施 运用DBMS提供的数据库语言及宿主语言,根据逻辑设计和物理设计的结果
数据库运行和维护 简介 SQL语言的前身是SQUARE (Specifying Queries As Relational Expression)语 言,是1974年由Boyce和Chamberlin提出 的,并在IBM公司的关系数据库系统 System R上实现,后改名为SEQUEL ( Structured English QUEry Language) 语言,SEUQUEL简称SQL
SQL语言集
数据定义语言DDL 数据操纵语言DML 数据控制语言DCL 的功能于一体
数据查询:SELECT
数据定义:CREATE、DROP、ALTER
数据操纵:INSERT、UPDATE、DELETE
数据控制:GRANT、REVOKE
系统结构 SQL语言支持数据库的三级模式结构,在SQL语言中,关系模式称为基本表,外模式称为视图,内模式称为索引
数据定义 模式 实际上定义了一个命名空间,在空间中可定义该模式包含的数据库对象如基本表、视图、索引等。
创建模式
CREATE SCHEMA < schemaName > AUTHORIZATION < userName > [
< tableDefinition >|< viewDefinition >|< authorizationDefiinition >
]
CREATE SCHEMA "S-T" AUTHORIZATION SHERRY ;
删除模式
DROP SCHEMA < name > < CASCADE | RESTRICT >
基本表 (模式) 每一个基本表都属于某一个模式,一个模式包含多个基本表
创建表
CREATE TABLE < name > (
< colName > < dataType > [ < constraint > ]
[, < colName > < dataType > [ < constraint > ]]
);
CREATE TABLE Student
( Sno CHAR ( 5 ) PRIMARY KEY , /* 列级完整性约束条件*/
Sname CHAR ( 20 ) UNIQUE , /* Sname取唯一值*/
Ssex CHAR ( 2 ),
Sage SMALLINT ,
Sdept CHAR ( 20 ));
CREATE TABLE Course
( Cno CHAR ( 4 ) PRIMARY KEY ,
Cname CHAR ( 40 ),
Cpno CHAR ( 4 ),
Ccredit SMALLINT ,
FOREIGN KEY ( Cpno ) REFERENCES Course ( Cno ));
删除表
DROP TABLE < name > [ RESTRICT | CASCADE ];
修改表定义
ALTER TABLE < name >
[ ADD < colname > < datatype > [ < constriant > ]]
[ DROP < colname > [ CASCADE | RESTRICT ]]
[ ALTER < colname > < datatype > ]
ALTER TABLE Student ADD S_entrance DATE ;
ALTER TABLE Student ADD S_entrance DATE ;
ALTER TABLE Course ADD UNIQUE ( Cname );
视图 (外模式) 定义视图(外模式)
索引(内模式) 索引是关系数据库的内部实现技术,属于内模式范畴
目的 :加快查询速度
创建 :DBA或表的属主 可以建立索引,DBMS一般会自动建立PRIMARY KEY 和UNIQUE 列上的索引
使用 :DBMS自动维护索引,自动选择是否使用、使用哪个索引
方法 :RDBMS中索引一般采用B+树、HASH索引
B+树索引具有动态平衡的优点 HASH索引具有查找速度快的特点 类别 :唯一索引、非唯一索引、聚簇索引
在最经常查询的列上建立聚簇索引以提高查询效率
一个基本表上最多只能建立一个 聚簇索引
经常更新 的列不宜 建立聚簇索引
创建索引
CREATE [ UNIQUE ][ CLUSTER ] INDEX < indexName > ON < tableName > ( < colName > [ < order > ][, < colName > [ order ]]...);
CREATE UNIQUE INDEX Stusno ON Student ( Sno );
CREATE UNIQUE INDEX Coucno ON Course ( Cno );
CREATE UNIQUE INDEX SCno ON SC ( Sno ASC , Cno DESC );
UNIQUE : 相当于对列添加了一个UNIQUE约束 CLUSTER:建立聚簇索引后,基表中数据也需要按指定的 聚簇属性值的升序或降序存放。也即聚簇索引 的索引项顺序与表中记录的物理顺序一致 ORDER:ASC,DESC 删除索引
数据操纵 数据查询 SELECT [ALL|DISTINCT][,]
FROM
[,][WHERE ]
[GROUP BY [HAVING ]]
[ORDER BY [ASC|DESC]];
单表查询 SELECT [ ALL | DISTINCT ] < colExpression > [ , < colExpression > ] …
FROM < tableOrViewName > [ , < tableOrViewName > ] …
[ WHERE < condition > ]
[ GROUP BY < 列名 1 > [ HAVING < condtion > ] ]
[ ORDER BY < 列名 2 > [ ASC | DESC ] ] ;
查询指定列
SELECT Sno , Sname
FROM Student ;
查询全部列
查询经过计算的值
SELECT Sname , 1996 - Sage /*假定当年的年
份为1996年*/
FROM Student ;
SELECT Sname , 'Year of Birth:' , 1996 -
Sage , ISLOWER ( Sdept )
FROM Student ;
SELECT Sname NAME , 'Year of Birth: '
BIRTH , 1996 - Sage
BIRTHDAY , LOWER ( Sdept ) DEPARTMENT
FROM Student ;
取消取值中的重复行
DISTINCT短语的作用范围是所有目标列
SELECT Sno FROM SC ;
= SELECT ALL Sno FROM SC ;
SELECT DISTINCT Sno FROM SC ; # 去掉重复行
SELECT DISTINCT Cno , Grade FROM SC ;
查询满足条件的元组
字符匹配:
[ NOT ] LIKE ‘ < 匹配串 > ’ [ ESCAPE ‘ < 换码字符 > ’ ]
SELECT Sname
FROM Student
WHERE Sdept = 'CS' ;
# between
SELECT Sname , Sdept , Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23 ;
SELECT Sname , Sdept , Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23 ;
# in
SELECT Sname , Ssex
FROM Student
WHERE Sdept IN ( 'IS' , 'MA' , 'CS' );
SELECT Sname , Ssex
FROM Student
WHERE Sdept NOT IN ( 'IS' , 'MA' , 'CS' );
# like
SELECT Sname , Sno , Ssex
FROM Student
WHERE Sname LIKE '刘%' ;
SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳__' ;
SELECT Sname , Sno
FROM Student
WHERE Sname LIKE '__阳%' ;
SELECT Sname , Sno , Ssex
FROM Student
WHERE Sname NOT LIKE '刘%' ;
# 查询以 "DB_" 开头,且倒数第 3 个字符为 i的课程的详细情况 。
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i_ _' ESCAPE '\\' ;( 只有一个\ )
SELECT Sno , Cno
From SC
WHERE GRADE IS NULL ;
SELECT Sno , Cno
FROM SC
WHERE Grade IS NOT NULL ;
ORDER BY
升序:ASC;降序:DESC;缺省值为升序
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示
SELECT Sno , Grade
FROM SC
WHERE Cno = '3'
ORDER BY Grade DESC ;
SELECT *
FROM Student
ORDER BY Sdept , Sage DESC ;
聚集函数
SELECT COUNT ( * )
FROM Student ;
SELECT AVG ( Grade )
FROM SC
WHERE Cno = '1' ;
Group By
细化聚集函数的作用对象,未对查询结果分组,聚集函数将作用于整个查询结果,对查询结果分组后,聚集函数将分别作用于每个组
使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和聚集函数
使用HAVING短语筛选最终输出结果,只有满足HAVING短语指定条件的组才输出
WHERE子句作用于基表或视图,从中选择满足条件的元组 HAVING短语作用于组,从中选择满足条件的组 SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT ( * ) > 3 ;
SELECT Sno , COUNT ( * )
FROM SC
WHERE Grade >= 90
GROUP BY Sno
HAVING COUNT ( * ) >= 3 ;
连接查询 同时涉及多个表的查询
[ < 表名 1 > .] < 列名 1 > < 比较运算符 > [ < 表名 2 > .] < 列名 2 >
[ < 表名 1 > .] < 列名 1 > BETWEEN [ < 表名 2 > .] < 列名 2 > AND [ < 表名 2 > .] < 列名 3 >
连接条件中的各连接字段类型必须是可比的,但名字不必是相同的
方法 :
嵌套循环法 (NESTED-LOOP)
首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组
表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组,
重复上述操作,直到表1中的全部元组都处理完毕
排序合并法 (SORT-MERGE)
常用于=连接
对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。当遇到表2中第一条大于表1连接字段值的元组时,对表2的查询不再继续
找到表1的第二条元组,然后从刚才的中断点处继续顺序扫描表2,查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。直接遇到表2中大于表1连接字段值的元组时,对表2的查询不再继续。
重复上述操作,直到表1或表2中的全部元组都处理完毕为止
索引连接(INDEX-JOIN)
对表2按连接字段建立索引。 对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。
类型 :
等值连接
SELECT Student . * , SC . *
FROM Student , SC
WHERE Student . Sno = SC . Sno ;
自然连接
SELECT
Student . Sno , Sname , Ssex , Sage , Sdept , Cno , Grade
FROM Student , SC
WHERE Student . Sno = SC . Sno ;
自身连接
SELECT FIRST . Cno , SECOND . Cpno
FROM Course FIRST , Course SECOND
WHERE FIRST . Cpno = SECOND . Cno ;
嵌套查询 一个SELECT-FROM-WHERE语句称为一个查询块 。
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
子查询的限制:不能使用ORDER BY子句
SELECT Sno , Sname , Sdept
FROM Student
WHERE Sdept IN
( SELECT Sdept
FROM Student
WHERE Sname = '刘晨' );
SELECT Sno , Cno
FROM SC x
WHERE Grade >= ( SELECT AVG ( Grade )
FROM SC y
WHERE y . Sno = x . Sno );
带有EXISTS谓词的子查询不返回任何数据 ,只产生逻辑真值“true”或逻辑假值 “false”。
– 若内层查询结果非空,则外层的WHERE子句返回真值
– 若内层查询结果为空,则外层的WHERE子句返回假值
由EXISTS引出的子查询,其目标列表达式 通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
SQL语言中没有全称量词,可以把带有全称量词的谓词转换为等价的带有存在量词的谓词
SQL语言中没有蕴涵(Implication)逻辑运算,可以利用谓词演算对逻辑蕴涵谓词进行等价转换
SELECT Sname
FROM Student
WHERE EXISTS ( SELECT *
FROM SC /*相关子查询*/
WHERE Sno = Student . Sno AND
Cno = '1' );
SELECT Sno , Sname , Sdept
FROM Student S1
WHERE EXISTS
( SELECT *
FROM Student S2
WHERE S2 . Sdept = S1 . Sdept AND
S2 . Sname = '刘晨' );
SELECT Sname
FROM Student
WHERE NOT EXISTS
( SELECT *
FROM Course
WHERE NOT EXISTS
( SELECT *
FROM SC
WHERE Sno = Student . Sno
AND Cno = Course . Cno )); ## 查询选修了全部课程的学生姓名
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
( SELECT *
FROM SC SCY
WHERE SCY . Sno = '95002' AND
NOT EXISTS
( SELECT *
FROM SC SCZ
WHERE SCZ . Sno = SCX . Sno AND
SCZ . Cno = SCY . Cno )); ## 查询至少选修了学生 95002 选修的全部课程的学生号码
集合查询 < queryBlock >
UNION | INTERSECT | EXCEPT
< queryBlock >
并
SELECT *
FROM Student
WHERE Sdept = 'CS'
UNION
SELECT *
FROM Student
WHERE Sage <= 19 ;
交
SELECT *
FROM Student
WHERE Sdept = 'CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage <= 19 ;
差
SELECT *
FROM Student
WHERE Sdept = 'CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage <= 19 ;
数据更新 插入
INSERT INTO < tableName > [ ( < col1 > [ , < col2 > ,… ] ) ] VALUES ( < value1 > [ , < value2 > ] … ) ;
INSERT INTO Student VALUES ( '95020' , '陈冬' , '男' , 18 , 'IS' );
INSERT INTO Deptage ( Sdept , Avgage ) SELECT Sdept , AVG ( Sage ) FROM Student GROUP BY Sdept ;
修改
UPDATE < tableName > SET < col >=< Expression > [ , < col >=< Expression > ] … [ WHERE < condition > ] ;
UPDATE Student
SET Sage = 22
WHERE Sno = '95001' ;
删除
DELETE
FROM < tableName >
[ WHERE < condition > ] ;
DELETE
FROM Student
WHERE Sno = '95019' ;
DELETE
FROM SC ;
DELETE
FROM SC
WHERE 'CS' =
( SELECT Sdept
FROM Student
WHERE Student . Sno = SC . Sno );
视图 虚表,从一个或几个基本表(或视图)导出的表
只存放视图的定义,不会出现数据冗余
基本表中数据发生改变时,从视图中查询出的数据也随之改变
创建视图 CREATE VIEW < viewName > [( < colName > [, < colName > ]...)]
AS < subQuery >
[ WITH CHECK OPTION ];
形式 行列子集视图
CREATE VIEW IS_Student
AS
SELECT Sno , Sname , Sage
FROM Student
WHERE Sdept = 'IS' ;
WITH CHECK OPTION的视图
要求修改和插入时仍满足只有IS系学生
CREATE VIEW IS_Student
AS
SELECT Sno , Sname , Sage
FROM Student
WHERE Sdept = 'IS'
WITH CHECK OPTION ;
基于多个基表的视图
CREATE VIEW IS_S1 ( Sno , Sname , Grade )
AS
SELECT student . Sno , Sname , Grade
FROM Student , SC
WHERE Sdept = 'IS' AND sTUDENT . Sno = SC . Sno AND SC . Cno = '1' ;
基于视图的视图
CREATE VIEW IS_S2
AS
SELECT Sno , Sname , Grade
FROM IS_S1
WHERE Grade >= 90 ;
带表达式的视图
CREATE VIEW BT_S ( Sno , Sname , Sbirth )
AS
SELECT Sno , Sname , 1996 - Sage /*假定当年的年份为
1996年*/
FROM Student
分组视图
CREATE VIEW S_G ( Sno , Gavg )
AS
SELECT Sno , AVG ( Grade )
FROM Sno , AVG ( Grade )
FROM SC
GROUP BY Sno ;
删除视图 由该视图导出的视图定义仍在数据字典中,但已不能使用,必须显式删除
删除基表时,由该基表导出的所有视图定义都必须显式删除
查询视图 从用户角度,查询视图与查询基本表相同
视图实体化法(View Materialization)有效性检查:检查所查询视图是否存在 执行试图定义,将视图临时实体化,生成临时表 查询临时表 查询完毕删除被实体化的视图 视图消解法(View Resolution)有效性检查:检查所查询视图是否存在 将视图定义中的子查询与用户查询结合,转换成等价的对基本表的查询 执行修正后的查询 更新视图 同样有实体化法和消解法
有些视图不可更新
数据控制 亦称为数据保护,包括数据的
安全性控制
保护数据库,防止不合法的使用所造成的数据泄露和破坏
GRANT、REVOKE
完整性控制
数据库的完整性是指数据库中数据的正确性与相容性
并发控制
当多个用户并发地对数据库进行操作时,对他们加以控制、协调,以保证并发操作正确执行,保持数据库的一致性。
恢复
当发生各种类型的故障导致数据库处于不一致状态时,将数据库恢复到一致状态的功能
回滚、重做(UNDO、REDO)
安全性 授权 :DBA与表的属主可以建立
GRANT < authority1 > [, < authority2 > ]...
[ ON < targetType > < targetName > ]
TO < userName > [, < userName > ]...
[ WITH GRANT OPTION ];
# case
GRANT SELECT
ON TABLE Student
TO U1 ;
GRANT ALL PRIVILEGES
ON TABLE Student , Course
TO U2 , U3 ;
GRANT SELECT
ON TABLE SC
TO PUBLIC ;( all users )
GRANT UPDATE ( Sno ), SELECT
ON TABLE Student
TO U4 ;
GRANT CREATETAB
ON DATABASE S - T
TO U8 ;
WITH GRANT OPTION:被授权对象可以传播权限 收回
REVOKE < authority1 > [, < authority2 > ]...
[ ON < targetType > < targetName > ]
FROM < userName > [, < userName > ]...;
REVOKE UPDATE ( Sno )
ON TABLE Student
FROM U4 ;
REVOKE SELECT
ON TABLE SC
FROM PUBLIC ;
嵌入式SQL 嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言,如C、C++、Java,称为宿主语言,简称主语言
EXEC SQL SELECT [ ALL | DISTINCT ]
< expr > [, < expr > ]...
INTO < host_var > [ < indicator > ]
[, < host_var > [ < indicator > ]]...
FROM < tableorview > [, < tableorview > ] ...
[ WHERE < condition > ]
[ GROUP BY < colname1 > [ HAVING < condition > ]]
[ ORDER BY < colname2 > [ ASC | DESC ]] ;
EXEC SQL SELECT Sno , Sname , Ssex , Sage ,
Sdept
INTO : Hsno , : Hname , : Hsex , : Hage , : Hdept
FROM Student
WHERE Sno = : givensno ;
EXEC SQL SELECT Sno , Sname , Ssex , Sage ,
Sdept
INTO : Hsno , : Hname , : Hsex , : Hage , : Hdept
FROM Student
WHERE Sno = : givensno ;
EXEC SQL DELETE
FROM SC
WHERE Sno =
( SELECT Sno
FROM Student
WHERE Sname = : stdname ) ;
指示变量只能用于INTO子句中 如果INTO子句中主变量后面跟有指示变量,则当查询得出的某个数据项为空值时,系统会自动将相应主变量后面的指示变量置为负值,但不向该主变量执行赋值操作,即主变量值仍保持执行SQL语句之前的值 当发现指示变量值为负值时,不管主变量为何值,均应认为主变量值为NULL 游标 定义
EXEC SQL DECLARE < cursorName > CURSOR
FOR < SELECTStatement > ;
说明性语句,并不执行查询
打开
EXEC SQL OPEN < cursorName > ;
打开游标实际上是执行 相应的SELECT语句,把所有满足查询条件的记录从指定表取到缓冲区中
–这时游标处于活动状态,指针指向查询结果集中第一条记录之前
推动
EXEC SQL FETCH [[ NEXT ( default ) | PRIOR | FIRST | LAST ] FROM ] < cursorName >
INTO < host_var > [ < indicator > ][, < host_var > [ < indicator > ]]...;
指定方向推动游标指针,然后将缓冲区中的当 前记录取出来送至主变量供主语言进一步处理
关闭
EXEC SQL CLOSE < cursorName > ;
关闭游标,释放结果集占用的缓冲区及其他资源
游标被关闭后,就不再和原来的查询结果集相联系,被关闭的游标可以再次被打开,与新的查询结果相联系
查询处理 查询处理是指从数据库中提取数据所涉及的处理过程,包括将用户提交的查询语句转变为数据库的查询计划,并且执行这个查询计划获得查询结果
连接操作实现
嵌套循环法(Nested Loop) 索引连接法(Index Join) 排序合并法(Sort-merge Join Merge Join) 散列合并法(Hash Join) 查询优化 代数优化 通过对关系代数表达式的等价变换来提高查询效率
启发式规则 :
选择运算应尽可能先做。 把投影运算和选择运算同时进行 把投影同其前或其后的双目运算结合起来 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算 找出公共子表达式 物理优化 代数优化改变查询语句中操作的次序和组合,不涉及底层的存取路径。
对于一个查询语句有许多存取方案,它们的执行效率不同, 仅仅进行代数优化是不够的。
物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划
安全性 数据库的安全性是指保护数据库,防止因用户非法使用数据库造成数据泄露、更改或破坏
安全技术 在用户数量比较大的情况下,为了便于权限管理,需要引入角色的概念。
数据库角色:被命名的一组 与数据库操作相关的权限 。
– 角色是权限的集合
– 可以为一组具有相同权限的用户创建一个角色
– 简化授权的过程
CREATE ROLE < roleName > ;
GRANT < authority > [, < authority > ]...
ON < targetType > TargetName
TO < roleName > [, < roleName > ]...
GRANT < role1 > [ , < role2 > ] …
TO < role3 > [ , < user1 > ] …
[ WITH ADMIN OPTION ]
REVOKE < authority > [, < authority > ]...
ON < targetType > TargetName
FROM < roleName > [, < roleName > ]...
强制存取 强制存取控制(MAC)是指系统为保证更高程度的安全性,按照TDI/TCSEC标准中安全策略的要求,所采取的强制存取检查手段
在MAC中,DBMS所管理的全部实体被分为主体和客体两大类
主体是系统中的活动实体
– DBMS所管理的实际用户
– 代表用户的各进程 客体是系统中的被动实体,是受主体操纵的
– 文件
– 基表
– 索引
– 视图 对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label)。
敏感度标记分成若干级
绝密(Top Secret) 机密(Secret) 可信(Confidential) 公开(Public) – 主体的敏感度标记称为许可证级别(Clearance Level)。
– 客体的敏感度标记称为密级(Classification Level)。
– MAC机制就是通过对比主体的Label和客体的Label,最终确定主体是否能够存取客
仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体。 仅当主体的许可证级别等于客体的密级时,该主体才能写相应的客体 修正规则
– 主体的许可证级别 ≤客体的密级 主体能写客体
– 用户可为写入的数据对象赋予高于自己的许可证级别的密级。
– 一旦数据被写入,该用户自己也不能再读该数据对象。
审计 审计日志(Audit Log)将用户对数据库的所有操作记录在上面
用户级审计
针对自己创建的数据库表或视图进行审计记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作 系统级审计
DBA设置监测成功或失败的登录要求监测GRANT和REVOKE操作以及其他数据库级权限下的操作 AUDIT ( 设置审计功能 )
AUDIT ALTER , UPDATE
ON SC ;
NOAUDIT ( 取消审计功能 )
NOAUDIT ALTER , UPDATE
ON SC ;
完整性 数据库的完整性是指数据的正确性、有效性和相容性,其主要目的是防止错误的数据进入数据库。
所谓正确性是指数据的合法性。 所谓有效性是指数据是否属于所定义的有效范围。 相容性是指表示同一事实的两个数据应相同,不一致就是不相容 实现方法 列级约束 主要是对属性的数据类型、数据格式和取值范围、精度等的约束。具体包括
对数据类型的约束,包括数据类型、长度、精度等的约束。例如学生姓名的数据类型是字符型,长度是20。 对数据格式的约束,例如规定日期的格式为YYYY/MM/DD。 对取值域的约束,例如学生成绩的取值范围必须是0~100。 对空值的约束 。 元组约束 一个元组是由若干个属性组成的,元组级约束就是元组中各个属性之间的约束关系。例如订货关系中发货日期不能小于订货日期,发货量不得超过订货量等
关系约束 关系约束是指一个关系的各个元组之间、或者多个关系之间存在的各种联系或约束。常见的关系约束有
实体完整性约束
关系模型的实体完整性用PRIMARY KEY定义
单属性构成的主键有两种说明方法:定义为列级约束条件、定义为表级约束条件
对多个属性构成的主键只有一种说明方法:定义为表级约束条件
PRIMARY KEY约束可以作为表定义的一部分在定义表时定义,也可以在表创建之后再添加
参照完整性约束
参照完整性给出了数据表之间互相关联的基本要求,其核心是不允许引用不存在的元组 ,也就是说,外键字段的取值要么为空值,要么就是被引用关系中元组的对应值。
参照完整性在CREATE TABLE中用FOREIGN KEY和REFERENCES定义
– FOREIGN KEY短语指明表中的哪些字段是外键,REFERENCES短语指明该表中的外键所参照的数据表名和字段名。
– FOREIGN KEY约束可以作为表定义的一部分在创建表时创建,也可以在已有表中创建FOREIGN KEY约束
用户自定义完整性约束
用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求
列值非空(NOT NULL) 列值唯一(UNIQUE) 检查列值是否满足一个布尔表达式(CHECK) CONSTRAINT < constraintName >
[ PRIMARY KEY Statement
| FOREIGN KEY Statement
| CHECK Statement ]
CREATE TABLE Student
( Sno NUMERIC ( 6 )
CONSTRAINT C1 CHECK ( Sno BETWEEN 90000 AND 99999 ) ,
Sname CHAR ( 20 )
CONSTRAINT C2 NOT NULL ,
Sage NUMERIC ( 3 )
CONSTRAINT C3 CHECK ( Sage < 30 ),
Ssex CHAR ( 2 )
CONSTRAINT C4 CHECK ( Ssex IN (‘男’,‘女’)),
CONSTRAINT StudentKey PRIMARY KEY ( Sno )
);
ALTER TABLE Student
DROP CONSTRAINT C1 ;
ALTER TABLE Student
ADD CONSTRAINT C1 CHECK ( Sno BETWEEN
900000 AND 999999 );
ALTER TABLE Student
DROP CONSTRAINT C3 ;
ALTER TABLE Student
ADD CONSTRAINT C3 CHECK ( Sage < 40 ) ;
函数依赖约束
统计约束
触发器 触发器是一种特殊类型的存储过程,在对表或视图发出 UPDATE、INSERT 或DELETE 语句时自动执行
CREATE TRIGGER < triggerName >
{ BEFORE | AFTER } < triggerEvent > ON < tableName >
FOR EACH { ROW | STATEMENT }
[ WHEN < triggerCondition > ]
< triggerBody >
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
/*触发事件是插入或更新操作*/
FOR EACH ROW /*行级触发器*/
AS BEGIN /*定义触发动作体,是PL/SQL过程块*/
IF ( new . Job = ‘教授’) AND ( new . Sal < 4000 )
THEN
new . Sal : = 4000 ;
END IF ;
END ;
CREATE TRIGGER Insert_Sal
AFTER INSERT ON Teacher
/*触发事件是INSERT*/
FOR EACH ROW
AS BEGIN
INSERT INTO Sal_log VALUES (
new . Eno , new . Sal , CURRENT_USER ,
CURRENT_TIMESTAMP );
END ;
CREATE TRIGGER Update_Sal
AFTER UPDATE ON Teacher
/*触发事件是UPDATE */
FOR EACH ROW
AS BEGIN
IF ( new . Sal <> old . Sal )
THEN INSERT INTO Sal_log VALUES (
new . Eno , new . Sal , CURRENT_USER ,
CURRENT_TIMESTAMP );
END IF ;
END ;
DROP TRIGGER < triggerName > ON < t > ;
BEFORE
表示在触发事件进行以前,判断触发条件是否满足若满足条件则先执行触发动作部分的操作然后再执行触发事件的操作 AFTER
表示在触发事件完成之后,判断触发条件是否满足若满足条件则执行触发动作部分的操作如果触发事件因错误(如违反约束或语法错误)而失败,触发器将不会执行 行级触发器(FOR EACH ROW)
对每一个修改的元组都会触发触发器的检查和执行 语句级触发器(FOR EACH STATEMENT)
只在SQL语句执行时候进行触发条件的检查和触发器的执行 恢复 事务(Transaction) 用户定义的一个数据库操作序列,是一个不可分割的工作单位
事务是恢复和并发控制的基本单位
四个特征(ACID特性)
事务状态 活动状态(active)
初始状态,事务执行时处于活动状态
部分提交状态(partially committed)
事务最后一条语句执行完毕后进入部分提交状态,此时事务中对数据的操作已经全部完成,但结果数据还驻留在内存中
失败状态(failed)
事务不能正常执行,必须回滚
中止状态(aborted)
事务回滚并且数据库已经恢复到事务执行前的状态
提交状态(committed)
数据库系统将事务中对数据的更改完全写入磁盘时,写入一条事务日志信息,标志着事务成功完成
故障 某个事务在运行过程中由于种种原因未运行至正常终止点就夭折了
故障恢复 由恢复子系统利用日志文件撤销(UNDO)此事务已对数据库进行的修改
关键问题 如何建立冗余数据数据转储(backup) 登记日志文件(logging) 如何利用冗余数据进行数据库恢复 转储 DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程,备用的数据称为后备副本或者后援副本
转储状态
静态转储
在系统中无运行事务时进行转储,转储期间不允许对数据库进行任何的存取、修改活动
动态转储
转储操作与用户事务并发进行,转储期间允许对数据库进行存取或修改
不能保证副本中的数据正确有效,需加上日志文件才能把数据库恢复至某一时刻的正确状态
转储方式
海量转储
每次转储全部数据库
增量转储
只转储上次转储后更新过的数据
日志文件 用来记录事务对数据库的更新操作的文件
格式 内容 各事务开始标记(BEGIN TRANSACTION) 各事务结束标记(COMMIT|ROLLBACK) 各事务所有更新操作 与事务有关的内部更新操作 日志文件中的一个日志记录(log record) 基于记录
事务标识 操作类型(插入、删除、修改) 操作对象(记录ID、BLOCK NO.) 更新前数据的旧值 更新后数据的新值 基于数据块
事务标识 操作对象(记录ID、BLOCK NO.) 更新前数据所在整个数据块的值 更新后整个数据块的值 规则 为保证数据库可恢复,登记日志文件时必须遵循
登记的次序严格按照并行事务执行的时间次序 必须先写日志文件,后写数据库(把标识修改的日志记录写至日志文件,把对数据的修改写至数据库) 检查点(CheckPoint) 在日志文件中增加检查点记录(checkpoint)
增加重新开始文件
恢复子系统在登记日志文件期间动态地维护日志
记录:
建立检查点时刻所有正在执行的事务清单 这些事务最近的一个日志记录的地址 数据库镜像恢复 介质故障是对系统影响最为严重的一种故障,严重影响数据库的可用性
数据库镜像:
在不同的设备上同时存在两份数据库,一个是主设备,一个是镜像设备,每当主设备的数据库发生更新是,系统自动更新镜像设备的数据,使得两个设备的数据始终保持一致
并发 不同的事务执行方式
事务串行执行
每个时刻只有一个事务运行,不能充分利用系统资源
交叉并发方式(Interleaved Concurrency)
在单处理机系统中,事务的并行执行是这些并行事务的并行操作轮流交叉进行,没有真正并行运行,但能提高系统效率
同时并发方式(simultaneous concurrency)
多处理机系统中,每个处理机运行一个事务,多个处理机同时运行多个事务
异常 丢失修改(Lost Update) 不可重复读(Non-Repeatable Read) 读”脏“数据(Dirty Read) 可串行化调度 调度(Schedule) :并发事务的操作顺序
可串行化调度 :多个事务并发执行的结果与按某一次序穿行执行的结果相同
可串行性 :并发事务正确调度的准则
冲突操作 :不同事务对同一个数据的读写操作和写写操作
冲突等价 :一个调度S能通过一系列非冲突操作执行顺序的交换变成调度S1,称S与S1冲突等价
不可交换:
冲突可串行化调度 :调度Sc可在保证冲突操作的次序不变的情况下通过交换两事务不冲突操作的次序得到可串行化调度
数据库状态等价性 :在数据库初始状态相同时,等价的调度能产生同样的数据库状态
调度状态可串行 :该调度等价于一个串行调度
冲突可串行化调度是可串行化调度的充分条件
可串行化测试 :
Ti在Tj Read(A)或者Write(A)之前Write(A)或Read(A) Ti在Tj Write(A)之前Write(A) 则连Ti->Tj
若结果出现回路则不是冲突可串行,否则是冲突可串行
封锁 事务T在对某个数据对象(表、记录)操作之前,先向系统发出请求,对其加锁,在事务T释放锁之前,其他的事务不能更新此数据对象
排它锁(Exclusive Locks)X锁 (写锁)
只允许T读取和修改A,其他任何事务不能再对A加任何类型的锁
共享锁(Share Locks) S锁 (读锁)
其他事务只能对A再加S锁,不能加X锁,可以读A,但不能对A做任何修改
锁的正确使用要保证
一级封锁协议 事务T在修改数据之前必须先加X锁,直到事务结束释放
可防止丢失修改
二级封锁协议 一级+读数据前加S锁,读完即可释放S锁
可防止丢失修改、读”脏“数据
三级封锁协议 一级+读数据前加S锁,事务结束才释放
可防止丢失修改,读”脏“数据、不可重复读
活锁 请求不断被后来者覆盖
先来先服务可解决
死锁 两个封锁者等待彼此释放
防止 检测 超时法 事务等待图法:形成事务等待图,周期性检测事务等待图寻找回路 两阶段封锁协议(Two-Phase Locking 2PL) 所有事务分两个阶段对数据项加锁和解锁,在读写之前获得锁,释放锁之后不再申请和获得其他封锁
并行执行的所有事务均遵守两阶段封锁协议,则对这些事务的所有并行调度策略都是可串行化的
遵循第三级封锁协议必然遵守两阶段封锁协议
锁表 锁管理器为目前已加所的数据项维护一个记录链表,每个锁请求为一个记录,按请求到达顺序排序
多粒度封锁 封锁粒度(Granularity):封锁对象的大小
在一个系统中同时支持多种封锁粒度供不同的事务选择
多粒度封锁协议 允许多粒度树中的贝格节点被独立地加锁
对一个结点加锁意味着对所有后裔加同样的锁
一个数据对象可能以两种方式封锁:显式封锁和隐式封锁
意向锁 目的 :提高对某个数据对象加锁时系统的检查效率
内容 :对任一结点加基本锁必须先对上层结点加意向锁,对任一结点加意向锁说明下层结点正在被封锁
意向共享锁(Intent Share Lock) IS锁 意向排它锁(Intent Exclusive Lock)IX锁 共享意向排它锁(Share Intent Exclusive Lock) SIX锁=S+IX 锁的强度 :对其他锁的排斥程度
具有意向锁的多粒度封锁:
Licensed under CC BY-NC-SA 4.0
Last updated on Jun 06, 2023 00:00 UTC