除标题外加粗的是长安大学软件工程系数据库期末考试的考点,没有加粗的是课堂涉及的内容,省略和没有提及的内容是没有在课堂上讨论的内容。 仅用于个人复习,本文著作权归原书作者所有,转载必须注明原书作者和出版社。
1、数据库系统的四个基本概念 数据(Data):描述事物的符号记录称为数据,数据是数据库存储的基本对象。 数据库(DB):长期存储在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按照一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。概括地讲,数据库数据具有永久储存、有组织和可共享三个基本特点。 数据库管理系统(DBMS):位于用户和操作系统之间的一层数据管理软件。主要功能包括提供数据定义语言(DDL)、数据的组织存储和管理、提供数据操纵语言(DML)、事务管理和运行管理、创建和维护等。 数据库系统(DBS):数据库系统是由数据库、数据库管理系统、应用程序和数据库管理员(DBA)组成的存储、管理和维护数据的系统。DBS=DB+DBMS+APP+DBA。 2、数据管理技术的产生和发展 数据管理的三个阶段:人工管理、文件管理、数据库管理系统 文件系统与数据库管理系统的区别
人工管理阶段文件系统阶段数据库系统阶段数据的管理者用户(程序员)文件系统数据库管理系统数据面向的对象某一应用程序某一应用现实世界(法人、社团)数据的共享程度无共享,冗余性极大共享性差,冗余度大共享性高,冗余度小数据的独立性不独立,完全依赖于程序独立性差具有高度的物理独立性和一定的逻辑独立性数据的结构性无结构记录内有结构、整体无结构整体结构化,用数据模型描述数据控制能力应用程序自己控制应用程序自己控制由数据库管理系统提供数据安全性、完整性、并发控制和恢复能力3、数据库系统的特点 数据结构化;数据的共享性高、冗余性低且易扩充;数据独立性高;数据由数据库管理系统统一管理和控制。
数据模型:对现实世界数据特征的抽象,用来描述数据、组织数据和操作数据,是数据库系统的核心和基础。 1、两类数据模型:①概念模型②逻辑模型和物理模型 概念模型:按照用户的观点对数据和信息建模,主要用于数据库设计。 逻辑模型:按照计算机系统的观点对数据建模,主要用于数据库管理系统的实现。 物理模型:对数据最底层的抽象,描述数据在系统内部或存储介质上的表示方式和存取方法。 构建数据模型的方法:将现实世界抽象为信息世界,得到概念模型;将信息世界转换为机器世界,得到DBMS支持的数据模型。 2、概念模型: 信息世界中的基本概念: (1)实体:客观存在并可相互区别的事物。 (2)属性:实体的特性称为属性。 (3)码:唯一标识实体的属性集称为码。 (4)实体型:用实体名及其属性名集合来抽象和刻画同类实体,称为实体型。 (5)实体集:同一类型的实体的集合称为实体集。 (6)联系:实体内部的联系指组成实体的属性之间的联系,实体之间的联系指不同实体集之间的联系。实体之间的联系有一对一、一对多和多对多等多种类型。 概念模型的表示方法:实体-联系(E-R)方法,该方法使用E-R图描述概念模型。 3、数据模型的组成要素 数据模型通常由数据结构、数据操作和完整性约束条件三部分组成。数据结构描述数据库组成对象和对象之间的联系;数据操作指对数据库中各种对象(型)的实例(值)允许执行操作的集合;数据的完整性约束条件是一组完整性规则,包括实体完整性、参照完整性和用户定义的完整性。 4、常用的数据模型 层次模型、网状模型、关系模型、面向对象数据模型、对象关系数据模型、半结构化数据模型等。 5、层次模型(略) 6、网状模型(略) 7、关系模型 关系模型的数据结构: (1)关系:一个关系对应通常所说的一张表。 (2)元组:表中的一行即为一个元组。 (3)属性:表中的一列即为一个属性。 (4)码/键:唯一确定一个元组的属性集。 (5)域:一组具有相同数据类型的值的集合。属性的取值范围来自某个域。 (6)分量:元组中的一个属性值。 (7)关系模式:对关系的描述,一般表示为 关系名(属性1,属性2,…,属性n) 关系模型的数据操作:增删改查 【必考】关系的完整性约束:实体完整性、参照完整性、用户定义的完整性 关系模型的评价:严格数学定义、概念单一、存储路径对用户透明、查询效率稍稍逊于格式化数据模型。
1、数据库系统模式的概念 “型”和“值”:型是指对某一类数据的结构和属性的说明,值是型的一个具体赋值。 模式:数据库中全体数据的逻辑结构和特征的描述,仅仅涉及型的描述,不涉及具体的值。模式的一个具体值称为模式的一个实例。模式是相对稳定的,实例是相对变动的。 2、数据库系统的三层模式结构 模式:也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共视图。在数据库系统模式结构中处于中间层,与硬件平台和应用程序无关。一个数据库只有一个模式。 外模式:也称子模式和用户模式,它是数据库用户(应用程序员与最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。外模式通常是模式的子集,一个数据库可以有很多外模式。 内模式:也称存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。例如,记录的存储方式是堆存储、升序/降序存储还是聚簇存储;B+树索引还是哈希索引;是否压缩存储,是否加密;数据存储记录结构是定长结构还是边长结构;等等。 3、数据库的而二级映像功能与数据独立性 数据库的二级映像功能:外模式/模式映像、模式/内模式映像。 外模式/模式映像针对于每一个外模式,定义了外模式与模式的对应关系;模式/内模式映像是唯一的,定义了数据全局逻辑结构与存储结构之间的对应关系。 数据的逻辑独立性:当模式改变时,由DBA对各个外模式/模式的映像作相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据逻辑独立性。 数据的物理独立性:当数据库的存储结构改变时,由DBA对模式/内模式映像作出相应改变,可以使模式保持不变,从而应用程序也不必改变,保证了数据与程序的物理独立性,简称数据物理独立性。
数据库系统=数据库+数据库管理系统+应用程序+数据库管理员 数据库管理员(DBA)的职责: (1)决定数据库中的信息内容和结构; (2)决定数据库的存储结构和存取策略; (3)定义数据的安全性要求和完整性约束条件; (4)监控数据库的使用与运行; (5)数据库的改进、重组和重构
关系模型三要素:关系数据结构、关系操作集合、关系完整性约束 1、关系 关系:描述现实世界的实体以及实体之间的各种联系的单一结构类型就是关系,站在用户的视角,关系就是一张二维表。 (1)域:域是一组具有相同数据类型的集合。 (2)笛卡尔积:给定的一组域D1,D2,…,Dn,允许其中某些域是相同的,它们的笛卡尔积定义为 D1×D2×…×Dn={(d1,d2,…,dn)|di∈Di,i=1,2,…,n} 其中每一个元素(d1,d2,…,dn)叫做一个n元组,或简称元组,元组中的每一个分量di叫做一个分量。一个域允许的不同取值个数称为这个域的基数。 (3)关系:D1×D2×…×Dn的子集叫做在域D1,D2,…,Dn上的关系,表示为R(D1,D2,…,Dn),R表示关系的名字,n是关系的目或度。关系中的每个元素是关系中的元组,用t表示。
关系是笛卡尔积的有限子集,所以关系也是一张二维表,表的每一行表示一个元组,表的每一列对应一个域,区分域的列名就是属性名。候选码:某一属性组的的值能够唯一地标识一个元组,但是它的任何一个真子集不能,则称该属性组为候选码主码:若一个关系有多个候选码,则选定其中一个为主码。主属性:候选码的诸属性为主属性,不包含在任何候选码中的属性称为非主属性。全码:关系模式的所有属性构成这个关系模式的候选码,称为全码。关系类型:基本关系(基本表或基表)、查询表和视图表。基本表是实表;查询表是查询结果对应的表;视图表是导出表,是虚表。关系的补充限定:禁止无限关系,附加属性名来消除关系属性的有序性基本关系的6条性质:列同质、异列可同域、行列无序性、候选码唯一性、分量原子性2、关系模式 关系模式:关系的描述称为模式,它的形式化表达为R(U,D,DOM,F),其中R为关系名,U为属性名集合,D为属性域,DOM为属性向域的映像集合,F为属性间数据的依赖关系集合。 3、关系数据库(略) 4、关系模型的存储结构(略)
1、基本的关系操作:增删改查 查询操作:选择、投影、连接、除、并、差、交、笛卡尔积 2、关系数据语言的分类:关系代数和关系演算 结构化查询语言SQL:DQL、DDL、DML、DCL
【必考】关系模型三类完整性约束:实体完整性、参照完整性、用户定义完整性 1、实体完整性:主码不可重复且不为空 2、参照完整性:若属性/属性组F是基本关系R的外码,它与基本关系S的主码Ks相对应(R与S可以是同一关系),则对于R中每个元组在F上的值必须取空值或S中某个元组的主码值。 外码:设F是基本关系R的属性/属性集,但不是关系R的码,Ks是基本关系S的主码,如果F与Ks相对应,则称F是R的外码,并称R为参照关系,S为被参照关系或目标关系,R与S可以是同一关系。 3、用户定义的完整性
1、传统的集合运算:并、差、交、笛卡尔积 2、专门的关系运算:选择、投影、连接、除 (1)选择:σF(R),F是选择条件 (2)投影:ΠA(R),A是属性列 (3)连接:从两个关系的笛卡尔积中选取属性间满足条件AθB的元组。 等值连接:θ为“=”的连接运算。 自然连接:特殊的等值连接,要求比较的分量必须是同名的属性组,并在结果中去掉重复的列。 悬浮元组:自然连接中,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,因此被舍弃,这些元组称为悬浮元组。 外连接:进行自然连接时,保留悬浮元组,而在其他属性列上填空值。分为左外连接和右外连接,分别表示保留哪一边关系的悬浮元组。 (4)除运算:给定关系R(X,Y)和S(Y,Z),X,Y,Z为属性组。R中的Y和S中的Y可以有不同的属性名但必须有相同的域集。R与S的除运算得到一个新的关系P(X),P是R中满足以下条件的元组在X属性列上的投影:元组在X上的分量x的象集Yx包含S在Y上的投影的集合。记作:
R÷S={t r[X]|t r∈R∧Π Y(S)⊆Y x} 其中Y x为x在R中的象集,x=t r[X]。象集Yx:给定一个关系R(X,Y),X和Y为属性组。当t[X]=x时,x在R中的象集定义为:
Y x={t[Y]|t∈R,t[X]=x}如何理解除运算:R÷S,将R中属性分为公共属性和非公共属性,对于同一个非公共属性值,如果公共属性值在S中的元组中都出现过,那么把非公共属性值加入结果中。除运算一般用于解决“至少”问题。
1、SQL的产生与发展 2、SQL语言的特点: (1)综合统一,集DDL、DML、DCL、DQL于一身。 (2)高度非过程化。 (3)面向集合的操作方式。 (4)以同一种语法结构提供多种使用方式。 (5)语言简介,易学易用。 3、SQL的基本概念 外模式——视图,模式——基本表,内模式——存储文件
之后几节全部是重点,不考察exists谓词
1、模式的定义与删除 定义模式:
CREATE SCHEMA 模式名 AUTHORIZATION 用户名; CREATE SCHEMA 模式名 AUTHORIZATION 用户名 [表定义子句|视图定义子句|授权定义子句]删除模式:
DROP SCHEMA 模式名 [CASCADE|RESTRICT]2、基本表的定义、删除与修改 定义基本表:
CREATE TABLE 表名 ( 列名 数据类型 [列级完整性约束条件], [列名 数据类型 [列级完整性约束条件]] ... [, 表级完整性约束条件] );参照完整性约束条件:
FOREIGN KEY(Sno) REFERENCES Student(Sno)数据类型:定长与变长字符串,大对象,整型,定点数,浮点数,布尔型,时间类型 修改基本表:
ALTER TABLE 表名 [ADD [COLUMN] 新列名 数据类型 [完整性约束]] [ADD 表级完整性约束] [DROP [COLUMN] 列名 [CASCADE|RESTRICT]] [DROP [CONSTRAINT] 完整性约束名 [RESTRICT|CASCADE]] [ALTER COLUMN 列名 数据类型];删除基本表:
DROP TABLE 表名 [RESTRICT|CASCADE];3、索引的建立与删除 索引类型:顺序文件上的索引、B+树索引、散列索引、位图索引 建立索引:
CREATE [UNIQUE|CLUSTER] INDEX 索引名 ON 表名(列名 [ASC|DESC] [, 列名 [ASC|DESC]] ... );修改索引:
ALTER INDEX 旧索引名 RENAME TO 新索引名;删除索引:
DROP INDEX 索引名;4、数据字典:记录数据库中所有定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、权限定义、统计信息,的一组系统表。
1、单表查询 常用的查询条件
查询条件谓词比较关系运算符,NOT确定范围BETWEEN AND,NOT BETWEEN AND确定集合IN,NOT IN字符匹配LIKE,NOT LIKE空值IS NULL,IS NOT NULL多重条件AND,OR,NOT通配符:%,_ 聚集函数
聚集函数功能COUNT(*)统计元组个数COUNT([DISTINCT|ALL] 列名)统计一列中值的个数SUM([DISTINCT|ALL] 列名)计算一列值的总和AVG([DISTINCT|ALL] 列名)计算一列值的平均值MAX([DISTINCT|ALL] 列名)求一列值中的最大值MIN([DISTINCT|ALL] 列名)求一列值中的最小值GROUP BY子句:将查询结果按照某一列或多列的值分组,值相等的为一组。分组后聚集函数将作用于每一组,即每一组都有一个函数值。HAVING子句与WHERE子句的区别在于HAVING子句作用于组,可以使用聚集函数,但WHERE子句中不可以。 具体使用:
SELECT Sno,Sname FROM Student; SELECT * FROM Student; SELECT Sname,'Year of Birth',2014-Sage BIRTHDAY,LOWER(Sdept);/*目标列表达式可以是属性列,常量,函数,也可以是表达式,通过指定别名可以改变列标题*/ SELECT DISTINCT Sno FROM SC;/*去重*/ SELECT Sname FROM Student WHERE Sdept='cs';/*比较大小*/ SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;/*确定范围*/ SELECT Sname,Ssex FROM Student WHERE Sdept IN ('cs','ma','is');/*确定集合*/ SELECT * FROM Student WHERE Sname LIKE '刘%';/*字符匹配*/ SELECT * FROM SC WHERE GRADE IS NULL;/*空值查询*/ SELECT * FROM Student WHERE Sdept='cs' AND Sage<20;/*多重条件查询*/ SELECT COUNT(*) FROM Student;/*使用聚集函数*/ SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)>=90;/*使用GROUP BY子句*/2、连接查询
-- 等值连接 SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno=SC.Sno; -- 自身连接 SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno=SECOND.Cno; -- 外连接 SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno); -- 多表连接 SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Student.Sno=SC.Sno AND SC.Sno=Course.Cno;嵌套循环连接算法:R与S等值连接,先在R找到第一个元组,扫描S表查找符合等值条件的S表元组,合并后形成结果表中第一个元组,然后再在R找第二个元组,重复以上步骤,直到遍历完整个R表。使用索引可以提高查找的效率。 3、嵌套查询 嵌套查询:一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。需要特别指出的是子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。 不相关子查询:子查询的查询条件不依赖于父查询。 相关子查询:子查询的查询条件依赖于父查询。相关子查询的一种执行过程为,从外层查询中取出一个元组,将它的属性值传给内层查询,执行内层查询得到一个值,用该值代替内层查询,得到外层查询,执行外层查询。 (1)带有IN谓词的子查询
SELECT Sname FROM Student WHERE Sno IN( SELECT Sno FROM SC WHERE Cno='2' );(2)带有比较运算符的子查询
SELECT Sno,Sname,Sdept FROM SC x WHERE Grade>=( SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno );(3)带有ANY(SOME)或ALL谓词的子查询 op ANY表示对于子查询中某一个值条件成立则为真,op是关系运算符 op ALL表示对于子查询中所有值条件都成立才为真,op是关系运算符
-- 查询年龄至少小于一个计科学生的非计科的学生的姓名和年龄 SELECT Sname,Sage FROM Student WHERE Sage<ANY( SELECT Sage FROM Student WHERE Sdept='cs' ) AND Sdept <> 'cs'; -- 等价于 SELECT Sname,Sage FROM Student WHERE Sage<( SELECT MAX(Sage) FROM Student WHERE Sdept='cs' ) AND Sdept <> 'cs';(4)带有EXISTS谓词的子查询 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真或假。内层查询不为空则为真,内层查询为空则为假。可以使用NOT运算符对逻辑值结果取反。
-- 查询选修了1号课程的学生 SELECT Sname FROM Student WHERE EXISTS( SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1' ); /*使用了相关子查询,对于每一个Student,将Sno属性值传入子查询中,执行子查询, 根据结果是否为空得到一个布尔值,为真时就将这个学生的姓名放在结果中。*/ -- 变态版子查询 -- 查询至少选修了学生201215122选修的全部课程的学生号码 /* p:“学生201215122选修了课程y” q:“学生x也选修了课程y” 查询:(∀y)p->q 转换:(∀y)p->q ≡ ┐(∃y(┐(p->q))) ≡ ┐(∃y(┐(┐p∨q))) ≡ ┐∃y(p∧┐q) */ SELECT DISTINCT Sno FROM SC SCX -- 表示学生x WHERE NOT EXISTS( -- 再次取反,表示x没有选修课程y的这种情况不出现 SELECT * FROM SC SCY -- 表示学生201215122 WHERE SCY.Sno='201215122' AND NOT EXISTS( -- 取反,也就是x没有选修课程y SELECT * FROM SC SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno -- 表示x也选修了课程y ) );4、集合查询 集合操作主要包括并操作(UNION)、交操作(INTERSECT)、差操作(EXCEPT),将两个SELECT语句通过集合操作运算符连接即可。 5、基于派生表的查询 子查询出现在FROM子句中。
1、插入数据
-- 插入元组 INSERT INTO 表名 [(属性列1, 属性列2 ...)] VALUES(常量1, 常量2 ...),[(常量1, 常量2 ...) ...]; -- 插入子查询结果 INSERT INTO 表名 [(属性列1, 属性列2 ...)] 子查询;2、修改数据
UPDATE 表名 SET 列名=表达式[, 列名=表达式 ...] [WHERE 条件]; -- 子查询也可以出现在UPDATE语句的where子句中3、删除数据
DELETE FROM 表名 [WHERE 条件]; -- 子查询也可以出现在DELETE语句的where子句中空值的产生:插入仅给部分属性赋值的元组、外连接、空值的关系运算 空值的判断:IS NULL、IS NOT NULL 空值的约束条件:NOT NULL、UNIQUE、码属性不能为空 空值的算术运算、比较运算和逻辑运算:空值的算术运算结果为空值,空值的比较运算结果为UNKNOWN,UNKNOWN的逻辑运算结果如下: NOT U = U, U AND U = U U AND T = U, U AND F = F,U OR U = U, U OR T = T, U OR F = U
1、定义视图 (1)建立视图
CREATE VIEW 视图名 [(列名[, 列名]...)] AS 子查询 [WITH CHECK OPTION]; /*WITH CHECK OPTION表示对视图进行UPDATE、INSERT、DELETE操作时 要保证执行操作的行满足视图定义中的谓词条件(即子查询中的条件表达式)*/组成视图的所有列名全部省略或全部指定,必须指定列名的情况:
某个目标列不是单纯的属性名,而是聚集函数或列表达式;多表连接时选出了几个同名列作为视图的字段需要在视图中为某个列启用新的更合适的名字 CREATE VIEW语句并不执行子查询,而是在查询视图时才执行子查询。 行列子集视图:从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图。 视图可以建立在基本表、视图、基本表和视图的组合之上。 虚拟列:由基本表经过计算导出的属性列称为虚拟列,带虚拟列的视图也称为带表达式的视图。 分组视图:用带有聚集函数和GROUP BY子句的查询定义的视图称为分组视图。 (2)删除视图 DROP VIEW 视图名 [CASCADE];2、查询视图 查询视图的方法与查询表的方法一样。 视图消解:从数据字典中取出数据的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解。 目前多数关系型数据库能够对行列子集视图的查询均能进行正确转换,但对非行列子集视图的查询就不一定能够转换,这类查询应当直接对基本表进行。 视图查询与派生表查询的区别:视图定义将永久保存在数据字典中,派生表是临时定义,执行后即被删除。 3、更新视图 视图是虚表,对视图的更新将转换为对基本表的更新。 使用WITH CHECK OPTION定义视图可以防止对非视图基本表数据进行操作。 视图并不总是可以更新的,一般地,行列子集视图是可更新的。 4、视图的作用 简化操作、多角度看待数据、为重构数据库提供一定程度逻辑独立性、安全性控制、更清晰的表达
数据库安全性:保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。 1、数据库的不安全因素:非法入侵、数据泄露、安全环境的脆弱性 2、安全标准简介:TCSEC、CC
数据库安全性控制:身份鉴别、多层存取控制、审计、视图和数据加密 1、用户身份鉴别(略) 2、存取控制 存取控制机制:
定义用户权限,并将用户权限登记到数据字典中合法权限检查存取控制方法:
自主存取控制:采用授权方式实现存取控制,比较灵活。强制存取控制:采用密级标定数据库对象,比较严格。3、自主存取控制方法 用户权限二要素:数据库对象、操作类型 授权:定义存取权限。 在关系型数据库系统中,存取控制的对象不仅有数据本身,还有数据库模式(数据库、基本表、视图和索引的创建)。 4、授权:授予与收回 (1)GRANT
GRANT 权限[, 权限]... ON 对象类型 对象名[, 对象类型 对象名]... TO 用户[, 用户]... [WITH GRANT OPTION];-- 允许权限传播eg:
GRANT SELECT ON TABLE Student TO U1; GRANT ALL PRIVILEGES ON TABLE Student,Course TO U2,U3; -- mysql中不允许写多个用户和多个表 GRANT SELECT ON TABLE SC TO PUBLIC; -- mysql中没有PUBLIC GRANT UPDATE(Sno),SELECT ON TABLE Student TO U4; GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION;(2)REVOKE
REVOKE 权限[, 权限]... ON 对象类型 对象名[, 对象类型 对象名]... FROM 用户[, 用户]... [CASCADE|RESTRICT]eg:
REVOKE UPDATE(Sno) ON TABLE Student FROM U4; REVOKE SELECT ON TABLE SC FROM PUBLIC; REVOKE INSERT ON TABLE SC FROM U5 CASCADE; REVOKE ALL PRIVILEGES,GRANT OPTION ON TABLE Student FROM U4;-- 收回一切权限自主控制控制:用户可以“自主”地决定将数据的存取权限授予何人、决定是否也将“授权”的权限授予别人。因此称这样的存取控制是自主存取控制。 3、创建数据库模式的权限 创建用户:
CREATE USER 用户名 [WITH DBA|RESOURCE|CONNECT]; 只有系统的超级用户才有权创建一个新的数据库用户新创建的数据库用户有三种权限:CONNECT、RESOURCE和DBA新用户默认的权限为CONNECT,拥有CONNECT权限的用户只能登录数据库拥有RESOURCE权限的用户能创建基本表和视图,成为所创建对象的属主,但不能创建模式,也不可以新建用户。数据库对象的属主可以把该对象上的权限授权给其他用户。拥有DBA权限的用户具有最高权限。【注意】CREATE USER语句不是SQL标准
5、数据库角色 数据库角色:被命名的一组与数据库操作相关的权限,角色是权限的集合。使用角色管理数据库权限可以简化授权的过程。 角色的创建:
CREATE ROLE 角色名给角色授权:
GRANT 权限[, 权限]... ON 对象类型 对象名 TO 角色[, 角色]...将一个角色授予其他用户或角色:
GRANT 角色[, 角色]... TO 角色|用户[,角色|用户]... [WITH ADMIN OPTION];-- mysql不支持WITH ADMIN OPTION角色权限的收回:
REVOKE 权限[, 权限]... ON 对象类型 对象名 FROM 角色[, 角色]...6、强制存取控制方法(MAC) 基本思想:对系统控制下的所有主客体实施强制存取控制策略。在强制存取控制中,数据库管理系统所管理的全部实体被分为主体和客体两部分,主体包括用户和外部进程,客体包括数据库对象如文件、表、索引、视图。数据库系统为每个主体和客体指派敏感度标记,主体敏感度标记称为许可证级别,客体敏感度标记称为密级。同等或高许可证级别用户可以读取相应客体(规则Ⅰ),同等或低许可证级别用户可以写相应客体(规则Ⅱ),规则Ⅱ防止密级从高流向低从而泄密。MAC对数据进行密级标记,无论数据如何复制,标记与数据都是不可分割的整体,只有符合密级要求的用户才能访问,从而提供更高级别的安全性。
审计:建立审计日志记录数据库操作
数据库的完整性:正确性+相容性 数据库完整性要求:定义完整性约束性机制+完整性检查+违约处理
1、实体完整性定义 两种约束条件说明方法:列级约束条件、标记约束条件
CREATE TABLE Student( Sno CHAR(9) PRIMARY KEY, -- 列级约束条件 Sname CHAR(20) NOT NULL, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20) ); -- 等价于 CREATE TABLE Student( Sno CHAR(9), Sname CHAR(20) NOT NULL, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20), PRIMARY KEY(Sno) -- 表级约束条件 );2、实体完整性检查和违约处理 唯一性检查+空值检查
1、定义参照性完整性
CREATE TABLE SC( Sno CHAR(9), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY(Sno,Cno), -- 只能用表级实体完整性约束 FOREIGN KEY(Sno) REFERENCES Student(Sno), -- 表级完整性约束 FOREIGN KEY(Cno) REFERENCES Course(Cno) -- 表级完整性约束 );2、参照完整性检查和违约处理
可能破坏参照完整性的情况及违约处理 被参照表(如Student)参照表(如SC)违约处理可能破坏参照完整性插入元组NO ACTION可能破坏参照完整性修改外码值NO ACTION删除元组可能破坏参照完整性NO ACTION/CASCADE DELETE/NULL修改主码值可能破坏参照完整性NO ACTION/CASCADE UPDATE/NULL显式说明参照完整性约束:
CREATE TABLE SC( Sno CHAR(9), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY(Sno,Cno), -- 只能用表级实体完整性约束 FOREIGN KEY(Sno) REFERENCES Student(Sno) ON DELETE CASCADE ON UPDATE CASCADE, -- 表级完整性约束 FOREIGN KEY(Cno) REFERENCES Course(Cno) ON DELETE NO ACTION ON UPDATE CASCADE-- 表级完整性约束 );1、属性上的约束条件
-- 列值非空 CREATE TABLE SC( Sno CHAR(9) NOT NULL, /* 列值非空 */ Cno CHAR(4) NOT NULL, /* 列值非空 */ Grade SMALLINT NOT NULL, /* 列值非空 */ PRIMARY KEY(Sno,Cno), ... ); -- 列值唯一 CREATE TABLE DEPT( Dno NUMERIC(2), Dname CHAR(9) UNIQUE NOT NULL, /* 列值唯一,非空 */ Location CHAR(9), PRIMARY KEY(Dno) ); -- CHECK短语 CREATE TABLE Student( Sno CHAR(9) PRIMARY KEY, Sname CHAR(8) NOT NULL, Ssex CHAR(2) CHECK(Ssex IN ('男','女')), Sage SMALLINT, Sdept CHAR(20) ); -- 注意在MySQL8.0.16之前的版本不支持CHECK短语2、元组上的约束条件
CREATE TABLE Student( Sno CHAR(9), Sname CHAR(8) NOT NULL, Ssex CHAR(2), Sage SMALLINT, Sdept CHAR(20), PRIMARY KEY(Sno), CHECK(Ssex='女' OR Sname NOT LIKE 'Ms.%') );1、完整性约束命名子句
CONSTRAINT 完整性约束条件名 完整性约束条件 -- 完整性约束条件包括NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK短语 -- 完整性约束条件可以作为列级约束条件或表级约束条件出现2、修改表中的完整性约束
ALTER TABLE 表名 ADD 完整性约束条件子句 ALTER TABLE 表名 DROP CONSTRAINT 完整性约束条件名不同数据库触发器实现方式差异较大,其中MYSQL不支持语句级触发器。 1、定义触发器
-- SQL标准触发器定义 CREATE TRIGGER 触发器名 -- 只有表的拥有者才有权创建触发器 BEFORE|AFTER 触发事件 ON 表名 -- 触发器只能定义在基本表上,触发事件可以是INSERT、DELETE、UPDATE REFERENCING NEW|OLD ROW AS 变量 FOR EACH ROW|STATEMENT -- 触发器类型可以是行级触发器和语句级触发器 [WHEN 触发条件] 触发动作体 -- MySQL触发器定义 CREATE [DEFINER = 用户名] TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON tbl_name FOR EACH ROW [FOLLOWS|PRECEDES 其他触发器名] 触发动作体 /*触发动作体既可以是一个匿名PL/SQL过程块,也可以是对过程的调用。 如果是行级触发器,用户可以在过程体中使用NEW/OLD引用触发事件发生 之前的旧值和之后的新值*/书上例题的MySQL写法
-- 习题5.21 DROP TRIGGER IF EXISTS `lifang`.`sc_AFTER_UPDATE`; DELIMITER $$ USE `lifang`$$ CREATE DEFINER = CURRENT_USER TRIGGER `lifang`.`sc_AFTER_UPDATE` AFTER UPDATE ON `sc` FOR EACH ROW BEGIN if new.grade >= 1.1 * old.grade then insert into sc_u values(new.sno,new.cno,old.grade,new.grade); end if; END$$ DELIMITER ; -- 习题5.23 CREATE TABLE `lifang`.`insert_log` ( `numbers` INT UNSIGNED NOT NULL); DROP TRIGGER IF EXISTS `lifang`.`worker_BEFORE_UPDATE`; DELIMITER $$ USE `lifang`$$ CREATE DEFINER = CURRENT_USER TRIGGER `lifang`.`worker_BEFORE_UPDATE` BEFORE INSERT ON `worker` FOR EACH ROW BEGIN if(new.wpos="经理" and new.wwage<4000) then set new.wwage=4000; end if; END$$ DELIMITER ;2、激活触发器的顺序:BEFORE触发器->触发事件->AFTER触发器 3、删除触发器
DROP TRIGGER 触发器名 ON 表名;数据依赖:一个关系内部属性和属性之间的一种约束关系,这种约束关系是通过属性间值相等与否体现出来的数据间相关联系。其中函数依赖和多值依赖是最重要的数据依赖。 函数依赖:关系R的属性x,y如果满足y=f(x)的关系,则称y函数依赖于x。 一个好的模式应当不会发生插入异常、删除异常和更新异常,数据冗余应尽可能少。
1、函数依赖 定义:X、Y是关系R上的属性集,对于R中任意一个关系r,如果不存在元组t1,t2使得t1[X]=t2[X]且t1[Y]≠t2[Y],那么称X函数确定Y或Y函数依赖于X,记作X->Y。 非平凡的函数依赖:X→Y且Y⊈X,则称X→Y是非平凡的函数依赖。 平凡的函数依赖:X→Y且Y⊆X,则称X→Y是平凡的函数依赖。 决定因素:若X→Y,则X称为这个函数依赖的决定属性组,也称为决定因素。 X→Y且Y→X,记作X←→Y。 完全函数依赖:在R(U)中,如果X->Y且对于X任何一个真子集X’,都有X’-/->Y,则称Y对X完全函数依赖,记作X-F->Y。 部分函数依赖:不是完全函数依赖的函数依赖是部分函数依赖,记作X-P->Y。 传递函数依赖:在R(U)中,如果X->Y(Y⊈X),Y-/->X,Y->Z,Z⊈Y则称Z对X传递函数依赖,记作X-传递->Z。 2、码 候选码:关系R的全体属性U完全函数依赖于R中的属性(集)K,则K是R的候选码。 超码:关系R的全体属性U部分函数依赖于R中的属性(集)K,则K是R的超码。 主码、主属性、非主属性、全码的概念见第2章。 3、范式: 范式:关系数据库中关系需要满足的要求称为范式,根据要求的程度可以将范式分为1NF、2NF、3NF、BCNF、4NF、5NF(范围依次缩小)。 规范化:低级范式转换成高级范式的过程称为规范化,方法为模式分解。 1NF:关系的每一个分量具有原子性,不能再分割。 4、2NF 2NF:满足1NF且每一个非主属性完全函数依赖于任何一个候选码。 这个关系模式不是2NF,就会产生以下问题: (1)插入异常。如果插入一个学生(Sdept,Sdept,Sloc),但该学生并未选课没有课程号Cno,这样的元组就无法插入S-L-C中。 (2)删除异常。某个学生只选了一门课,如果现在要删除这门课,就必须连带整个元组删除。 (3)修改复杂。某个学生转专业,本来只需修改Sdept,但Sloc函数依赖于Sdept,所以要连带修改住处Sloc。如果学生选了多门课,Sdept和Sloc冗余度大,修改次数成倍增长。 模式分解方法:用投影分解把关系模式转换成两个关系模式。 5、3NF 3NF:1NF,不存在码X,属性组Y和非主属性Z(Z不包含Y),使得Z函数依赖于Y,Y函数依赖于X。 3NF的必要条件:没有传递函数依赖,没有部分函数依赖,是2NF。注意,定义里没有说Y不包含X,如果有部分函数依赖,就一定存在定义里面的X,Y,Z,如上面的Sno->(Sno,Cno)->Sdept。 模式分解方法:分解传递依赖。 6、BCNF BCNF:1NF,Y非平凡函数依赖于X时X必有码。 BCNF的必要条件:3NF、主属性不函数依赖于非主属性。 显然,全码一定是BCNF。 7、多值依赖 多值依赖:关系模式R(U),X、Y、Z是U的子集,且Z=U-X-Y。多值依赖X->->Y成立当且仅当对R(U)的任一关系r,给定(x, z),有一组Y的值,这组值仅决定于x值而与z值无关。这里的“无关”应该理解为,将R按X属性值分组,在每一组中对于任意z,z的象集都相等。 平凡的多值依赖:Y多值依赖于X且Z为空集。 多值依赖的性质: (1)对称性:若X->->Y则X->->Z,Z=U-X-Y。 (2)传递性:若X->->Y,Y->->Z,则X->->Z-Y。 (3)函数依赖可以看成特殊的多值依赖。 (4)若X->->Y,X->->Z,则X->->YZ。 (5)若X->->Y,X->->Z,则X->->Y∩Z。 (6)若X->->Y,X->->Z,则X->->Y-Z,X->->Z-Y。 多值依赖与函数依赖的区别: (1)多值依赖的有效性与属性集的范围有关。 (2)如果Y函数依赖于X,则Y的非空真子集也函数依赖于X。但是如果Y多值依赖于X,却不能断言Y的非空真子集也多值依赖于X。 8、4NF 4NF:1NF,如果对于R的每个非平凡多值依赖X->->Y(Y⊈X),X都含有码,则称关系模式满足4NF。 4NF必要条件:限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。 9、规范化小结 关系模式的规范化过程是通过对关系模式的分解来实现的,即把低一级的关系模式为若干个高一级的关系模式。
模式分解的三个定义:
分解具有无损连接性分解要保持函数依赖分解既要保持函数依赖,又要具有无损连接性数据库设计的一般定义:指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的需求,包括信息管理需求和数据操作需求。 1、数据库设计的特点: 三分技术,七分管理,十二分基础数据 结构设计和处理设计相结合 2、数据库设计方法(略) 3、数据库设计基本步骤 需求分析阶段->概念结构设计阶段->逻辑结构设计阶段->物理结构设计阶段->数据库实施阶段->数据库运维 需求分析阶段:数字字典、全系统中数据项、数据结构、数据流、数据存储的描述 概念结构设计阶段:概念模型(E-R图)、数据字典 逻辑结构设计阶段:关系模式转换 物理结构设计:存储结构、存取方式、存取路径建立 数据库实施:创建数据库、装入数据、数据库试运行 数据库运维:性能监测、转储/恢复、数据库重组和重构
数据字典:关于数据库中数据的描述,即元数据。需求分析阶段建立,设计过程中完善。数据字典通常包括数据项、数据结构、数据流、数据存储、处理过程。
1、概念模型(略) 2、E-R模型 实体之间的联系:一对一、一对多、多对多 E-R图:实体、属性、联系 3、扩展E-R图(略) 4、uml(略) 5、概念结构设计 实体与属性划分原则:能作为属性就作为属性,属性不能再有属性,属性不能与其他实体有联系 E-R图的集成:合并->修改与重构 合并时的冲突:属性冲突、命名冲突、结构冲突
属性冲突:域冲突和单位冲突,协商解决命名冲突:同名异义、一义多名,协商解决结构冲突:同一对象一个是实体一个是属性,统一抽象;属性个数和排列不同,统一属性;联系类型不同,综合调整。消除冗余:数据字典+数据流图或采用规范化理论
1、关系模型转换 转换方法:
一对一联系:任意一端合并或转换为独立的关系模式一对多联系:n端合并或转换为独立的关系模式多对多联系:转换为独立的关系模式三元联系:转换为独立的关系模式具有相同码的关系模式可合并2、数据模型的优化 数据模型优化的方法: (1)确定数据依赖; (2)对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系; (3)按照数据依赖的理论对关系模式逐一进行分析,考察是否存在部分函数依赖、传递函数依赖、多值依赖等,确定各关系模式分别属于第几范式; (4)根据需求分析阶段得到的处理要求分析对于这样的应用环境这些模式是否合适,确定是否要对某些模式进行合并或分解; (5)对关系模式进行必要分解,提高数据操作效率和存储空间利用率。常用的两种分解方法是水平分解和垂直分解。 水平分解是把(基本关系)的元组分为若干子集合,定义每个子集合为一个子关系,以提高系统的效率。根据“二八原则”把经常使用的数据分解出来,形成一个子关系。 垂直分解是把关系模式R的属性分解为若干子集合,形成若干子关系模式。垂直分解的原则是将经常在一起使用的属性从R中分解出来形成一个子关系模式。垂直分解需要确保无损连接性和保持函数依赖 3、设计用户子模式(略)
数据库的物理设计:为一个给定的逻辑数据模型选取一个最适合应用要求的物理结构的过程,就是数据库的物理结构。 数据库的物理结构设计通常分两步走: (1)确定数据库的物理结构; (2)对物理结构进行评价。 1‘、数据库物理设计的内容和方法 目标:事务响应时间小、存储空间利用率高、事务吞吐量大。 关系数据库物理设计的内容主要包括:为关系模式选择存取方法,以及设计关系、索引等数据库文件的物理存储结构。 2、关系模式存取方法选择 常用的存取方法:索引方法、聚簇方法 常用的索引方法:B+树索引、hash索引 (1)B+树索引存取方法的选择 建立索引的原则:属性经常出现在出查询条件中、属性经常作为聚簇函数的参数、属性经常在连接操作的连接条件中出现、更新频率较高的关系不能建立太多索引。 (2)hash索引存取方法的选择 选择hash存取方法的原则:关系属性主要出现在等值连接条件或等值比较选择条件中,而且满足以下两个条件,则此关系可以选择hash存取方法。 ①一个关系的大小可预知,而且不变; ②关系的大小动态改变,但DBMS提供了动态hash存取方法。 (3)聚簇存取方法的选择 聚簇:把具有相同属性值的元组放在连续的物理块中称为聚簇,该属性(组)称为聚簇码。 特点:提高查询效率、适用于单个或多个关系、一个关系只能加入一个聚簇。 候选聚簇的原则:经常一起进行连接操作的关系、关系属性经常出现在相等比较条件中、关系在某个属性上冗余度高 聚簇方法排除原则:经常全表扫描的关系、更新操作多于连接、加入其他聚簇的关系 聚簇的局限性:只能提高某些应用的性能、开销大、所有索引失效、改变聚簇码需要维护开销 3、确定数据库的存储结构 内容:存放位置和存储结构 指标:存取时间、存储空间利用率、维护代价
1、处理过程 含嵌入式SQL主语言程序->预处理,将嵌入式SQL翻译为主语言函数调用->转换后的主语言程序->编译链接 2、嵌入式SQL语句与主语言之间的通信 数据库工作单元与源程序工作单元之间的通信包括: (1)向主语言传递SQL语句执行状态信息,主要使用SQL通信区; (2)主语言向SQL语句提供参数,主要用主变量实现; (3)将SQL语句的查询结果提交给主语言,主变量和游标实现。 SQL通信区:SQL语句执行后的执行状态信息通过SQL通信区传递给主语言,主语言根据这些信息决定接下来执行的语句。 主变量:SQL语句中使用的主语言程序变量简称为主变量,分为输入主变量和输出主变量。指示变量是主变量附带的一个整型变量,指示输入主变量是否为空,检测输出主变量是否为空。 游标:游标是系统为用户开设的一个数据缓冲区,存放SQL语句执行的结果,每个游标区都有一个名字,用户通过游标逐一获取记录并赋给主变量。 程序实例
EXEC SQL BEGIN DECLARE SECTION;/*主变量说明开始*/ char deptname[20]; char hsno[9]; char hsname[20]; char hssex[2]; int HSage; int NEWAGE; EXEC SQL END DECLARE SECTION;/*主变量说明结束*/ long SQLCODE; EXEC SQL INCLUDE SQLCODE;/*定义SQL通信区*/ int main(void){/*C语言主程序开始*/ int count = 0; char yn; printf("Please choose the department name(cs/ma/is):"); scanf("%s",&deptname); EXEC SQL CONNECT TO TEST@localhost:54321 USER "SYSTEM"/"MANAGER";/*连接数据库TEST*/ EXEC SQL DECLARE SX CURSOR FOR/*定义游标SX*/ SELECT Sno,Sname,Ssex,Sage FROM Student WHERE Sdept=:deptname;/*SX对应的语句*/ EXEC SQL OPEN SX;/*开启游标,指向查询结果的第一行*/ while(1){/*逐行处理查询的结果*/ EXEC SQL FETCH SX INTO:HSno,:HSname,:HSsex,:HSage;/*推进游标,将当前结果放入主变量*/ if(SQLCA.SQLCODE!=0) break;/*SQLCODE记录操作状态,成功或失败*/ if(count++==0) printf("\n%-10s %-20s %-10s %-10s\n","Sno","Sname","Ssex","Sage");/*打印表头*/ printf("%-10s %-20s %-10s %-10d\n",HSno,HSname,HSsex,HSage);/*输出结果*/ printf("UPDATE AGE(y/n)?"); do{ scanf("%c",&yn); }while(yn!='N'&&yn!='n'&&yn!='Y'&&yn!='y'); if(yn=='Y'||yn=='y'){ printf("INPUT NEW AGE:"); scanf("%d",&NEWAGE);/*输入新年龄到主变量中*/ EXEC SQL UPDATE Student/*SQL更新语句*/ SET Sage=:NEWAGE WHERE CURRENT OF SX;/*对当前游标指向的学生进行更新*/ } } EXEC SQL CLOSE SX;/*关闭游标,不再与查询结果对应*/ EXEC SQL COMMIT WORK;/*提交更新*/ EXEC SQL DISCONNECT TEST;/*断开数据库连接*/ return 0; }3、不用游标的SQL语句(略) 4、使用游标的SQL语句(略) 5、动态SQL|(略)
1、过程化SQL的块结构
DECLARE /*定义的变量、常量只能块中使用*/ 变量、常量、游标、异常等 BEGIN SQL语句、PL/SQL语句 EXCEPTION 异常处理部分 END;2、变量和常量的定义
变量名 数据类型 [[NOT NULL]:=初值表达式]/*定义变量*/ 变量名 数据类型 [[NOT NULL] 初值表达式]/*定义变量*/ 常量名 数据类型 CONSTANT:=常量表达式/*定义常量*/ 变量名:=表达式/*赋值*/3、流程控制
IF condition THEN statements; END IF IF condition THEN statements1; ELSE statements2; END IF; LOOP statements;/*使用EXIT、BREAK或LEAVE退出循环*/ END LOOP; WHILE condition LOOP statements; END LOOP; FOR count IN [REVERSE] lower_bound .. upper_bound LOOP statements END LOOP;1、存储过程 存储过程的优点:编译运行效率高、降低C/S之间通信量、集中控制方便维护 存储过程的用户接口: (1)创建存储过程
CREATE OR REPLACE PROCEDURE 过程名([参数1, 参数2, ...]) AS 过程化SQL块注解:ROLLBACK表示回滚事务 (2)执行存储过程
CALL/PERFORM PROCEDURE 过程名([参数1, 参数2, ...]);(3)修改存储过程
ALTER PROCEDURE 过程名1 RENAME TO 过程名2;/*重命名*/ ALTER PROCEDURE 过程名 COMPILE;(4)删除存储过程
DROP PROCEDURE 过程名();2、函数 (1)函数的定义语句格式
CREATE OR REPLACE FUNCTION 函数名([参数1, 参数2, ...]) RETURNS 类型 AS 过程化SQL块(2)函数的执行语句格式
CALL/SELECT 函数名([参数1, 参数2, ...]);(3)修改函数
ALTER FUNCTION 函数名1 RENAME 函数名2; ALTER FUNCTION 函数名 COMPILE;3、过程化SQL中的游标 当查询返回多条记录时,使用游标对结果集进行处理。一个游标与一个SQL语句相关联。在存储过程中可以定义普通游标、REFCURSOR类型游标、带参数的游标等。
CREATE OR REPLACE PROCEDURE proc_cursor() AS DECLARE cno CHAR(3); cname CHAR(8); CURSOR mycursor(leaderno CHAR(3)) FOR SELECT lno,lname FROM leader WHERE Lno=leaderno; BEGIN OPEN mycursor('L01'); FETCH mycursor INTO cno,cname; INSERT INTO temp(lno,lname) VALUES(cno,cname); CLOSE mycursor; OPEN mycursor('L02'); FETCH mycursor INTO cno,cname; INSERT INTO cno,cname; INSERT INTO temp(lno,lname) VALUES(cno,cname); CLOSE mycursor; END查询优化一般可分为代数优化(逻辑优化)和物理优化(非代数优化)
1、查询处理步骤 查询处理步骤:查询分析、查询检查、查询优化、查询执行 查询分析:语句扫描、词法分析、语法分析 查询检查:语义检查、视图消解、存取权限检查、转换成等价的关系代数并构建语法分析树 查询优化:代数优化和物理优化 查询执行:生成查询执行计划、由代码生成器执行查询计划并返回查询结果 2、实现查询优化的算法举例 (1)选择操作的实现 简单全表扫描算法 索引扫描算法 (2)连接操作实现 嵌套循环算法:类似于二重循环 排序合并算法:先排序再查找。常用于等值连接。 索引连接算法:通过索引查找元组然后连接 hash join算法:第一步,划分阶段,对包含元组较少的表进行散列;第二步,试探阶段,对另一个表用相同的散列函数进行处理,把hash值相同的元组进行匹配。处理等值连接。
1、查询优化概述 查询优化的优点是用户不再需要考虑如何表达查询可以达到最高的效率。 总代价=I/O代价+CPU代价+内存代价+通信代价 2、一个实例 题目:求选取了2号课程的学生姓名 SQL表达:
SELECT Student.Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno='2';关系代数表达: Q1=ΠSname(σStudent.Sno=SC.Sno∧SC.Cno=‘2’(Student×SC)) Q2=ΠSname(σSC.Cno=‘2’(Student⋈SC)) Q3=ΠSname(Student⋈σSC.Cno=‘2’(SC)) 查询效率分析: 假设学生-课程表数据库中有1000个学生记录,10000个选课记录,其中选修2号课程的选课记录为50个。一个块能够装10个Student元组或100个SC元组,在内存中存放5块Student元组和1块SC元组,每块能装连接后的元组10块。 (1)第一种情况: 计算广义笛卡尔积:读取1000/10+1000/(10*5)*10000/100=2100块,连接后元组107个写出106块。 选择操作:读入106块。 投影操作:把上一步结果投影输出即可。 总读写数据块=2100+106+106 (2)第二种情况: 计算自然连接:读取1000/10+1000/(10*5)*10000/100=2100块,连接后元组104个写出103块。 选择操作:读入103块。 投影操作:把上一步结果投影输出即可。 总读写数据块=2100+103+103 (3)第三种情况: 选择操作:读取一遍SC表,共计100块;满足条件的块只有50个不必写入中间文件。 连接操作:读取Student表,共计100块,把读入的元组和内存中的SC元组作连接。 投影操作:把上一步结果投影输出即可。 总读写数据块=100+100=200
1、关系代数表达式等价变换规则 连接、笛卡尔积交换律与结合律、投影与选择串接定律、选择与投影可以交换次序、选择对笛卡尔积的分配律、选择对并、差、自然连接的分配律、投影对笛卡尔积和并的分配律 2、查询树的启发式优化 先选择;投影与选择同步;逆用分配律减少投影次数;选择与连接的合并;找出公共子表达式。 重在例题。
物理优化的方法:基于规则的启发式优化、基于代价估算的优化、两者结合的优化 1、基于启发式规则的存取路径选择优化 (1)选择操作的启发式优化: 对于小关系全表扫描 对于大关系,启发式规则有:
选择条件启发式规则主码=值主码索引非主属性=值索引扫描/全表扫描(估算结果>10%)非等值条件/范围查询索引扫描/全表扫描(估算结果>10%)AND连接的合取条件优先组合索引,索引扫描次之,如果选择率>10%全表扫描OR连接的析取条件全表扫描(2)连接操作的启发式规则 已排序->排序合并算法; 有索引->索引连接算法; 其中一个表较小->hash join算法; 嵌套循环算法垫底。 2、基于代价估算的优化(略)
1、事务 事务:用户定义的一个数据库操作序列,这些操作要么全做,要么全都不做,是一个不可分割的工作单位。 定义事务的语句:
BEGIN TRANSACTION; COMMIT;/*提交事务的全部操作*/ ROLLBACK;/*回滚,事务中对数据库的所有已完成操作全部撤销*/2、事务的ACID特性 (1)原子性:事务中的操作要么都做要么都不做。 (2)一致性:事务执行是一致性状态的切换,事务中断会造成不一致。 (3)隔离性:事务与事务相互独立。 (4)持续性:一经提交永久改变。
数据库的恢复:把数据库从错误状态恢复到一致性状态的过程
1、故障的种类 (1)事务内部故障:非预期不可控,撤销(UNDO)处理。 (2)系统故障(软故障):造成系统停摆需要重启的事件,不破坏数据库但会丢失内存中数据,重做(REDO)处理。 (3)介质故障(硬故障):存储介质故障,破坏数据库,仅能通过备份恢复。 (4)计算机病毒:人为破坏,需要信息安全技术支持。 2、恢复的基本原理:冗余
建立冗余的技术:数据转储、登记日志文件 1、数据转储:定期将数据库拷贝到后备副本,数据库被破坏后可将数据库恢复到转储时的状态。静态转储在无事务时进行,只拷贝不修改;动态转储期间允许对数据库的修改,需要日志文件。海量转储指每次都全部转储数据库,增量转储指只转储更新的部分。 2、登记日志文件 日志文件的格式与内容:登记内容包括事务的开始、结束和所有更新操作;记录内容包括事务标识、操作类型、操作对象、旧值和新值。 日志文件的作用:事务和系统故障恢复的依据,动态转储必须建立日志文件以便结合后备副本恢复数据库,静态转储中可创建日志文件以提高恢复效率。 登记日志文件二原则:严格时间顺序、先写日志后写数据库
1、事务故障的恢复:反向扫描+逆操作 2、系统故障的恢复:正向扫描,已写的重做,未写的撤销 3、介质故障的恢复:重装数据库、重做完成的事务,DBA介入
周期性设置检查点保存数据库状态,恢复时扫描日志到检查点为止。
事务执行方式:串行执行、交叉并发、同时并发
并发操作的不一致性:丢失修改、不可重复读、读脏数据。 并发控制的主要技术:封锁、时间戳、乐观控制法、多版本并发控制
封锁类型:排他锁(写锁,X锁)、共享锁(读锁、S锁)。
XS-XNNYSNYY-YYY Y=Yes,表示相容,N=No,表示不相容一级封锁协议:加X锁——修改——事务结束——释放X锁 二级封锁协议:加S锁——读取——读取结束——释放S锁 三级封锁协议:加S锁——读取——事务结束——释放S锁
1、活锁:事务总是处于等待状态,采用先来先服务策略避免活锁 2、死锁:互斥、请求与保持、不可剥夺、循环等待 (1)死锁的预防:一次封锁、顺序封锁 (2)死锁的诊断与解除:超时法、等待图法
1、可串行化调度 可串行化调度:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务的结果相同,称这种调度策略为可串行化调度。可串行性是并发事务正调度的准则。 2、冲突可串行化调度 冲突操作:不同的事务对同一个数据的读-写操作和写-写操作。 冲突可串行化调度:一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc’,如果Sc’是串行的,称Sc为冲突可串行化的调度。 判断可串行化调度的充分条件:若一个调度是冲突可串行化,则一定是可串行化的调度。
两段锁协议:读写操作先加锁、释放后不再加锁 “两段锁”的含义:扩展阶段获得封锁,收缩阶段释放封锁 若并发事务都遵守2PL协议,则对这些事务的任何并发调度策略都是可串行化的。
1、多粒度封锁 封锁的粒度就是封锁对象的大小,封锁粒度与系统并发度和并发控制的开销密切相关。 多粒度封锁:一个系统同时支持多种粒度的封锁。 多粒度树: 多粒度封锁协议:允许每个节点独立加锁,对节点加锁意味着该节点子树节点加同类锁。显示封锁,直接加到数据对象上的锁,隐式封锁,因为父节点加锁而被加锁。检查封锁冲突时既要向上检查,又要向下检查。有了意向锁就无需向下检查。 2、意向锁 意向锁:节点加意向锁,说明下层节点正在被加锁;任一节点加锁必须给它的上层节点加锁。 三种常用意向锁:意向共享锁(IS锁)、意向排他锁(IX锁)、共享意向排他锁(SIX)。 节点加IS锁表示后裔节点拟加S锁,节点加IX锁表示后裔节点拟加X锁,节点加SIX锁表示对它加S锁再加IX锁。
