赞
踩
目录
用户标识与鉴别(Identification & Authentication)
1.数据(Data)
数据是数据库中存储的基本对象。定义为描述事务的符号记录。数据的含义称为语义,数据与其语义是不可分的。
2.数据库(DataBase,DB)
长期存储在计算机内,有组织的,可共享的大量数据的集合。
数据库基本特征:1.永久存储 2.有组织 3.可共享 4.冗余度小 5.易扩展
3.数据库管理系统(DataBase Management System,DBMS)
位于用户与操作系统之间的一层数据管理软件
数据库管理系统和操作系统一样是计算机的基础软件。
主要功能:提供数据定义语言(DDL)、数据操纵语言(DML)等
4.数据库系统(DataBase System,DBS)
数据库系统由数据库(DB),数据库管理系统(DBMS),应用程序和数据库管理员(DBA)组成的存储、管理、处理和维护数据的系统。
1.人工管理阶段:
在计算机出现之前,人们运用常规的手段从事记录、存储和对数据加工,也就是利用纸张来记录和利用计算工具(算盘、计算尺)来进行计算,并主要使用人的大脑来
管理和利用这些数据。
特点:
(1)计算机系统不提供对用户数据的管理功能;
(2)数据不能共享;
(3)不保存数据。
2.文件系统阶段:
在这一阶段(20世纪50年代后期至60年代中期)计算机不仅用于科学计算,还利用在信息管理方面。随着数据量的增加,数据的存储、检索和维护问题成为紧迫的需要,数据结构和数据管理技术迅速发展起来。此时,外部存储器已有磁盘、磁鼓等直接存取的存储设备。软件领域出现了操作系统和高级软件。操作系统中的文件系统是专门管理外存的数据管理软件,文件是操作系统管理的重要资源之一。
特点:
数据以“文件”形式可长期保存在外部存储器的磁盘上。由于计算机的应用转向信息管理,因此对文件要进行大量的查询、修改和插入等操作,这些操作由文件系统提供。
缺点:
数据冗余;不一致性;数据独立性差。
3.数据库系统阶段:
20世纪60年代后期以来 ,计算机性能得到进一步提高,更重要的是出现了大容量磁盘,存储容量大大增加且价格下降。在此基础上,才有可能克服文件 系统管理数据时的不足,而满足和解决实际应用中多个用户、多个 应用程序共享数据的要求,从而使数据能为尽可能多的 应用程序服务,这就出现了数据库这样的数据管理技术。
特点:
(1)数据结构化。
(2)数据共享性高、冗余少且易扩充。
(3)数据独立性高。
(4)数据由DBMS统一管理和控制。
一、数据模型的分类
1.概念模型
按用户的观点来对数据和信息建模,主要用于数据库设计
概念模型的表示方法很多,最常用的为实体-联系方法(Entity-Relationship approach),该方法用E-R图来描述概念模型。E-R方法也成为E-R模型
2.逻辑模型和物理模型
逻辑模型主要包括层次模型、网状模型、关系模型、面向对象模型和对象关系数据模型等,主要用于数据库管理系统的实现。
物理模型是对数据最底层的抽象,它描述数据在系统内部的表示方法和存取方法,在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。
二、数据模型的组成要素
数据模型通常由数据结构、数据操作和完整性约束三个部分组成。
数据结构描述数据库的组成对象以及对象之间的联系,通常按其数据结构的类型来命名数据模型,例如层次结构、网状结构和关系结构的数据模型分别命名为层次模型、网状模型、关系模型。
数据操作是指对数据库中各种对象的实例允许执行的操作的集合,包括操作及其有关的规则,主要分为查询和更新(插入、删除、修改)两大类操作。
完整性约束条件是给定的数据模型中数据及其联系所具有的制约和依存规则,在关系模型中体现为实体完整性和参照完整性。例如,某大学的数据库中规定学生成绩如果有6门以上不及格则不能授予学士学位,教授的退休年龄是65周岁等。
非关系模型:层次模型(Hierarchical Model)、网状模型(Network Model)
关系模型(Relational Model)
层次模型,满足下面两个条件的基本层次联系的集合为层次模型(就是树结构):
①有且只有一个结点没有双亲结点,这个结点称为根结点
②根以外的其它结点有且只有一个双亲结点
网状模型,满足下面两个条件的基本层次联系的集合(一对多关系,结构上像有向图):
①允许一个以上的结点无双亲;
②一个结点可以有多于一个的双亲。
关系模型术语:
1.关系:一个关系对应通常说的一张表。
2.属性:表中的一列即为一个属性。
3.域:属性的取值范围。
4.元组:表中的一行即为一个元组。
5.码:也称码键。表中的某个属性组,它可以唯一确定一个元组。
6.分量:元组中的一个属性值。
7.关系模式:对关系的描述,一般表示为 关系名(属性1,属性2,.....,属性n)
实体-联系方法(Entity-Relationship Approach)是概念模型的一种表示方法,其提供了表示实体型、属性和联系的方法。
实体型:用矩形表示,矩形框内写明实体名
属性:用椭圆表示,并用无向边将其与相应的实体型连接起来
联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时标明联系的类型(1:1, 1:n, m:n)
比如有两个简单实体,分别是单位和职员,它们的关系就是1:m,一个单位可以有多个职员;
再比如有两个实体,分别是学生和图书,它们的关系就是m:n,从而形成中间表学生借阅的图书,结果是1本图书可以被多人借阅,1个人也可以借多本图书。
数据库系统的三级模式结构:模式(Schema)、外模式(External Schema)、内模式(Internal Schema)
模式(也称逻辑模式):
①数据库中全体数据的逻辑结构和特征的描述
②所有用户的公共数据视图,综合了所有用户的需求
模式的地位:是数据库系统模式结构的中间层
①与数据的物理存储细节和硬件环境无关
②与具体的应用程序、开发工具及高级程序设计语言无关
外模式(也称子模式或用户模式):
①数据库用户(包括应用程序员和最终用户)使用的局部数据的逻辑结构和特征的描述
②数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
外模式的用途:①保证数据库安全性的一个有力措施 ②每个用户只能看见和访问所对应的外模式中的数据
内模式(也称存储模式):
①是数据物理结构和存储方式的描述
②是数据在数据库内部的表示方式:
a. 记录的存储方式(顺序存储,按照B树结构存储,按hash方法存储)
b. 索引的组织方式
c. 数据是否压缩存储
d. 数据是否加密
e. 数据存储记录结构的规定
由之前的内容直到,关系模型是由关系数据结构、关系操作集合、关系完整性约束三部分组成的,所以要了解对于关系模型这三部分的含义
关系模型是建立在集合代数的基础上的,因此从集合论角度给出关系数据结构的形式化定义。
1.域(Domain):域是一组具有相同数据类型的值的集合,例如整数、自然数都是域
2.笛卡尔积(Cartesian Product):笛卡尔积是域上面的一种集合运算。
给定一组域D1,D2,…,Dn,允许其中某些域是相同的。 D1,D2,…,Dn的笛卡尔积为:
笛卡尔积中每个元素(d1,d2,…dn)称为一个n元组或简称元组
笛卡尔积可表示为一个二维表,表中每行对应一个元组,表中每一列的值来自一个域
例如,给出3个域:
D1=导师集合SUPERVISOR={张清玫,刘逸}
D2=专业集合SPECIALITY={计算机专业,信息专业}
D3=研究生集合POSTGRADUATE={李勇,刘晨,王敏}
D1,D2,D3的笛卡尔积为
3.关系(Relation)
D1×D2×…×Dn的子集叫作在域D1,D2,…,Dn上的关系,
表示为R(D1,D2,…,Dn)
R:关系名
n:关系的目或度(Degree)
关系也是一个二维表,每行对应一个元组,每列对应一个域,每列称为属性
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码(Candidate key)
若一个关系有多个候选码,则选定其中一个或多个为主码(Primary key)
候选码的多个属性称为主属性(Prime attribute),不包含在任何候选码中的属性称为非主属性;最简单的情况下,候选码只包含一个属性,如果关系模式的所有属性都是这个关系的候选码,则称为全码(All-key)
关系模型中常用的关系操作包括查询(Query)操作和插入(Insert)、删除(Delete)、修改(Update)操作这两大部分。
查询操作又分为:选择(Select)、投影(Project)、连接(Join)、除(Divide)、并(Union)、差(Except)、交(Intersection)、笛卡尔积等;其中:选择、投影、并、差、笛卡尔积是5种基本操作,其他操作是可以用基本操作来定义和导出的。
关系模型的完整性规则是对关系的某种约束条件,关系模型中有三类完整性约束:
实体完整性(Entity Integrity):关系模型以主码作为唯一性标识,主码中的属性即主属性不能取空值
参照完整性(Referential Integrity):外码
用户自定义完整性(User-defined Integrity):反映某一具体应用所涉及的数据必须满足的语义要求
并、差、投影、笛卡尔积、选择为五个基本操作,交、连接、除等为附加操作,附加操作可以用五个基本操作表示
选择运算是从关系R中选取使逻辑表达式F为真的元组,是从行的角度进行的运算
如查询信息系(IS系)全体学生
投影操作主要是从列的角度进行运算,但投影成功之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)
如查询学生的姓名和所在系
连接运算的含义:从两个关系的笛卡尔积中选取属性间满足一定条件的元组
等值连接:θ为’=’的连接运算称为等值连接,即选取属性相等的元组
自然连接:特殊的等值连接,两个关系中进行比较的分量必须是相同的属性组,在结果中要把重复的属性列去掉
一般的连接操作是从行的角度进行运算的,自然连接还需要取消重复列,所以是同时从行和列的角度进行运算
例如:
可以先得到两个关系的笛卡尔积,然后筛选出C < E的
自然连接是特殊的等值连接,相同的属性组进行比较,并去除重复的属性列。即笛卡尔积里找出B相等的然后合并R.B和S.B为B
悬浮元组与外连接
两个关系R和S在做自然连接时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,这些被舍弃的元组称为悬浮元组。
外连接(OUTER JOIN)
如果把悬浮元组也保存在结果关系中,而在其他属性上填空值(Null),就叫做外连接
左外连接(LEFT OUTER JOIN或LEFT JOIN):只保留左边关系R中的悬浮元组
右外连接(RIGHT OUTER JOIN或RIGHT JOIN):只保留右边关系S中的悬浮元组
除操作是同时从行和列的角度进行运算的
在SQL中一个关系就对应一个基本表,一个(或多个)基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中。
存储文件的逻辑结构组成了关系数据库的内模式
视图是从一个或几个基本表导出的表,它本身不独立存储在数据库中,这些数据仍存放在导出视图的基本表中
1.索引:建立索引是加快查询速度的有效手段,用户(数据库管理员或建表者)可以在基本表上建立一个或多个索引,以提供多种存取路径,系统在存取数据时会自动选择合适的索引作为存取路径。
索引是关系数据库的内部实现技术,属于内模式的范畴。
唯一索引:使用UNIQUE关键字,每个索引值对应唯一一条数据记录
非唯一索引:不使用UNIQUE关键字
聚簇索引:指索引项的顺序与表中记录的物理顺序一致的索引组织,可以在最经常查询的列上建立聚簇索引,对于经常更新的列不宜建立聚簇索引。一个表只能建立一个聚簇索引,一般默认是主键,所谓“与记录的物理顺序一致”即该记录升序索引也升序之类的?
2.视图:视图是从一个或几个基本表(或视图)导出的表,数据库只存放视图的定义而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中数据发生变化,从视图查询出的数据也会随之改变。
视图的作用:
①简化用户的操作:用户所做的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无须了解。
②使用户能以多种角度来看待同一数据:当许多不同种类的用户共享同一个数据库时,这种灵活性是非常有必要的。
③对重构数据库提供了一定的逻辑独立性:即使重构数据库也不一定需要修改应用程序。
④能够对机密数据提供安全保护:只允许用户查询提供给他的视图而不是直接查询表,可以隐藏表中的机密数据
⑤适当的利用视图可以更清晰地表达查询语句:利用视图来表达查询语句
SQL数据定义语句
操作对象 | 操作方式 | ||
创建 | 删除 | 修改 | |
模式 | CREATE SCHEMA | DROP SCHEMA |
|
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW |
|
索引 | CREATE INDEX | DROP INDEX |
|
create database 数据库名 [其他选项];
例如我们需要创建一个名为 samp_db 的数据库, 在命令行下执行以下命令:
create database samp_db character set gbk;
为了便于在命令提示符下显示中文, 在创建时通过 character set gbk 将数据库字符编码指定为 gbk。
drop database 数据库名 删除数据库
create table student(
id int auto_increment primary key,
name varchar(50),
sex varchar(20),
date varchar(50),
content varchar(100)
)default charset=utf8;
【说明】
DATATYPE --数据类型,mysql有bit int decimal float varchar char date datetime
NUT NULL --可不可以允许资料有空的
PRIMARY KEY --是本表的主键
CONSTRAINT --是对表里的字段添加约束.(约束类型有Check,Unique,Primary key,not null,Foreign key);
删除表:drop table student
修改表:
#表结构修改
create table test
(
id int not null auto_increment primary key, #设定主键
name varchar(20) not null default 'NoName', #设定默认值
department_id int not null,
position_id int not null,
unique (department_id,position_id) #设定唯一值
);
#修改表的名字
#格式:alter table tbl_name rename to new_name
alter table test rename to test_rename;
#向表中增加一个字段(列)
#格式:alter table tablename add columnname type;/alter table tablename add(columnname type);
alter table test add columnname varchar(20);
#修改表中某个字段的名字
alter table tablename change columnname newcolumnname type; #修改一个表的字段名
alter table test change name uname varchar(50);
select * from test;
#表position 增加列test
alter table position add(test char(10));
#表position 修改列test
alter table position modify test char(20) not null;
#表position 修改列test 默认值
alter table position alter test set default 'system';
#表position 去掉test 默认值
alter table position alter test drop default;
#表position 去掉列test
alter table position drop column test;
#表depart_pos 删除主键
alter table depart_pos drop primary key;
#表depart_pos 增加主键
alter table depart_pos add primary key PK_depart_pos
(department_id,position_id);
主键具有唯一性,能够唯一标识表中的一个单独的行
定义外键是为了确保这一列的值是有效的(比如说该列为该表与另一个表“共同使用”的列,那么需要保证其“确实存在”,即在另一个表中有对应的值才能进行相关操作)
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
语义:根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标表达式,选出元组中的属性值形成结果表。
如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组称为一个组。如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才予以输出。
如果有ORDER BY子句,则结果表还要按<列名 2>的值的升序或降序排列
1.选择表中的若干列
SELECT Sno,Sname FROM Student
SELECT * FROM Student
SELECT Sname, 2014 – Sage FROM Student /* 查询结果的第2列是一个算术表达式,表中会得到2014 – Sage的值 */
SELECT Sname NAME, ‘Year of Birth’: BIRTH, 2004 – Sage BIRTHDAY, LOWER(Sdept) DEPARTMENT /* 可以通过指定别名来改变查询结果的列标题,Sname列名会变为NAME */
2.选择表中的若干元组
①SELECT DISTINCT Sno FROM SC /* 使用DISTINCT关键字消除重复的行 */
②使用WHERE查询满足条件的元组
查 询 条 件 | 谓 词 |
比 较 | =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符 |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN,NOT IN |
字符匹配 | LIKE,NOT LIKE |
空 值 | IS NULL,IS NOT NULL |
多重条件(逻辑运算) | AND,OR,NOT |
SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 33
/* 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别、年龄 */
SELECT Sname, Ssex FROM Student WHERE Sdept IN (‘CS’, ‘MA’, ‘IS’)
/* IN用于查找属性值属于指定集合的元组,即Sdept等于’CS’ ‘MA’ ‘IS’中的一个即可 */
字符匹配:[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
语义:查找指定的属性列值与<匹配串>相匹配的元组,ESCAPE用于对通配符的转义,如WHERE Cname LIKE ‘DB\_Design’ ESCAPE ‘\’
/* 将\定义为转义字符,这样匹配的就是’DB_Design’,即’_’失去了通配符的含义 */
注:数据库字符集为ASCII时一个汉字需要两个_,字符集为GBK时只需要一个
③多重条件查询,逻辑运算符AND 和 OR 可用来联结过个查询条件,AND的优先级高于OR,但可用括号改变优先级
SELECT Sname FROM Student WHERE Sdept = ‘CS’ AND Sage < 20
3.ORDER BY子句
对查询结果按一个或多个属性列的升序(ASC)或降序(DESC)排列,缺省值为升序
4.聚集函数(系统自带函数?)
COUNT(*) 统计元组个数
COUNT([DISTINCT|ALL] <列名>) 统计一列中值的个数
SUM([DISTINCT|ALL] <列名>) 计算一列值的总和(此列必须为数值型)
AVG([DISTINCT|ALL] <列名>) 计算一列值的平均值(此列必须为数值型)
MAX([DISTINCT|ALL] <列名>) 求一列中的最大值
MIN([DISTINCT|ALL] <列名>) 求一列中的最小值
如果指定DISTINCT短语,则表示在计算时取消指定列中的重复值,ALL为缺省值,表示不取消重复值
SELECT COUNT(*) FROM Student /* 查询学生总人数 */
5.GROUP BY子句
GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组;分组的目的是为了细化聚集函数的作用对象,如果未对查询结果分组,聚集函数将作用于整个查询结果分组后聚集函数将作用于每一个组,即每一个组都有一个函数值
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) > 3
这里先用GROUP BY 子句按Sno进行分组,再用聚集函数COUNT对每一个组计数,HAVING短语给出了选择组的条件。
另外,注意WHERE子句与HAVING子句的作用对象,WHERE子句作用于基本表或视图,从中选择满足条件的元组;HAVING短语作用于组,从中选择满足条件的组
如下面的语句是不对的:
SELECT Sno, AVG(Grade) FROM SC
WHERE AVG(Grade) >= 90 GROUP BY Sno;
正确的语句
SELECT Sno, AVG(Grade) FROM SC
GROUP BY Sno HAVING AVG(Grade) >= 90
若一个查询同时涉及两个以上的表,则称之为连接查询
1.等值与非等值连接查询
连接查询的WHERE子句中用来连接两个表的条件称为链接条件或连接谓词,其一般格式如下:
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
运算符为 = 时称为等值连接,否则称为非等值连接
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
2.自身连接
需要取两个表名
SELECT FIRST.Cno, SECOND.Cpno
FROM Course FIRST, Course SECOND
WHERE FIRST.Cpno = SECOND.Cno
3.外连接
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student LEFT OUT JOIN SC ON(Student.Sno = SC.Sno)
4.复合条件连接
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
嵌套查询和集合查询
在子查询中,程序先运行在嵌套在最内层的语句,再运行外层。因此在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,再一层层往外测试,增加子查询正确率。否则多层的嵌套使语句可读性很低
exists的返回结果是bool型,只有true或者false
如 SELECT * FROM alumni_info t WHERE EXISTS(SELECT a_id FROM alumni_education e WHERE e.a_id='6588' ),返回的结果跟SELECT * FROM alumni_info t一样(a_id=6588存在),因为select语句先执行where条件后的语句,再筛选字段,当执行完where条件后,若这条结果集存在,则where表达式后面永远都是true,否则为false。也就是说要么查询所有,要么没有数据。
注意:子查询的SELECT语句中不能使用ORDER BY 子句,ORDER BY子句只能对最终查询结果排序
子查询的查询条件依赖于父查询,则称这类子查询为相关子查询,否则称不相关子查询。
1.带有IN谓词的子查询
子查询结果往往是一个集合,所以谓词IN是嵌套查询中最常使用的谓词
SELECT Sno, Sname, Sdept FROM Student
WHERE Sdept IN
(SELECT Sdept FROM Student WHERE Sname=’刘晨’)
2.带有比较运算符的子查询
SELECT Sno, Cno
FROM SC x
WHERE Grade >= (SELECT AVG(Grade))
FROM SC y
WHERE y.Sno = x.Sno /* 依赖x.Sno,相关子查询 */
其可能的执行过程:
①从外层查询中取出SC的一个元组x,将元组x的Sno值传送给内层查询
②执行内层查询,得到值88,用该值代替内层查询,得到外层查询
③执行这个查询,得到
(200215121, 1)
(200215121, 3)
④然后外层查询取出下一个元组重复①~③,直到外层的SC元组全部处理完毕
如果是不相关子查询,可以发现其求解顺序是从内向外的。
3.带有ANY(SOME)或ALL谓词的子查询
子查询如果返回多值,就需要使用ANY或ALL谓词,其语义为
> ANY 大于子查询结果中的某个值
> ALL 大于子查询结果中的所有值
……
SELECT Sname, Sage FROM Student
WHERE Sage < ALL (SELECT Sage FROM Student
WHERE Sdept = ‘CS’)
AND Sdept <> ‘CS’;
查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄
执行此查询时,首先处理子查询,找出CS系中所有学生的年龄,构成一个集合(20, 19),然后处理父查询
4.带有EXISTS谓词的子查询
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑值”true”或”false”
若内层查询结果非空,则外层的WHERE子句返回真值,否则返回假值,带EXISTS的子查询一般都是用 *
SELECT Sname FROM Student
WHERE EXISTS
(SELECT * FROM SC WHERE Sno = Student.Sno AND Cno = ‘1’);
其处理过程:首先取外层查询Student表中的第一个元组,根据它与内层查询相关的属性值(Sno)处理内层查询,若WHERE子句返回值为真,则取外层查询中该元组的Sname放入结果表;……
集合操作包括并操作UNION、交操作INTERSECT和差操作EXCEPT,参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同。(相同属性列?)
INSERT通常有两种形式,一种是插入一个元组,另一种是插入子查询结果。后者可一次插入多个元组。
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>] … )
注意:INTO子句中没有出现的属性列,新元组在这些列上将取空值。如果表定义说明了NOT NULL的属性列不能取空值,否则会出错。
如果INTO子句没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值。
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];
修改指定表中满足WHERE子句条件的元组,如果省略WHERE子句,则表示要修改表中所有的元组。
UPDATE Student SET Sage = Sage + 1 /* 将所有学生的年龄增加1岁 */
UPDATE Student SET Sage = 22 WHERE Sno = ‘200215121’
DELETE
FROM <表名>
[WHERE <条件>];
从指定表删除满足WHERE子句条件的所有元组。如果省略WHERE子句,则删除表中全部元组,但表的定义仍在字典中。即DELETE语句删除的是表中的数据,而不是关于表的定义。
CREATE VIEW
<视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
这里只讨论用户标识和鉴定、存取控制、视图、审计、数据加密技术。
1.数据库管理员:拥有所有对象的所有权限,根据实际情况不同的权限授予不同的用户
2.用户:拥有自己建立的对象的全部的操作权限,可以使用GRANT,把权限授予其他用户
3.角色:数据库角色是权限的集合。可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。
4.审计:启用一个专用的审计日志(Audit Log),将用户对数据库的所有操作记录在上面;审计员利用审计日志监控数据库中的各种行为,找出非法存取数据的人、时间和内容。
即由系统提供一定的方式让用户标识自己的名字或身份,每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供机器使用权。如连接数据库时输入的用户名和密码。
存取控制机制主要包括两部分:
1.定义用户权限,并将用户权限登记到数据字典中
2.合法权限检查:每当用户发出存取数据库的操作请求后,DBMS查找数据字典,根据安全规则进行合法权限检查。
自主存取控制(Discretionary Access Control,DAC):用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,而且用户还可以将其拥有的存取权限转授给其他用户。非常灵活。主要通过SQL的GRANT语句和REVOKE语句来实现。
强制存取控制(Mandatory Access Control,MAC):每一个数据库对象被标以一定的密级,每一个用户也被授予某一个级别的许可证。对于任意一个对象,只有具有合法许可证的用户才可以存取。较为严格。
GRANT <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型> <对象名>]…
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
语义:将对指定操作对象的指定操作权限授予指定的用户。发出该GRANT语句的可以是DBA,也可以是数据库对象创建者,也可以是已经拥有该权限的用户。
如果指定了WITH GRANT OPTION 子句,则获得某种权限的用户还可以把这种权限再授予其他的用户。不允许循环授权
GRANT SELECT ON TABLE Student TO U1; /* 把查询Student表的权限授予用户U1 */
REVOKE <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型> <对象名>]…
FROM <用户>[,<用户>]...[CASCADE|RESTRICT];
REVOKE UPDATE(Sno) ON TABLE Student FROM U4; /*回收用户U4修改学生学号的权限*/
在强制存取控制中,数据库管理系统所管理的全部实体被分为主体和客体两大类:
主体是系统中的活动实体,如:DBMS所管理的实际用户,代表用户的各进程
客体是系统中的被动实体,受主体操纵,如:文件、基表、索引、视图
敏感度标记(Label):对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label)敏感度标记分成若干级别
TS>=S>=C>=P
主体的敏感度标记称为许可证级别(Clearance Level)
客体的敏感度标记称为密级(Classification Level)
当一个用户以标记label注册入系统时,系统要求他对任何客体的存取必须遵循如下规则:
(1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
(2)仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体
注意第2点,即用户可以写入数据但是不能再读取自己写入的数据。
数据库完整性是指数据的正确性和相容性。完整性是为了防止数据库中存在不符合语义的数据,即防止数据库中存在不正确的数据。
为了维护数据库的完整性,DBMS必须能够:
1.提供定义完整性约束条件的机制:完整性一般由SQL的DDL语句来实现,它们作为数据库模式的一部分存入数据字典中。
2.提供完整性检查的方法:检查数据是否满足完整性约束条件的机制
3.违约处理:若用户违背了完整性约束条件,应该采取的动作
关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。一种是定义为列级约束条件,另一种是定义为表级约束条件
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) /*在表级定义主码*/
);
CREATE TABLE Student (
Sno CHAR(9) ,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
PRIMARY KEY(Sno,Sname) /*属性组定义为主码,只能在表级定义*/
);
违约处理:
当用户程序对基本表插入一条记录或对主码列进行更新操作时,会进行如下检查
(1)检查主码值是否唯一,如果不唯一则拒绝插入或修改
(2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。
例如,关系SC中一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sno、Cno分别参照引用Student表的主码和Course表的主码
CREATE TABLE SC (
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno, Cno),
FOREIGN KEY(Sno) REFERENCES Student(Sno),
FOREIGN KEY(Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/
);
违约检查:
对被参照表和参照表进行增删改操作时都会进行检查
当不一致发生时,系统可以采用如下策略处理:
(1)拒绝(NO ACTION)执行:不允许该操作执行,该策略一般设置为默认策略
(2)级联(CASCADE)操作:当删除或修改被参照表的一个元组导致与参照表(SC)的不一致时,删除或修改参照表中的所有导致不一致的元组。
(3)设置为空值:当删除或修改被参照表的一个元组时造成了不一致,则将参照表中所有造成不一致的元组的对应属性设置为空值。
如果要采取非默认策略需要显式地加以说明,如:
ON DELETE NO ACTION
ON UPDATE CASCADE
1.属性上的约束条件的定义
NULL/NOT NULL、DEFAULT,UNIQUE、CHECK
2.元组上的约束条件
使用CHECK短语定义元组上的约束条件,如下:
CREATE TABLE SC (
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno, Cno),
CHECK(Sno='x' OR Cno NOT LIKE 'MS.%')
);
违约处理:拒绝执行
触发器是用户定义在关系表上的一类由事件驱动的特殊过程,其不仅可以用于数据库完整性检查,也可以用来实现数据库的其他功能,包括数据库安全性,以及一些业务流程和控制流程。
定义触发器:
CREATE TRIGGER <触发器名> /*每当触发事件发生时,该触发器被激活*/
{BEFORE | AFTER} <触发事件> ON <表名> /*指明触发器激活的时间是在执行触发事件前或后*/
REFERENCING NEW|OLD ROW AS <变量> /*REFERENCING 指出引用的变量*/
FOR EACH {ROW | STATEMENT} /*定义触发器的类型,指明动作体执行的频率*/
[WHEN <触发条件> ] /*仅当触发条件为真时才执行触发动作体*/
<触发动作体>
要点:
多个执行语句的触发器:
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
FOR EACH ROW
AS BEGIN
IF (new.Job = ‘教授’) AND (new.Sal < 4000) THEN
new.Sal := 4000;
END IF;
END;
删除触发器:DROP TRIGGER <触发器名> ON <表名>
数据依赖:数据依赖是一个关系内部属性与属性之间的一种约束关系。有多种类型的数据依赖,其中最重要的是函数依赖(Functional Dependency,FD)和多值依赖(Multivalued Dependency,MVD)
一个不好的关系模式会存在以下一些问题:
(1) 数据冗余太大:信息被重复存储,导致浪费大量存储空间
(2) 更新异常:当重复信息的一个副本被修改,所有副本都必须进行同样的修改。因此当更新数据时,系统要付出很大的代价来维护数据库的完整性,否则会面临数据不一致的危险。
(3) 插入异常:只有当一些信息事先已经存放在数据库中时,另外一些信息才能存入数据库中
(4) 删除异常:删除某些信息时可能丢失其它信息
规范化理论是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决数据冗余、插入异常、更新异常、删除异常这些问题。
定义1:设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y” 或 “Y函数依赖于X”,记作X→Y。
即Sno→Sname这个函数依赖只有在不可能存在两个元组在Sno上的值相等,而在Sname上的值不等时才成立。(左边相等右边必相等)
在关系模式R(U)中,对于U的子集X和Y,
如果X→Y,但Y不为X的子集?,则称X→Y是非平凡的函数依赖
若X→Y,但Y Í X, 则称X→Y是平凡的函数依赖
完全函数依赖:
部分函数依赖:
上图中 是完全函数依赖, 是部分数依赖,因为Sno→Sdept成立,而Sno是(Sno,Cno)的真子集
范式:
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化
如果一关系模式r(R)的每个属性对应的域值都是不可分的(即原子的),则称r(R)属于第一范式,记为r(R)Î1NF.
第一范式的目标是:将基本数据划分成称为实体集或表的逻辑单元,当设计好每个实体后,需要为其指定主码。
第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库
若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于任何一个候选码,则R∈2NF。
第二范式的目标:将只部分依赖于候选码(即依赖于候选码的部分属性)的非主属性移到其他表中。
S-L-C这个函数依赖图中非主属性Sdept和Sloc部分函数依赖于码(Sno, Cno)
将其分为两个表后使得非主属性对其各自的码都是完全函数依赖
2NF范式虽然消除了由于非主属性对候选码的部 分依赖所引起的冗余及各种异常,但并没有排除传递依赖。因此,还需要对其进一步规范化
若R∈3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码
第三范式的目标:去掉表中不直接依赖于候选码的非主属性
Sno→Sdept Sdept → Sno Sdept→Sloc 可得: Sno→Sloc,即S-L中存在非主属性对码的传递函数依 赖,S-L ∉ 3NF
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。
一个满足BCNF的关系模式有:
BCNF范式排除了:
例子:
关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。每一教师只教一门课,
每门课有若干教师,某一学生选定某门课,就对应一个固定的教师。
由语义可得到函数依赖:(S,J)→T;(S,T)→J;T→J
因为没有任何非主属性对码传递依赖或部分依赖,
STJ ∈ 3NF。
因为T是决定因素,而T不包含码,所以STJ 不属于 BCNF 关系。
候选码可以有多个,如上面(S,J)和(S,T)都是候选码,包含在任一一个候选码中的属性称为主属性,那么S,J,T都是主属性,以上不满足“所有的主属性都完全函数依赖于每个不包含它的候选码”,是否可以直接理解为决定因素必须为候选码中的一个?
数据库设计可以分为以下6个阶段:
其具体要做的事情如下图:
数据流图表达了数据和处理的关系,数据字典是系统中各类数据描述的集合
数据字典通常包括数据项、数据结构、数据流、数据存储、处理过程5个部分
1.数据项:数据项描述 = {数据项名,数据项含义说明,别名,数据类型,取值范围……}
2.数据结构:数据结构反映了数据之间的组合关系。数据结构描述 = {数据结构名,含义说明,组成:{数据项或数据结构}}
3.数据流:数据流是数据结构在系统内传输的路径。数据流描述 = {数据流名,数据流来源,数据流去向,平均流量,高峰期流量,组成:{数据结构}}
4.数据存储:数据存储是数据结构停留或保存的地方。数据存储描述 = {数据存储名,说明,编号,输入的数据流,输出的数据流,组成:{数据结构},数据量,存取频度,存取方式}
5.处理过程:处理过程的具体处理逻辑一般用判定表或判定树来描述。处理过程描述 = {处理过程名,说明,输入:{数据流},输出:{数据流},处理:{简要说明}}概念结构设计
需求分析阶段完成数据字典(用于表示收集到的数据)和一组数据流程图(Data Flow Diagram,DFD)
设计概念结构通常有四类方法
自顶向下:即首先定义全局概念结构的框架,然后逐步细化
自底向上:即首先定义各局部应用的概念结构,然后将它们集成起来,得到全局概念结构
逐步扩张:首先定义最重要的核心概念结构,然后向外扩充
混合策略:即将自顶向下和自底向上相结合,用自顶向下策略设计一个全局概念结构的框架,以它为骨架集成由自底向上策略中设计的各局部概念结构。
E-R图如何转换为关系模型?
(1)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,每个实体的码均是该关系的码;如果与某一端实体对应的关系模式合并,则需要在该关系模式的属性中加入另一个关系模式的码和联系本身的属性。(联系本身的属性?)
(2)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码
(3)一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,各实体的码组成关系的码或关系码的一部分
数据模型的优化
数据库逻辑设计的结果不是唯一的。关系数据模型的优化通常以规范化理论为指导。
具体如下:确定数据依赖、分析各关系模式属于第几范式,并不是规范化程度越高的关系就越优,这需要考虑具体情况;
对关系模式进行必要的分解,提高数据操作的效率和存储空间的利用率。常用的两种分解方法为水平分解和垂直分解。
水平分解:把关系的元组分为若干子集合,定义每个子集合为一个子关系
垂直分解:把关系的属性分解为若干个子集合,形成若干子关系模式
设计用户子模式
如果某些局部应用经常要使用某些很复杂的查询,为了方便用户,可以将这些复杂查询定义为视图,用户每次只对定义好的视图进行查询即可。
从以下几个角度考虑:
1.数据库的转储和恢复
2.数据库的安全性、完整性控制
3.数据库性能的监督、分析和改造
4.数据库的重组织和重构造
RDBMS查询处理可分为4个阶段:查询分析、查询检查、查询优化和查询执行
查询分析:对查询语句进行扫描、词法和语法分析,判断是否符合SQL语法规则。
查询检查:根据数据字典对合法的查询语句进行语义检查
查询优化:从多种可供选择的执行策略中选择一个高效执行的查询处理策略
查询执行:代码生成器生成执行这个查询计划的代码
实现查询操作的算法示例
一、选择操作的实现
1.简单的全表扫描方法:对查询的基本表顺序扫描,逐一检查每个元组是否满足选择条件
2.索引(或散列)扫描方法:如果选择条件的属性上有索引(如B+树索引或Hash索引),可以用索引扫描方法,通过索引先找到满足条件的元组主码或元组指针,再通过元组指针直接在查询的基本表中找到元组
二、连接操作的实现
例:SELECT * FROM Student, SC WHERE Student.Sno = SC.Sno;
1.嵌套循环方法(nested loop):对外层循环(Student)的每一个元组,检索内层循环(SC)中的每一个元组,并检查这两个元组在连接属性(sno)上是否相等
2.排序-合并方法(sort-merge join 或 merge join):尤其适合连接的表已排好序的情况
步骤如下:
①如果连接的表没有排好序,首先对Student表和SC表按连接属性Sno排序
②取Student表中第一个Sno,依次扫描SC表中具有相同Sno的元组,把它们连接起来
③当扫描到Sno不相同的第一个SC元组时,返回Student表扫描它的下一个元组,再扫描SC表中具有相同Sno的元组,把它们连接起来。
④重复以上步骤直到Student表扫描完
3.索引连接方法(index join):如果内层循环的连接属性上有索引,对于外层关系r的每一个元组tr,利用索引来搜索内层关系s 中与元组tr满足连接条件的元组 。
步骤:
① 在SC表上已经建立属性Sno的索引。
② 对Student中每一个元组,由Sno值通过SC的索引查找 相应的SC元组。
③ 把这些SC元组和Student元组连接起来 循环执行②③,直到Student表中的元组处理完
4.Hash Join方法
把连接属性作为hash码,用同一个hash函数把Student表和SC表中的元组散列到hash表中。
划分阶段(building phase, 也称为partitioning phase):
对包含较少元组的表(如Student表)进行一遍处理把它的元组按hash函数分散到hash表的桶中
试探阶段(probing phase,也称为连接阶段join phase)
对另一个表(SC表)进行一遍处理
把SC表的元组也按同一个hash函数(hash码是连接属性)进行散列
把SC元组与桶中来自Student表并与之相匹配的元组连接起来
查询优化的优点:用户不必考虑如何最好地表达查询以获得较好的效率,系统可以比用户程序的“优化”做得更好
基于关系代数等价变换规则的优化方法,称为代数优化
①XXX结合律、交换律……
②查询树的启发式优化
关系代数表达式典型的启发式规则有:
1.选择运算应尽可能先做。这在优化策略中是最重要、最基本的一条,因为选择运算一般使计算的中间结果大大变小???
2.把投影运算和选择运算同时进行
3.把投影同其前或其后的双目运算结合起来,没有必要为了去掉某些字段而扫描一遍关系
4.把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算
5.找出公共子表达式
物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划,达到查询优化的目标。
选择的方法可以是:
①基于规则的启发式优化:如对于用OR连接的析取选择条件,一般使用全表顺序扫描;如果2个表都已经按照连接属性排序,则选用排序-合并方法等。
②基于代价估算的优化:对各算法通过代价估算公式计算代价选择最优解
③两者结合的优化方法
基于启发式规则的存取路径选择优化
一、选择操作的启发式规则
1.对于小关系,使用全表顺序扫描,即使选择列上有索引
2.对于选择条件是主码 = 值 的查询,查询结果最多是一个元组,可以选择主码索引
3.对于选择条件是非主属性 = 值的查询,并且选择列上有索引,则要估算查询结果的元组数目,如果比例较小(< 10%)可以使用索引扫描,否则还是使用全表顺序扫描
4.对于选择条件是属性上的非等值查询或范围查询,并且选择列上有索引,同样要估算查询结果的元组数目。
5.对于用AND连接的合取选择条件,如果有涉及这些属性的组合索引,则优先采用组合索引扫描方法;如果某些属性上有一般的索引?否则使用全表顺序扫描
6.对于用OR连接的析取选择条件,一般使用全表顺序扫描
二、连接操作的启发式规则
1.如果2个表都已经按照连接属性排序,则选用排序-合并方法
2.如果一个表在连接属性上有索引,则可以选用索引连接方法
3.如果上面2个规则都不适用,其中一个表较小,可以选用Hash Join
4.最后可选用循环嵌套,选择其中较小的表作为外表
尽管数据库系统中采取了各种保护措施来防止数据库的安全性和完整性被破坏以及并发事务的正确执行,但某些故障仍然不可避免,会导致数据库中部分数据的丢失甚至破坏数据库,数据库恢复就是为了将数据库从错误状态恢复到某一已知的正确状态。
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。例如在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句。
事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。COMMIT表示提交,ROLLBACK表示回滚,在事务运行的过程中发生某种故障事务不能继续执行,系统就会将事务对数据库的已完成操作全部撤销,从而回滚到事务开始时的状态。
事务的特性:
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability),简称ACID
1.原子性:事务是数据库的逻辑工作单位,事务中包括的操作要么都做,要么都不做
2.一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。事务执行过程中出现故障则称这时的数据库处于不一致性状态。
3.隔离性:一个事务的执行不能被其他事务干扰,并发执行的各个事务之间不能互相干扰
4.持续性(永久性):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
事务的ACID特性可能遭到破坏的因素有:
(1) 多个事务并行运行时,不同事务的操作交叉执行
(2) 事务在运行过程中被强制停止
1.事务内部的故障:
2.系统故障:如操作系统故障,CPU故障,系统断电
3.介质故障:如磁盘损坏、磁头碰撞、瞬时强磁场干扰等
4.计算机病毒
转储即DBA定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的数据称为后被副本。
转储又分为静态转储和动态转储:静态转储必须等待正在运行的用户事务结束才能进行;动态转储是指转储期间允许对数据库进行存取或修改,即转储和用户事务可以并发执行。
也可分为海量转储和增量转储:海量转储即每次转储全部数据库,增量转储即每次只转储上一次转储后更新的数据。
日志文件是用来记录事务对数据库的更新操作的文件。不同数据库系统采用的日志文件格式并不完全一样,主要有两种格式:以记录为单位的日志文件和以数据块为单位的日志文件
对以记录为单位的日志文件,日志文件中需要登记的内容包括:
以上每一条内容记为一个日志记录(log record)
每个日志记录的内容主要包括:
对以数据块为单位的日志文件,日志记录的内容包括事务标识和被更新的数据块。由于将更新前的整个块和更新后的整个块都放入日志文件中,操作的类型和操作对象等信息就不必放入日志记录中了。
日志文件的作用:
日志文件用于事务故障恢复和系统故障恢复,并协助后备副本进行介质故障恢复
具体作用如下:
登记日志文件
为保证数据库是可恢复的,登记日志文件时必须遵循两条规则:
(1) 登记的次序严格按并发事务执行的时间次序
(2) 必须先写日志文件,后写数据库
如果先写了数据库修改,但是没有登记这个日志,那么中途运行故障就无法恢复这个修改了。
REDO:重做,正向扫描日志文件,对每个REDO事务重新执行日志文件登记的操作
UDNO:撤销,反向扫描日志文件,对每个UNDO事务的更新操作执行逆操作
COMMIT:提交,将事务中所有对数据库的更新写回到磁盘上的物理数据库中,事务正常结束
ROLLBACK:回滚,事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成操作全部撤销,回滚到事务开始时的状态
事务故障的恢复:
(1)反向扫描日志文件(即从最后向前扫描日志文件),查找该事务的更新操作
(2)对该事务的更新操作执行逆操作。(来得及或者未来得及写入数据库都没关系)
(3)继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理
(4)如此继续,直到读到该事务的开始标记
系统故障的恢复:
(1)正向扫描日志文件,找出在故障发生前已经提交的事务(这些事务既有BEGIN TRANSACTION记录,也有COMMIT记录),将其事务标记记入REDO队列;同时找出故障发生时尚未完成的事务(这些事务只有BEGIN TRANSACTION记录,无相应的COMMIT记录),将其事务标记记入UNDO队列
(2)对撤销队列中的各个事务执行UNDO操作
(3)对重做队列中的各个事务执行REDO操作
为什么要REDO?考虑已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库(磁盘)。
介质故障的恢复:
(1)装入最新的数据库后备副本,使数据库恢复到最近一次转储时的一致性状态
(2)装入相应的日志文件副本(转储结束时刻的日志文件副本),重做已完成的事务,即扫描日志文件找出需要重做和撤销的事务
在故障发生时还未完成的事务需要撤销,在检查点和故障点之间完成的事务需要重做,因为它们对数据库所做的修改在故障发生时可能还在缓冲区中。
并发控制概述:事务是并发控制的基本单位,并发控制用于保证事务的隔离性和一致性。
事务读数据x一般记为R(x),写数据x一般记为W(x)
如果不对并发操作进行正确调度,可能导致数据的不一致性问题,主要包括丢失修改、不可重复读和读“脏”数据。
1.丢失修改:两个事务读入同一数据并修改,其中一个事务的修改会丢失
2.不可读重复:事务T1读取数据后,T2执行更新操作,使T1无法再现前一次读取结果
3.读脏数据:“脏”数据指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,则T2读取到的数据就为“脏”数据,即不正确的数据。
封锁即事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。
排它锁(写锁,X锁):若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁前不能再读取和修改A
共享锁(读锁,S锁):若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改
活锁即一个事务可能永远等待(系统总是先批准其他事务的锁请求),可以采用先来先服务的策略解决。
死锁即两个事务互相申请对方锁住的资源导致两个事务永远不能结束。
预防策略:
(1) 一次性封锁法:一次性封锁发要求每个事务必须一次将所有要使用的数据全部加锁
缺点:势必扩大封锁的范围,从而降低了系统的并发度;
(2) 顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
缺点;难以事先确定封锁顺序
死锁解除策略:
(1) 超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁;
缺点:可能误判死锁,事务因为其他原因使等待时间超过时限;若时限设置得太长,死锁发生后不能及时发现
(2) 等待图法:并发控制子系统周期性地生成事务等待图,并进行检测,如果发现图中存在回路,则发生了死锁。
如果检测到死锁,一般采用的方法是选择一个处理死锁代价较小的事务,将其撤销,释放此事务持有的所有的锁,之后对撤销的事务所执行的数据修改操作必须加以恢复。
定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,称这种调度策略为可串行化的调度。
可串行性(Serializability)是并发事务正确调度的准则,按这个准则规定,一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。
冲突可串行化调度
冲突操作是指不同的事务对同一个数据的读写操作和写写操作:
Ri (x)与Wj(x) /* 事务Ti读x,Tj写x,其中i≠j*/
Wi(x)与Wj(x) /* 事务Ti写x,Tj写x,其中i≠j*/
不能交换(Swap)的动作:
一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到 另一个调度Sc’ ,如果Sc’是串行的,称调度Sc 为冲突可串行化的调度
一个调度时冲突可串行化的,那么它一定是可串行化的调度,因此,可以用这种方法来判断一个调度是否是冲突可串行化的。
冲突可串行化调度是可串行化调度的充分条件,不是必要条件,还有不满足冲突可串行化条
件的可串行化调度
Sc1=r1(A)w1(A)r2(A)w2(A)r1(B)w1(B)r2(B)w2(B)
把w2(A)与r1(B)w1(B)交换,得到:
r1(A)w1(A)r2(A)r1(B)w1(B)w2(A)r2(B)w2(B)
再把r2(A)与r1(B)w1(B)交换:
Sc2=r1(A)w1(A)r1(B)w1(B)r2(A)w2(A)r2(B)w2(B)
Sc2等价于一个串行调度T1,T2,Sc1冲突可串行化的调度
封锁协议(Locking Protocol)即对数据对象加锁时约定的一些规则,如何时申请封锁、持锁时间、何时释放锁等。两段锁协议是最常用的一种封锁协议,使用两段锁协议产生的是可串行化调度(充分条件)。
两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁
(1) 在对任何数据进行读、写操作之前,首先要申请并获取对该数据的封锁
(2) 在释放一个封锁之后,事务不得再申请和获得任何其他封锁
简单来说,申请锁和释放锁必须是连续的
例:
事务T1遵守两段锁协议,其封锁序列是:
Slock A Slock B Xlock C Unlock B Unlock A Unlock C;
l← 扩展阶段 →l l← 收缩阶段 →l
事务T2不遵守两段锁协议,其封锁序列是:
Slock A Unlock A Slock B Xlock C Unlock C Unlock B
1.关系代数中的等值连接操作是由选择和笛卡尔积这两个操作组成的
2.事务日志一般用于保存对数据的更新操作
3.设有一个关系:DEPT(DNO,DNAME),如果要找出倒数第三个字母为 W,并且至少包含 4 个字母的 DNAME,则查询条件子句应写成 WHERE DNAME LIKE (B)
(A)'_ _W_%' (B) '_%W_ _' (C) '_W_ _' (D) '_W_%'
PS:
‘_’匹配单个任意字符,’%’匹配0个或多个任意字符, ‘[ ]’匹配括号内所列字符中的一个, ‘[^]’匹配不在括号内所列字符中的单个字符
4、以下(D )不属于实现数据库系统安全性的主要技术和方法。
(A)存取控制技术 (B)视图技术 (C)审计技术 (D)并发控制技术
PS:
实现数据库安全性的技术和方法有多种,如存取控制技术、视图技术和审计技术
并发控制技术用于保证事务的隔离性和一致性
5、有两个关系 R(A,B,C)和 S(B,C,D),则 R÷S 结果的属性个数是(C )。
(A)3 (B)2 (C)1 (D)不一定
6、设 U 是所有属性的集合,X、Y、Z 都是 U 的子集,且 Z=U-X-Y。下面关于多值依赖的叙述中,不正确的是(??? )。
(A)若 X→→Y,则 X→→Z (B)若 X→Y,则 X→→Y (C)若 X→→Y,且 Y′∈Y,则 X→→Y′ (D)若 Z=Φ,则 X→→Y
[解析] 多值依赖的性质包括:
(1)多值依赖具有对称性 即若X→→Y,则X→→Z,其中Z=U-X-Y
(2)多值依赖具有传递性 即若X→→Y,Y→→Z, 则X→→Z –Y
(3)函数依赖是多值依赖的特殊情况。 即若X→Y,则X→→Y。
(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。
多值依赖的定义:设R(U)是一个属性集U上的一个关系模式, X、 Y和Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖 X→→Y(Y多值依赖于X)成立, 当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一 组Y的值,这组值仅仅决定于x值而与z值无关
7、现有一个关系:借阅(书号、书名,库存数,读者号,借期,还期),假如同一本书允许一个读者多次借阅,但不能同时对一种书借多本。则该关系模式的码是(C )。
(A)书号 (B)读者号 (C)书号+读者号 (D)书号+读者号+借期
9、设有关系 R(A,B,C)的值如下:
A | B | C |
2 | 2 | 3 |
2 | 3 | 4 |
3 | 3 | 5 |
下列叙述正确的是(B)
A.函数依赖 A→B 在上述关系中成立 B.函数依赖 BC→A 在上述关系中成立
C.函数依赖 B→A 在上述关系中成立 D.函数依赖 A→BC 在上述关系中成立
【解析】:判断一个函数依赖是否成立即对每个决定因素(左边的)其右边的值唯一
10、设有事务 T1 和 T2,其并发操作顺序如下图所示,该并发操作带来的问题是:(A)
A.丢失更新 B.读“脏数据” C.事务不能提交 D.不能重复读
11、关系代数表达式的优化策略中,首先要做的是(B)
(A)对文件进行预处理 (B)尽早执行选择运算 (C)尽早执行笛卡尔积运算 (D)尽早执行投影运算
12、在 DB 的三级模式中,外模式(D )。
(A)只有一个 (B)不能有多个 (C)至多一个 (D)可以有多个
13、在 SELECT 语句中,需对分组情况满足的条件进行判断时,应使用( D)。
(A)WHERE (B)GROUP BY (C)GROUP CONDITION (D)HAVING
14、若两个实体间的关系是 1:m,则进行逻辑设计时实现 1:m 联系的方法是( A)
(A)在“m”端实体转换的关系中加入“1”端实体转换的关系的码
(B)将“m”端实体转换的关系的码加入“1”端实体转换的关系中
(C)在两个实体转换的关系中,分别加入另外一个关系的码
(D)将两个实体转换成一个关系
【解析】:考察E-R图转换为关系模式,1:n关系可以独自成一个表,也可以与n端关系模式合并
其规则如下:注意联系独自成表(关系模式)时合并的是实体的码(而不是所有属性)
(1)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,每个实体的码均是该关系的码;如果与某一端实体对应的关系模式合并,则需要在该关系模式的属性中加入另一个关系模式的码和联系本身的属性。(联系本身的属性?)
(2)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码
(3)一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,各实体的码组成关系的码或关系码的一部分
15、若数据库中只包含成功事务提交的结果,则此数据库处于(B )状态。
(A)安全 (B)一致 (C)不安全 (D)不一致
16、关系数据库的规范化理论主要解决的问题是(A)
(A)如何构造合适的数据逻辑结构 (B)如何构造合适的数据物理结构 (C)如何构造合适的应用程序 (D)如何控制不同用的操作权限
【解析】:概念结构是画E-R图,逻辑结构是建表,物理结构是选择存储结构和存取方法等
规范化理论是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决数据冗余、插入异常、更新异常、删除异常这些问题。说白了就是改造表。
17、DBMS 普遍采用( C)方法来保证调度的正确性。
(A)索引 (B)授权 (C) 封锁 (D) 日志
18、X→Ai 成立(i=l,2,…,k)是 X→A1 A2…Ak 成立的(C )。
(A)充分条件 (B)必要条件 (C)充要条件 (D)既不充分也不必要
19、在进行授权时,数据对象的(A ),授权子系统就越灵活。
(A)粒度越小 (B)粒度越大(C)约束越细(D)约束越粗
【解析】:粒度?约束?粒度理解为范围?如数据库、表、表操作等;约束理解为规定的细致与否?
20、数据库的概念模型独立于( A)。
(A)具体的机器和 DBMS (B)E-R 图 (C)信息世界 (D)现实世界
22、如果一个关系 R 中的属性全部都是主属性,则 R 至少可以达到(B )。
(A)2NF (B)3NF (C)BCNF (D)4NF
【解析】一个全部是主属性的关系必然不会有非主属性部分或者传递依赖的问题,故至少是3NF。但此关系无法保证每一个非平凡的多值依赖或者函数依赖都包含码,所以R的最高范式至少是3NF。
23、在 E-R 模型中,如果有 3 个不同的实体集,3 个多对多的联系, 则应转换为(B )个关系模式。
(A)3 (B)6 (C)9 (D)4
24、关于死锁,下列说法正确的是( D)
(A)死锁是操作系统中的问题,数据库中不存在
(B)数据库中防止死锁的方法是禁止两个用户同时访问数据库
(C)当两个用户竞争相同的资源时不会发生死锁
(D)只有出现并发操作时,才有可能出现死锁
25、写一个修改到数据库中,与写一个表示这个修改的记录到日志文件中的操作,应该( C)。 (A)前者先做 (B)由程序员安排 (C)后者先做 (D)由系统决定哪一个先做
26、在第一个事务以 S 封锁方式读数据 A 时,第二个事务对数据 A 的读取 方式会遭到失败的是(A )。
(A)实现 X 封锁的读 (B)实现 S 封锁的读 (C)不加锁的读 (D)实现意向共享锁的读
27、视图建立后,在数据字典中存放的是( C)。
(A)查询语句 (B)组成视图的表的内容 (C)视图的定义 (D)视图对应的表的定义
1、什么是视图?使用视图有什么好处?
【答】: 视图是从一个或几个基本表(或视图)导出的表,数据库只存放视图的定义而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中数据发生变化,从视图查询出的数据也会随之改变。
视图的作用:
①简化用户的操作:用户所做的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无须了解。
②使用户能以多种角度来看待同一数据:当许多不同种类的用户共享同一个数据库时,这种灵活性是非常有必要的。
③对重构数据库提供了一定的逻辑独立性:即使重构数据库也不一定需要修改应用程序。
④能够对机密数据提供安全保护:只允许用户查询提供给他的视图而不是直接查询表,可以隐藏表中的机密数据
⑤适当的利用视图可以更清晰地表达查询语句:利用视图来表达查询语句
2、发生介质故障时,应该如何恢复数据库?
【答】:(1)装入最新的数据库后备副本,使数据库恢复到最近一次转储时的一致性状态
(2)装入相应的日志文件副本(转储结束时刻的日志文件副本),重做已完成的事务,即扫描日志文件找出需要重做和撤销的事务
3、什么是数据库的审计?它有什么作用?
【答】:数据库的审计即每当用户对数据库执行操作(CRUD)时就在审计文件中增加一条记录(包含谁执行了什么操作),启用一个专用的审计日志(Audit Log),将用户对数据库的所有操作记录在上面;
审计的作用:
(1) 保证数据库的安全性,数据库管理员可以根据审计文件观察是否有人执行了不安全的操作。审计员利用审计日志监控数据库中的各种行为,找出非法存取数据的人、时间和内容
(2) 利于查错,可以通过观察执行了哪些操作来找出错误的来源
4、什么是数据库中的事务?它有哪些特性?这些特性的含义是什么
【答】:事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。例如在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句。
事务的特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability),简称ACID
1.原子性:事务是数据库的逻辑工作单位,事务中包括的操作要么都做,要么都不做
2.一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。事务执行过程中出现故障则称这时的数据库处于不一致性状态。
3.隔离性:一个事务的执行不能被其他事务干扰,并发执行的各个事务之间不能互相干扰
4.持续性(永久性):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
5、如何判断一个关系是否属于第三范式?
【答】:判断一个关系是否属于第三范式首先判断它是否属于第二范式,即非主属性是否部分依赖于码,如果属于第二范式再看非主属性是否传递依赖于码,如果两个都是否,则该关系属于第三范式。(1NF:每个属性对应的值域都是不可分的);另外,如果该关系为全码,则它肯定属于第三范式
6、在数据库设计时,什么是数据字典?数据字典中通常有哪些内容?
【答】:数据流图表达了数据和处理的关系,数据字典是系统中各类数据描述的集合
数据字典通常包括数据项、数据结构、数据流、数据存储、处理过程5个部分
①数据项:数据项描述 = {数据项名,数据项含义说明,别名,数据类型,取值范围……}
②数据结构:数据结构反映了数据之间的组合关系。数据结构描述 = {数据结构名,含义说明,组成:{数据项或数据结构}}
③数据流:数据流是数据结构在系统内传输的路径。数据流描述 = {数据流名,数据流来源,数据流去向,平均流量,高峰期流量,组成:{数据结构}}
④数据存储:数据存储是数据结构停留或保存的地方。数据存储描述 = {数据存储名,说明,编号,输入的数据流,输出的数据流,组成:{数据结构},数据量,存取频度,存取方式}
⑤处理过程:处理过程的具体处理逻辑一般用判定表或判定树来描述。处理过程描述 = {处理过程名,说明,输入:{数据流},输出:{数据流},处理:{简要说明}}概念结构设计
7、在数据库的查询优化中,什么是代数优化?什么是物理优化?
【答】:代数优化即通过一些定律或启发式规则对关系代数操作(选择、投影、连接等)做替换(顺序)、合并等从而达到优化的效果;物理优化即通过使用合适的存储方式及存取方法来实现优化(如选择操作是使用全表扫描还是索引扫描,连接操作是使用嵌套循环还是排序-合并方法等)
基于关系代数等价变换规则的优化方法,称为代数优化
物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划,达到查询优化的目标
8、在基于检查点的数据库恢复技术中,检查点记录的内容应该包括哪些?
【答】:检查点记录的内容包括
①建立检查点时刻所有正在执行的事务清单
②这些事务最近一个日志记录的地址
9、什么是数据库中的死锁?如何解决死锁问题
【答】:死锁即两个事务互相申请对方锁住的资源导致两个事务永远不能结束
解决死锁有以下方案:
(1) 一次性封锁法:一次性封锁发要求每个事务必须一次将所有要使用的数据全部加锁
缺点:势必扩大封锁的范围,从而降低了系统的并发度;
(2) 顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
缺点;难以事先确定封锁顺序
10、举例说明连接操作的排序-合并实现方法
【答】:假设有两个表Student表和SC表,其有相同属性列Sno表示学生学号
步骤如下:
①如果连接的表没有排好序,首先对Student表和SC表按连接属性Sno排序
②取Student表中第一个Sno,依次扫描SC表中具有相同Sno的元组,把它们连接起来
③当扫描到Sno不相同的第一个SC元组时,返回Student表扫描它的下一个元组,再扫描SC表中具有相同Sno的元组,把它们连接起来。
④重复以上步骤直到Student表扫描完
11、在学习了关系数据库以后,你觉得它主要的好处是什么?它又有哪些缺陷导致它无法胜任某些应用?
【答】:好处:①对现实事务中的关系描述很清晰 ②数据定义语言和数据操作语言语义化程度较好 ③便于数据库设计的规范化
缺陷:
设有关系模式如下:S(Sno, Sname, Age, Sex), SC(Sno, Cno, Grade), C(Cno, Cname, Teacher)。其中 S 表示学生,C 表示课程,SC 表示 选课。Sno 代表学号,Sname 代表学生姓名,Age 代表学生年龄, Sex 代表学生性别,Cno 代表课程号,Grade 代表成绩,Cname 代 表课程名,Teacher 代表任课教师姓名。用 SQL 语句完成:(共 10 分)
1、查询平均成绩大于 85 分的学生的姓名及其平均成绩(5 分)。
2、把三个表的查询和插入权限授予用户张明,并允许张明进一步 把这些权限授予其他用户(5 分)。
【解析】:
1.
SELECT Sname, AVG(Grade) FROM
(SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student, SC
WHERE Student.Sno = SC.Sno); /* 自然连接 */
GROUP BY Sname HAVING AVG(Grade) > 85
2.授权
GRANT SELECT, INSERT
ON TABLE S,SC,C
TO ZHANGMING
WITH GRANT OPTION
2、设关系模式 R(A,B,C,D,E),F 是 R 上成立的依赖集,F={ AB→C,BC→A,AC →B,D→E },试写出 R 的所有候选码,并说明理由。
【解析】:(A,B,D)(A,C,D)(B,C,D)
3、设有关系 R(W, X, Y, Z),依赖关系 F={X→Z,WX→Y},判断该关系模式符合第几范式,并说明理由。
【解析】:因为其存在非主属性部分依赖于码 ,所以其符合第一范式
4、在数据库系统中有如下一个调度 S,它涉及到 5 个不同的事务 T1、T2、T3、T4 和 T5。 判断调度 S 是否为冲突可串行化。如果调度 S 是冲突可串行化的,就请给出与之等价的一 个串行调度序列。
【解析】:目前的调度为
S = r2(A) r1(Q) r5(C) w1(Q) r4(A) w2(Q) w1(B) r3(Q) r3(M) r4(Q) r4(M) r5(M) w5(M)
冲突操作是指不同的事务对同一个数据的读写操作和写写操作:
Ri (x)与Wj(x) /* 事务Ti读x,Tj写x,其中i≠j*/
Wi(x)与Wj(x) /* 事务Ti写x,Tj写x,其中i≠j*/
不能交换(Swap)的动作:
S能否交换为一个串行化的调度?
其可以交换为T1T2T3T4T5(具体过程略)
序列:r1(Q)w1(Q)w1(B)………
6、在查询优化的代数优化方法中,你认为哪条启发式规则是最重要的?为什么?请举例 说明。
【解析】:选择运算应尽可能先做。这在优化策略中是最重要、最基本的一条,因为选择运算一般使计算的中间结果大大变小
如图,先选择之后再做连接操作可以减小数据量
SELECT Sname FROM Student, SC
WHERE Student.Sno = SC.Sno AND Cno = ‘2’
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。