说明
总结<数据库系统与原理设计>书中知识点及名词解释用于考研备考,按章划分,较难易混知识点以二级标题特别标注,方便在目录中查找到。
第一章-第三章知识点详解
在另一篇博客中:传送门
第四章-第五章知识点详解
文章目录
第七章 SQL数据定义、更新及数据库编程
- 数据库包含了基本表、视图、索引及约束等对象,数据库作为一个整体存放在外存的物理文件中。
- 物理文件分为 数据文件:存放数据库中的对象数据;日志文件:存放用于恢复数据库的冗余数据。
- 一个数据库可有多个物理文件,可蒋若干个设置为一个逻辑设备;一个数据库可有多个逻辑设备,必须在创建数据库时进行定义。
- 数据文件和日志文件统称为物理文件或磁盘文件。
- 当创建一个数据库,与该数据相关的描述性息会存入到系统的数据字典(即数据库系统表)中。创建数据库时,必须定义数据库名字、逻辑设备名和物理文件名。
一个建库的复杂实例:
注:ON–指定数据库中的数据文件。数据文件又分为主(PRIMARY)逻辑设备中的数据文件、用户逻辑设备(组)中的数据文件。(FILEGROUP)
LOG-ON --指定日志文件,若无,系统自动创建单个的日志文件。
基本表的定义
建表:CREAT TABLE
修改表:ALTER TABLE
删除表:DROP TABLE [RESTRICT | CASCADE]
RESTRICT --有限制条件,该表不能有视图、触发器及被引用;
CASCADE--无限制条件,删表的同时,建立在该表的所有索引、完整性规则等等一起删除。
索引
- 通过建立索引来实现数据记录的重新排列,称为逻辑排序。
- 索引中的记录通常由搜索码值和指针构成,并按照搜索码值进行排序。
- 索引分为聚集和非聚集(普通)。一个表可有多个普通索引,只能有一个聚集索引。
- 聚集索引是按照搜索码值的某种顺序(升/降)来重新组织基本表中记录的存放顺序,即索引的顺序就是基本表中记录的存放顺序。聚集索引极大提高查询速度,但给搜索吗属性修改带来困难。
索引建立:
CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]
/*唯一 聚集、非聚集*/
INDEX <indexname>
ON <tablename><columnName>[ASC|DESC]
/*为哪个表的哪个属性*/
ON <filegroupName>
/*索引存放的逻辑设备*/
索引删除:
DROP INDEX<indexName> ON <tableNmae>
SQL数据更新语言
1、插入数据:
1、元组
INSERT INTO <tableName>[指定的属性顺序]
VALUES
2、插入多个元组:
INSERT INTO <tableName>[指定的属性顺序]
由select语句引出的一个查询
2、删除数据:
DELETE FROM <tableName> [WHERE ...]
3、修改数据:
UPDATE <tableName>
set 列1=a,列2=b
[FROM
WHERE...]
视图
- 视图是虚表,是从一个或几个基本表(或视图)中导出的表,当基本表中的数据发生变化时,从视图中查询出的数据也随之改变。
- 视图实现了数据库系统管理系统三级模式中的外模式。
1、创建视图
CREATE VIEW 视图名[列名..]
AS
子查询(不允许ORDER BY和DISTINCT)
[WITH CHECK OPTION]/*可选,表示在视图操作时需合法性检查*/
视图中定义列名是可选的,如果不写,自动取子查询语句中查出来的列名。有时必须写列名:
1、子查询中某目标列是聚合函数(GROUP BY)或表达式;
2、子查询中出现了多表连接中名称相同的列名;
3、视图中需要为某列取新的名称更合适。
- 当视图是基于一个基本表创建的,且保留了主码属性,这样的视图称为行列子集视图。
- 视图可以建立在一个或多个基本表上。
- 视图可以建立在视图上。
2、查询视图:
- 从用户角度看,查询视图与查询基本表的方式一致。
- 从系统角度看,查询视图的过程是:
1)有效性检查,基本表、视图是否存在;
2)从数据库系统表中取出创建视图的语句,将创建视图中的子查询与用户查询结合,转换成等价的对基本表的查询;
3)执行改写后的查询。 - 查询中可以同时对基本表和视图进行查询。
3、更新
- 由于视图时虚表,对其更新最终要转换为对基本表的更新。如果创建视图的语句中包含了表达式、聚合运算、取消重复值运算,则不能对视图进行更新。
UPDATE
set
[WHERE...]
- 一般来讲,若是行列子集视图,可以更新;其他一般不允许更新。
4、删除
DROP VIEW 视图名[CASCADE]
/*级联删除--把该视图和它导出的所有视图都删除*/
- 删除基本表时,由该基本表导出的所有视图都必须显式的用上面语句删除。
游标
- 游标是系统为用户开设的一个数据缓冲区,用于存放SQL语句的执行结果。
- 每个游标都有一个名字,用户可以用SQL语言逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。
- 使用游标的5个步骤:
1)定义:DECLARE
DECLARE 游标名 CURSOR
FOR 游标要实现的功能
[ FOR {READ ONLY|UPDATE [OF 属性列名的列表]} ]
/*仅查询或是可以更新,缺省为可更新*/
2)打开:OPEN
3)逐步提取游标集中的行:FETCH 游标名 INTO ...
@@FETCH_STATUS来判断是否已读完游标集所有行,返回值:
0:成功;-1:FETCH语句失败或此行不在结果集中;-2:被提取的行不存在。
4)关闭:CLOSE
5)释放:DEALLOCATE
局部变量:变量名前加@
全局变量:变量名前加@@
当前游标集的修改与删除
1、删除游标集中当前行
DELETE FROM 表名
WHERE CURRENT OF 游标名
2、修改游标集中当前行
UPDATE 表名
SET...=...
WHERE CURRENT OF 游标名
对游标当前位置的记录进行修改、删除,最终都将转化成对基本表的修改。
存储过程
- 存储过程是为了完成特定功能汇集而成的一组命名了的SQL语句集合,该集合编译后存放在数据库中,可根据实际情况重新编译。
- 优点:
1)将业务操作封装;
2)便于事务管理;
3)实现一定程度的安全性保护;
这种安全性缘于用户对存储过程只有执行权限,没有查看权限。拥有其执行权限就自动获取了存储过程中对相应表或视图的操作权限,但操作权限仅能通过执行存储过程来实现。
4)特别适合统计和查询操作;
5)减少网络通信量。
1、创建存储过程
CREATE PROCEDURE 存储过程名
AS 查询语句
2、执行
EXECUTE 存储过程名
参数要与PROCEDURE的一致
3、修改和删除
AlTER PROCEDURE 存储过程名
AS 查询语句
DROP PROCEDURE 存储过程名
第八章 数据库存储结构与查询处理
第九章 数据库安全性与完整性
- 数据库安全保护的目标是确保只有授权用户才能访问数据库,而所有未被授权的人则无法接近数据。
- 安全措施指计算机系统中用户直接或通过应用程序访问数据库所要经过的安全性认证过程。
- 存取控制:决定用户可以对数据库中的哪些对象进行操作,进行何种操作.
- 存取控制机制主要包括:1)定义用户权限,并将用户权限登记到数据字典中;2)合法权限检查.
- 可以通过为不同用户定义不同的视图,达到限制用户访问范围的目的. 视图的主要功能在于提供数据库的逻辑独立性,但实际应用中,通常将视图机制与存取控制机制结合起来使用.
- 审计:一种监视措施,用于跟踪记录有关数据的访问活动,存放在审计日志中
- 数据加密是防止数据库中数据存储和传输失密的有效手段.将明文加密为密文后进行存储,传输.
- 主体:数据库的访问者,包括用户,进程和线程等
- 客体:数据库中的数据和载体,如基本表,视图,存储过程和数据文件等.
- 主体,客体是独立的,一个主体在一定条件下可以访问某些客体.
- 自主存取控制:是一种基于存取矩阵的存取控制模型.由主体,客体和存取操作构成,他们构成一个矩阵,列–主体,行–客体,矩阵中元素–存取操作.
- 强制存取控制(MAC):不是用户能直接感知或进行控制的.
- 对于主体和客体,DBMS为每个实例指派了一个敏感度标记(绝密,机密,可信,公开等)
- 主体的敏感度标记:许可证级别,客体的:密级.
- 当某一主体注册进入系统时,它对客体的存取需满足:级别 >= 时,可读; = 时,可写.
- 访问监视器:一个独立的物理机构,由一定的软件和硬件组成,能监视主体对客体的全部访问活动.
-
用户权限由两个要素组成:数据对象和操作类型。
-
授权粒度可以精细到字段级,也可以粗到关系级。授权粒度越细,授权子系统越灵活,开销越大。
-
数据库角色:被命名的一组与数据库操作相关的权限。角色时权限的集合,可以为一组具有相同权限的用户创建一个角色,角色简化了授权操作。
-
数据库完整性:正对数据库中的数据进行正确性的维护,防止数据库中存在不符合语义,不正确的数据。
-
完整性约束条件也称完整性规则,是数据库中数据必须满足的语义约束条件。
-
完整性检查:检查数据是否满足已定义的完整性约束条件。
1)列约束:在定已属性的同时定义该属性应满足的约束条件。
2)元组约束:定义元组中属性间的联系的约束条件;在定义属性后单独定义。
3)关系约束:定义若干元组间、关系集合上以及关系之间的联系的约束条件,亦称为表约束;在定义属性之后单独定义。
- 完整性约束又分为立即执行约束和延迟执行约束。立即执行约束:检查是否违背完整性约束的时机是在一条语句执行完后立即检查。延迟执行约束:需要延迟到整个事务执行结束后再进行检查。
- 实体完整性:要求基本表的主码值唯一且不允许为空值。使用PRIMARY KEY语句或ADD PRIMARY KEY实现.
- 当插入或对主码列进行修改操作时,关系数据库管理系统按照实体完整性规则自动检查,包括:1)检查主码值是否唯一;2)检查主码各个属性是否为空。(不唯一、有一个为空则拒绝插入或修改)
- 参照完整性为若干个表中的相应元组建立多对一的参照联系。使用FOREIGN KEY 和REFERENCES实现,或通过ADD FOREIGN KEY实现。
- 其中,FOREIGN KEY指出定义哪些列为外码,定义的关系称为参照关系。由REFERENCES指明该外码参照哪个关系的主码,指明的表称为被参照关系。
- 用户自定义完整性:定义某一具体应用中数据必须满足的语义要求。仅使用列约束和元组约束。
第十章 事务管理与恢复
- 问题背景:数据库应用希望将有关联的操作看作一个逻辑工作单元看待,要么都执行,要么都不执行。
- 事务:具有完整逻辑意义的数据库操作序列的集合。
- 在操作系统中,进程是竞争系统资源和进行处理机调度的基本单元。而再数据库管理系统中,事务是数据库管理系统中竞争资源、并发控制和恢复的基本单元。
- 事务提交:将成功完成的事务的执行结果(即更新)永久化,并释放事务占有的全部资源。
- 事务回滚:中止当前事务、撤销其对数据库所做的更新,并释放事务占有的全部资源。
- 为保证事务并发执行或发生故障时数据的完整性,事务应具有以下特性:
事务ACID特性
1)原子性(atomicity):原子性要求一事务对数据库的操作要么都发生,要么都不发生。当一事务执行失败时,DBMS能保证那些部分执行的操作不反映到数据库中去。也称故障原子性或故障可靠性
2)一致性(consistency):一个单独执行的事务应保证其执行结果的一致性,即总是将数据库从一个一致性状态转化到另一个一致性状态。包括显示和隐式两种。也称并发原子性或事务可靠性
3)隔离性(isolation):当多个事务并发执行时,一个事务的执行不能影响另一个事务,即并发执行的各个事务不能互相干扰。也称执行原子性或并发正确性 或可串行化
破坏隔离性的原因时并发执行的各个事务可能访问相同的数据项。
4)持久性(durability):一个事务成功提交后,它对数据库的改变必须是永久的,即使随后系统出现故障也不会受到影响。也称恢复原子性或恢复可靠性
持久性要求事务对数据库的更行在其结束前就已经写入磁盘,或再数据库更新时记录足够多的信息,使得在出现故障时DBMS能利用这些信息重构数据库的更新。
事务并发执行与调度
- 数据库系统允许多事务并发执行,优点:1)增加系统吞吐量;2)减少平均响应时间。
- 并发执行可能带来不一致性:
1)读脏数据;
2)不可重复读;
3)丢失更行。
启示:如果一组并发执行事务的执行结果与它们串行执行得到的结果相同,那么可以认为该并发执行的结果是正确的。
事务调度及正确性准则
- 串行调度:在调度S中,如果属于同一事务的操作的操作都是项链的,则称S是串行调度。
- 对由n各事务组成的一组事务而言,共有n!个有效串行调度。
- 在一调度S中,如果Oi与Oj是不同事务在相同数据对象上的操作,并且其中至少有一个是写操作,则称Oi与Oj是冲突操作,否则称非冲突操作。
- 如果一调度S可以经过交换一系列非冲突操作执行顺序而得到一个新的调度S‘,则称S与S’是冲突等价的。
- 如果一调度S与一串行调度是冲突等价的,称S是 冲突可串行化的。
- 冲突可串行化可保证一个并发调度的正确性,因为它与某个串行调度的执行结果是等价的。但是冲突可串行化仅仅是正确调度的充分条件,不是必要条件.(即正确的调度不一定都是冲突可串行化的)
- 设S是一个调度,由S构造一个有向图,称为优先图.
- 基于优先图的冲突可串行化判别准则:如果优先图中无环,则S是冲突可串行化的;如果优先图中有环,则S是非冲突可串行化的.
并发控制
- 当数据库中多个事务并发执行时,事物的隔离性不是总能得到保证,DBMS必须采取一定的措施对并发执行事务之间的相互影响加以控制,这种措施就是并发控制机制.
- 基于封锁的并发控制方法的思想:当事务T需访问数据对象Q是,先申请对Q的锁.
- 给数据加锁的方式有多种,基本锁分为:
1)共享锁(S锁 shared):如果事务T获得了数据对象Q的共享锁,则T可读Q但不能写.
2)排他锁(X锁 exclusive):如果事务T获得了数据对象Q的排他锁,则T可读Q也能写.
- 锁相容:T已持有对数据对象Q的某类型锁后,也申请对Q的封锁.
- 原则:共享锁与共享锁相容,其他的组合都不行.
- 一个数据对象Q上可以同时拥有多个(被不同事务拥有的)共享锁,但任何时候只能有一个排他锁.
SL(Q)—申请数据对象Q上的共享锁.
XL(Q)—申请数据对象Q上的排他锁.
UL(Q)—释放数据对象Q上的锁.
- 两阶段封锁协议要求每个事务分两个阶段提出申请锁和解锁申请.
1)增长阶段:事务可以获得锁,但不能释放锁.
2)缩减阶段:事务可以释放锁,但不能获得新锁.
- 两阶段封锁协议可以保证冲突可串行化.
- 对任何事务,调度中该事务获得其最后加锁的时刻(增长阶段结束点)称为事务的封锁点.
- 多个事务可以根据封锁点进行排序,这个顺序就是并发事务的一个冲突可串行化顺序.
- 两阶段封锁协议存在的问题:
1)可能导致死锁:即持有锁的事务出现相互等待都不能继续执行.解决方法:超时机制
2)不能避免读脏数据.
- 两阶段封锁协议的一个变体是:严格两阶段封锁协议,它除了要求封锁是两阶段之外,还要求事务所持有的所有排他锁必须在事务提交后方可释放.
- 另一个变体是强两阶段封锁协议:要求事务提交之前不