点击下载该文档 密码:cqoq
本人自制了简答题的速记卡片 地址,大家可以参考使用。[下载Markji App 使用]
数据库管理系统(DBMS)的功能:
数据库管理技术经历的三个阶段
数据独立性
数据模型是数据库系统的核心和基础
两类数据模型
第一类
第二类:
概念模型
信息世界中的基本概念
数据模型的组成:
常用的数据模型
层次模型:
网状模型:
关系模型:
关系模型的优缺点:
(1)关系模型与格式化模型不同,它是建立在严格的数学概念的基础上的。
(2)关系模型的概念单一。无论实体还是实体之间的联系都用关系来表示。数据结构简单、清晰,用户易懂易用。
(3)关系模型的存取路径对用户透明,具有更高的数据独立性、更好的安全保密性,简化了程序员的工作和数据库开发建立的工作。
模式(逻辑模式或概念模式)
外模式(用户模式)
内模式(存储模式)
为了能够在系统内部实现这三个抽象层次的联系和转换,数据库管理系统在这三级模式之间提供了两层映像:外模式/模式映像和模式/内模式映像。两层映像保证了数据库系统中的数据能够具有较高的逻辑独立性和物理独立性。
关系操作
基本查询操作:
其他操作可由基本操作来定义和导出
分类
传统的集合运算(从行的角度进行,二目运算,两个关系之间进行)
专门的关系运算(涉及行又涉及列)
选择操作σ (Select)(横挑)从一个表中把满足条件的元组选出来
projection 投影操作π (Project)(竖挑) 将需要的属性列出来
连接
语法格式R∞<连接条件>S=σ<连接条件>(R * S)
等值连接:
自然连接:两张表在所有的公共属性上做等值连接
步骤:
作R x S(笛卡儿积)
在R x S上选择同名的属性组
去掉重复属性
除运算
计算思路:比如对于A/B来说,我们要找在关系A中跟关系B中所有y值都有联系的x值。【也就是找出在关系B中没有一个y值与A的是没有联系的。否定的否定,就是找出B中的列的属性在A中都有关联的属性,B中列的属性不写.】
A/B: πx(A)-all disqualified tuples(所有不合格的元组) = πx((πx(A)×B)-A)
先在A中找不满足除法条件的x
把关系A所有的x值减去所有不满足条件的x值
注:常见关键词:“至少” “全部”;
求AB一般思路:πAC ÷ C ⋈ πAB
语法格式:A/B = {
传统的集合运算:并、差、交、笛卡儿积
专门的关系操作:选择、投影、连接、除运算等
基本的关系操作:选择、投影、并、差、笛卡儿积
交、连接和除,均可以用这5种基本运算来表达
交运算:R∩S = R-(R-S)
连接运算:R⋈S=σ<ΑΘΒ>(R × S)
除运算:R(X,Y)÷ S(Y,Z)= πx ®- πx(πx®× πy(S)-R)
SQL:结构化查询语言(Structured Query Language)
▲SQL的特点
SQL的基本概念
模式的定义与删除
基本表的定义和删除与修改
定义基本表
CREATE TABLE SC
(Sno CHAR(9).
Cno CHAR(4).
Grade SMALLINT,
PRIMARY KEY(Sno.Cno),/*主码由两个属性构成,必须作为表级完整性进行定义*/
FOREIGN KEY(SnO)REFERENCES Student(Sno),/*表级完整性约束条件,Sno是外码,被参照表是Student*/
FOREIGN KEY(CnO)REFERENCES Course(Cno)/*表级完整性约束条件,Cno是外码,被参照表是Course*/
);
数据类型
模式与表
修改表
add,用于增加新列,添加约束条件
[例3.8]向Student表增加“入学时间”列,其数据类型为日期型。
ALTER TABLE Student ADD S_entrance DATE;
修改数据类型:alter
[例3.9]将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT;
删除基本表
建立索引的优点
建立索引
[例3.13]为学生-课程数据库中的Student、Course和SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
修改索引
[例3.14]将SC表的SCno索引名改为SCSno。
ALTER INDEX SCno RENAME TO SCSno;
删除索引
[例3.15]删除Student表的Stusname索引。
DROP INDEX Stusname;/*删除索引时,系统会同时从数据字典中删去有关该索引的描述。*/
单表查询
选择表中的若干列,
[例3.16]查询全体学生的学号与姓名。
SELECT Sno,Sname FROM Student;-- 将Student表投影到Sno,Sname上
选择表中的若干元组
消除取消重复的行,两个本来并不完全相同的元组在投影到指定的某些列上后,可能会变成相同的行。可以用DISTINCT消除它们。
[例3.21]查询选修了课程的学生学号。
SELECT DISTINCT Sno FROM SC;
如果没有指定DISTINCT关键词,则默认为ALL,即保留结果表中取值重复的行。
SELECT Sno FROM SC;
等价于
SELECT ALL Sno FROM SC;
[例3.22]查询计算机科学系全体学生的名单。
SELECT Sname FROM Student WHERE Sdept='CS';
语句的执行过程
确定范围
BETWEEN AND
[例3.26]查询年龄不在20~23岁之间的学生姓名、系别和年龄。
SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;
确定集合:谓词IN可以用来查找指定集合的元组
[例3.27]查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。
SELECT Sname,Ssex FROM Student WHERE Sdept IN('CS,;MA,IS');
字符匹配:LIKE
[NOT]LIKE<匹配串>[ESCAPE’<换码字符>]
% 表示任意长度的字符串
_表示任意单个字符串
如果用户要查询的字符串本身就含有通配符%或_,这时就要使用ESCAPE<换码字符>短语对通配符进行转义了。(在正则表达式中,使用 ?:表示出现0次或1次 *:表示出现0次或多次 +:出现1次或多次)
[例3.35]查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况。
SELECT* FROM Course WHERE Cname LIKE DB\_%i_'ESCAPE'\;
/*这里的匹配串为"DB\_%i__"第一个_前面有换码字符\,所以它被转义为普通的字符。而i后面的两个的前面均没有换码字符\,所以它们仍作为通配符。加/表示_不具有实际意义*/
涉空值的查询
[例3.37]查所有有成绩的学生学号和课程号。
SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;/*IS不能使用=代替*/
多从条件的查询
AND的优先级高于OR,可以使用括号改变优先级
[例3.27]查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。
SELECT Sname,Ssex FROM Student WHERE Sdept IN("CS,MA',IS);
= /*IN谓词实际上是多个OR运算的缩写*/
SELECT Sname,Ssex FROM Student WHERE Sdept='CS'OR Sdept='MA'OR Sdept='IS';
ORDER BY 子句
用户可以用ORDERBY子句对查询结果按照一个或多个属性列的**升序(ASC)或降序(DESC)**排列,默认值为升序。
注: ASC = ascend, DESC = descend; 词根:-de 表示向下
[例3.39]查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
SELECT Sno,Grade FROM SC WHERE Cno='3' ORDER BY Grade DESC;
聚集函数
COUNT(*)统计元组个数
COUNT([DISTINCT|ALL]<列名>)统计一列中值的个数
SUM([DISTINCT|ALL]<列名>)计算一列值的总和(此列必须是数值型)
AVG([DISTINCT|ALL]<列名>)计算一列值的平均值(此列必须是数值型)
MAX([DISTINCT|ALL]<列名>)求一列值中的最大值
MIN([DISTINCT|ALL]<列名>)求一列值中的最小值
指定了DISTINCT,需要去除重复值,不指定默认为ALL,不需要去除掉
[例3.45]查询学生201215012选修课程的总学分数。
SELECT SUM(Ccredit)
FROM SC,Course WHERE Sno'201215012'AND SC.Cno-Course.Cno;
-- 当聚集函数遇到空值时,除COUNT(*)外,都跳过空值而只处理非空值。COUNT(*)是对元组进行计数,某个元组的一个或部分列取空值不影响COUNT的统计结果。
注意:WHERE子句中是不能用聚集函数作为条件表达式的。聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。
GROUP BY 子句
GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。如果未对查询结果分组,聚集函数将作用于整个查询结果。分组后聚集函数将作用于每一个组,即每一组都有一个函数值。
[例3.46]求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno)
FROM SC GROUP BY Cno;
-- 该语句对查询结果按Cno的值分组,所有具有相同Cno值的元组为一组,然后对每一组作用聚集函数COUNT进行计算,以求得该组的学生人数。
如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件。
WHERE子句与HAVING短语的区别在于作用对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。
[例3.48]查询平均成绩大于等于90分的学生学号和平均成绩。
-- 下面的语句是不对的:
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;
-- 因为WHERE子句中是不能用聚集函数作为条件表达式的,WHERE作用的是整个表,而聚集函数是作用于组的.
-- 正确的查询语句应该是:
SELECT Sno,AVG(Grade)
FROM SC GROUP BY Sno
HAVING AVG(Grade)>=90;
-- WHERE和GROUP BY组合时,WHERE应该在前,因为它作用与整个表
-- HAVING和GROUP BY组合时,HAVING应该在后,因为只有先进行分组后HAVING才能使用,它是作用域组的.
连接查询
等值连接与非等值连接
连接运算符为=
[例3.49]查询每个学生及其选修课程的情况。
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;
/*将Student与SC中同一学生的元组连接起来*/
自身连接(p101)
外连接
多表连接
嵌套查询
在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询(nested query)。
上层的查询块称为外层查询或父查询,下层查询块称为内层查询或子查询。
子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。
以层层嵌套的方式来构造程序正是SQL中“**结构化”**的含义所在。
带有IN谓词的子查询
不相关子查询:子查询的结果不依赖与父查询
[例3.56]查询选修了课程名为“信息系统”的学生学号和姓名。
SELECT Sno,Sname -- ③最后在Student关系中取出Sno和Sname
FROM Student
WHERE Sno IN
(SELECT Sno -- ②然后在SC关系中找出选修了3号课程的学生a学号
FROM SC
WHERE Cno IN
(SELECT Cno -- ①首先在Course关系中找出“信息系统”的课程号,结果为3号 FROM Course
WHERE Cname='信息系统'
)
);
-- 用连接查询实现:
SELECT Student.Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname='信息系统;
带有比较运算符的子查询(p106)
父查询与子查询之间用比较运算符进行连接.
相关子查询:子查询的查询条件依赖于父查询,整个查询语句称为相关嵌套查询(correlated nested query)语句。
[例3.57]找出每个学生超过他自己选修课程平均成绩的课程号。
SELECT Sno,Cno
FROM SC x
WHERE Grade >=(SELECT AVG(Grade) -- 某学生的平均成绩
FROM SC y
WHERE y.Sno = x.Sno);
相关子查询由于子查询与父查询有关,必须反复求值,而不相关子查询由于子查询与父查询无关,所以可以子查询可以一次求解出来
插入数据:INSERT
[例3.69]将一个新学生元组(学号:201215128,姓名:陈冬,性别:男,所在系:IS,年龄:18岁)插入到Student表中。
INSERT INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('201215128','陈冬','男','IS',18);
-- 字符串要用单引号引出来,如果这里Student后面没有指明属性名,values后面的属性值必须与创建的表中的属性值对应.
修改数据:UPDATE
[例3.73]将学生201215121的年龄改为22岁。
UPDATE Student SET Sage=22
WHERE Sno='201215121';
删除数据
[例3.76]删除学号为201215128的学生记录。
DELETE FROM Student WHERE Sno = '201215128';
定义视图
视图建立在基本表上
[例3.84]建立信息系学生的视图。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept=IS;
-- 关系数据库管理系统执行CREATE VIEW语句的结果只是把视图的定义存入数据字典,并不执行其中的SELECT语句。只是在对视图查询时,才按视图的定义从基本表中将数据查出。
视图建立在已经定义好的视图上
[例3.87]建立信息系选修了1号课程且成绩在90分以上的学生的视图。
CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS SI
WHERE Grade>=9;
-- 表中一般只存放数据,由基本数据计算派生出来的数据一般是不存储的,而视图中不存放数据,所以一般用视图来定义派生列,这些列也称为虚拟列
删除视图
格式:DROP VIEW<视图名>[CASCADE];
删除视图的时候,如果该视图上还导出了其他的视图,那么不能删除,需要在后面加CASCADE,即级联操作,进而把该视图和它导出的所有视图删除.
[例3.91]删除视图BT_S和视图IS_S1:
DROP VIEW BT_S; -- 成功执行
DROP VIEW IS_S1; -- 拒绝执行
-- 执行此语句时由于IS_S1视图上还导出了IS_S2视图,所以该语句被拒绝执行。如果确定要删除,则使用级联删除语句:
DROP VIEW IS S1 CASCADE; -- 删除了视图IS_S1和由它导出的所有视图
查询视图
视图消解:(p124)从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转发过程称为视图消解(view resolution)。(即将定义视图的条件加入进去)
[例3.92]在信息系学生的视图中找出年龄小于20岁的学生。
-- IS_Student视图
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';
-- 在该视图上查询
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
-- 经过视图消解转换后的查询语句为
SELECT Sno,Sage
FROM Student
WHERE Sdept='IS' AND Sage<20;
视图消解实际上就是把视图的中定义的子查询查询出来的结果,再在查询视图的语句上根据上面的结果写出视图消解的后的转换语句
更新视图
视图IS_Student
-- IS_Student视图
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';
修改
[例3.95]将信息系学生视图IS_Student中学号为“201215122”的学生姓名改为“刘辰”。
- UPDATE IS Student SET Sname='刘辰’
WHERE Sno='201215122';
-- 转换后的更新语句为
UPDATE Student
SET Sname='刘辰’
WHERE Sno='201215122' AND Sdept='IS';
插入
[例3.96]向信息系学生视图IS_Student中插入一个新的学生记录,其中学号为“201215129”,姓名为“赵新”,年龄为20岁。
INSERT
INTO IS_Student
VALUES('201215129','赵新',20);
-- 转换为对基本表的更新:
INSERT
INTO Student (Sno,Sname,Sage.Sdept)
VALUES('201215129','赵新',20,'IS');
-- 这里系统自动将系名IS放入VALUES子句中。
删除
[例3.97]删除信息系学生视图IS_Student中学号为“201215129”的记录。
DELETE
FROM IS Student
WHERE Sno='201215129';
-- 转换为对基本表的更新;
DELETE
FROM Student
WHERE Sno='201215129' AND Sdept='IS';
视图的作用
存储控制
自主存储控制(Discretionary Access Control,DAC)
授权:GRANT
[例4.5]把对表SC的INSERT权限授予U5用户,并允许将此权限再授予其他用户。
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION;
-- 执行此SQL语句后,U5不仅拥有了对表SC的INSERT权限,还可以传播此权限,即由U5用户发上述GRANT命令给其他用户。例如U5可以将此权限授予U6(例4.6)。
[例4.6]
GRANT INSERT
ON TABLE SC
TO U6
WITH GRANT OPTION;
-- 同样,U6还可以将此权限授予U7,以此类推....
定义了WITH GRANT OPTION语句的用户可以授权给其他用户,但是不能循环授权,也就是后面的授予前面的(这就类比类中的静态内容,静态的内容是不能访问非静态内容的,因为静态内容先存在,非静态内容后存在,这里继承的用户的权限后存在,肯定是从先存在的用户那里继承过来的权限,所以后面的授权用户不能反过来授予前面的用户.)
取消授权:REVOKE
[例4.10]把用户U5对SC表的INSERT权限收回。
REVOKE INSERT
ON TABLE SC
FROM U5 CASCADE;
-- 将用户U5的INSERT权限收回的同时,级联(CASCADE)收回了U6和U7的INSERT权限,否则系统将拒绝执行该命令。
强制存储控制(p148)(Mandatory Access Control,MAC)
通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动对数据提供一定程度的安全保护。
就是通过视图对不同的用户授予不同的权限
例题:用户杨兰具有从每个部门职工中SELECT最高工资、最低工资、平均工资的权限,他不能查看每个人的工资。
首先建立一个视图。然后对这个视图定义杨兰的存取权限。
CREATE VIEW 部门工资
AS
SELECT 部门.名称,MAX(工资),MIN(工资),AVG(工资)
FROM 职工,部门
WHERE 职工.部门号=部门.部门号
GROUP BY 职工.部门号;
GRANT SELECT ON TABLE 部门工资 TO 杨兰;
关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。
列级约束条件:定义在属性的后面
Sno CHAR(9) PRIMARY KEY
表级约束条件:单独成一行,使用语句单独定义
PRIMARY KEY(Sno)
关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码
[例5.3]定义SC中的参照完整性。
CREATE TABLESC
(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)-- 在表级定义参照完整性
)
属性上的约束条件
元组上的约束条件
[例5.9]当学生的性别是男时,其名字不能以Ms.打头。
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.%')
);
-- 定义了元组中Sname和Ssex两个属性值之间的约束条件
范式NF(Normal Form)
1NF:符合1NF的关系中的每个属性都不可再分,1NF是所有关系型数据库的最基本要求。
2NF
3FN
BCNF
五元组 R( U D DOM F )
关系名R是符号化的元组语义。
U为一组属性。
D为属性组U中的属性所来自的域。
DOM为属性到域的映射。
F为属性组U上的一组数据依赖。
数据依赖是一个关系内部属性与属性之间的一种约束关系。
第一范式(1FN):
函数依赖:
什么是一个好的关系模式?
函数依赖:若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y。即在数据表中,不存在任意两条记录,它们在X属性(或属性组)上的值相同,而在Y属性上的值不同。
码
范式NF(Normal Form)
关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。
一个低一级范式的关系模式通过模式分解(schema decomposition)可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化(normalization)。
1NF
2NF
3NF
BCNF
4NF
多值依赖:X,Y,Z是U的子集,并且Z=U-X-Y。多值依赖X->->成立,并且仅当对R(U)的任一关系r,给定一对(x,z),有一组Y的值,仅仅决定于x的值而于z的值无关
多值依赖的性质:
(1)具有对称性
(2)传递性
(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
判断是第几范式的方法:
对于第一步:
例题:
学生表(学号,姓名,系名,系主任,课名,分数)
候选码:(学号,课名)
主属性:学号,课名
非主属性:姓名,系名,系主任,分数
依赖关系:
所以存在非主属性对于码的部分函数依赖,最高只符合1NF的要求,不符合2NF的要求。
进行模式分解后有关系模式:
选课(学号,课名,分数)
学生(学号,姓名,系名,系主任)
对于选课表:
对于学生表:
对于该表判断是否符合第三范式的要求
对于选课表,主码为(学号,课名),主属性为学号和课名,非主属性只有一个,为分数,不可能存在传递函数依赖,所以选课表的设计,符合3NF的要求。
对于学生表,主码为学号,主属性为学号,非主属性为姓名、系名和系主任。因为 学号 → 系名,同时 系名 → 系主任,所以存在非主属性系主任对于码学号的传递函数依赖,所以学生表的设计,不符合3NF的要求。
进一步进行模式分解
选课(学号,课名,分数)
学生(学号,姓名,系名)
系(系名,系主任)
对于选课表,符合3NF的要求,之前已经分析过了。
对于学生表,码为学号,主属性为学号,非主属性为系名,不可能存在非主属性对于码的传递函数依赖,所以符合3NF的要求。
对于系表,码为系名,主属性为系名,非主属性为系主任,不可能存在非主属性对于码的传递函数依赖(至少要有三个属性才可能存在传递函数依赖关系),所以符合3NF的要求。
某公司有若干个仓库;
每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作;
一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量。
那么关系模式 仓库(仓库名,管理员,物品名,数量) 属于哪一级范式?
候选码:(管理员,物品名),(仓库名,物品名)
主属性:仓库名、管理员、物品名
非主属性:数量
已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量
码:(管理员,物品名),(仓库名,物品名)
∵ 不存在非主属性对候选码的部分函数依赖和传递函数依赖。∴ 此关系模式属于3NF。
造成此问题的原因:存在着主属性对于候选码的部分函数依赖与传递函数依赖。(在此例中就是存在主属性【仓库名】对于码【(管理员,物品名)】的部分函数依赖。
这就是BCNF范式.
存在关系模式 R(A,B,C)函数依赖F = {A->C, BC->D},该关系模式达到第几范式?
模式分解方法
规范化小结
基本思想:逐步消除数据依赖中不适合的部分
模式设计原则:“一事一地”
规范化的实质:概念的单一化
关系模式的规范化过程是通过对关系模式的分解来实现的,即把低一级的关系模式分解为若干个高一级的关系模式
逻辑蕴涵:给定R;如果从F能够推出X→Y,则称F逻辑蕴涵X→Y。
Armstrong公理系统
推理规则:
有效性:由F出发根据Armstrong公理推导出来的每一个函数依赖一定在F+中;
完备性:指的是F+中的每一个函数依赖,必定可以由F出发根据Armstrong公理推导出来。
模式分解的算法:
闭包:
函数依赖集的闭包:关系模式R中为F所逻辑蕴含的函数依赖的全体所构成的集合称作F的闭包。
属性基于函数依赖的闭包:由F推导出来的某个属性集X所决定的某个属性的集合称为属性集的闭包。(由当前属性集经函数依赖集F推出得到的属性集)
设F为属性集U上的一组函数依赖,X、Y⊆ U,X→Y能由F根据Armstrong公理导出的充分必要条件是Y⊆ X的闭包。即求X->Y等价于转化为判断X的闭包是否包含Y。
作用:
求法:
【例1】R,U =(A,B,C,D,E),F=(AB→CD,CE→A,AE→CD),计算 A E F + AE_F^+ AEF+
轮次 | 扫描的函数依赖 | A E F + AE_F^+ AEF+ |
---|---|---|
AE(初始化所求闭包) | ||
1 | AB->CD | AE |
CE->A | AE | |
AE->CD | ACDE(发现左侧AE在闭包中,将右侧CD加入闭包。扫描完毕闭包由AE变为ACDE,开启新一轮扫描) | |
2 | AB->CD | ACDE |
CE->A | ACDE | |
AE->CD | ACDE(扫描完毕,发现闭包没变,则终止扫描 |
【例2】R,U =(A,B,C,G,H,I),F= ( B→H,CG→HI,A→BC),计算 A G F + AG_F^+ AGF+
轮次 | 扫描的函数依赖 | A G F + AG_F^+ AGF+ |
---|---|---|
AG(初始化所求闭包) | ||
1 | B→H | AG |
CG→HI | AG | |
A->BC | ABCG(发现左侧A在闭包中,将右侧BC加入闭包。扫描完毕闭包由AG变为ABCG,开启新一轮扫描) | |
2 | B->H | ABCGH |
CG→HI | ABCGHI (发现闭包已经等于全集U,则提前终止。) |
注:从属性的角度理解:如(学号A,姓名B)->性别C,学号A->年龄D,则有:(学号A,姓名B)->(性别C,年龄D)
简单方法: A G F + AG_F^+ AGF+ = {AGBCHI} ;{AG},A->BC将BC加入,此时有{AGBC},B->H 加入H,此时有{AGBCH},CG->HI,加入I。
极小函数依赖集
满足的条件
(1)F中任一函数依赖的右部仅含有一个属性。(单属性化)
(2)F中不存在这样的函数依赖X→A,使得F与F - (X→A)等价。(F中的函数依赖均不能由F中其他函数依赖导出 无冗余化)
(3)F中不存在这样的函数依赖X→A,X有真子集Z使得F -(X→A)U(Z→A)与F等价。(F中的各函数依赖左部均为最小属性集 即约化)
求法:
例题:
正则覆盖
定义: F C F_C FC是一个依赖集, F C F_C FC有如下性质:
求法:
对上方例题:求出 F m F_m Fm={B→D,DG→C,B→E,AG→B},将左部相同属性的函数依赖合并有: F c F_c Fc={B→DE,DG→C,AG→B}
正则覆盖与最小函数依赖的区别:最小函数依赖集的右端必然只有一个属性,但正则覆盖无需。
候选码的求法
若X为候选码,则必须满足两个条件:X的闭包是U且X没有冗余。
定理:对于给定的关系模式R及其函数依赖集F
(1)若X(X∈R)是L类属性,则X必为R的任一候选键的成员。
(2)若X(X∈R)是L类属性,且 X + X^+ X+包含了R的全部属性,则X必为R的唯一候选码。
(3)若X(X∈R)是R类属性,则x不在任何候选键中。
(4)若X(X∈R)是N类属性,则X必为R的任一候选码的成员。
(5)若X(X∈R)是R的N类和L类属性组成的属性集,且 X + X^+ X+包含了R的全部属性,则X是R的唯一候选码。
(6)若X(X∈R)是时LR类属性,则x可能为R的任一候选码的成员,也可能不为R的任一候选码的成员。
注:
L类,仅出现在F的函数依赖左部的属性。
R类,仅出现在F的函数依赖右部的属性。
N类,在F的函数依赖左部和右部均未出现的属性。
LR类,在F的函数依赖左部和右部两部均出现的属性。
求法:
例题:
设有关系模式R(A,B,C,D,E,F)与它的函数依赖集F=(A→F,B→A,D→B,DE→B,DF→B)求R的所有候选码。
L:D,E
LR:A,B,F
R:无
N:C
求DEF的闭包: D E C + DEC^+ DEC+ = {DECBA}=U 故DEF为唯一候选码。
模式分解
第三范式分解
保持函数依赖分解为3NF
保持函数依赖和无损连接性分解为3NF
例题:
R(U,F): U = {ABCD},F = {AB→C,C→D,D→A}
R(U,F): U = {ABCD},F={B→C,B→D}
L类属性B,N类属性A,候选码AB
R不属于3NF
Fc={B→CD}
分解为{ (BCD)、(AB) }
R(U,F) : U = {ABCD},F={AB→C,BC→D,CD→A,AD→B}
R(U,F) : U = {ABCDE},F={AB→C,DE→C,B→D}
R(U,F): U = {ABCDEF},F= {A→B,C- >DF,AC-→E,D→F}
BCNF范式分解
方法
寻找关系模式中属性α的闭包,如果这个属性的闭包没有包含R中所有属性(即不为超码),且为非平凡函数依赖,则需要拆解,否则直接构建新的关系模式。(判断是否是BCNF,不是则以这个函数依赖分解)
分解方法:
非平凡函数依赖α→β,将原来R变为R-β,并构造一个新的关系模式α∪β,即分解为R1(αβ), R2(R-β)
若分解后的关系模式为BCNF则无需继续分解,否则继续分解直到全部分解完毕。
注:该算法只能保持无损连接分解。
例题
R(U,F):U = {ABCD},F= {B→C,B→D}
R(U,F): U = {ABCD},F= {AB→C,BC→D, CD→A, AD→B}
R(U,F): U = {ABCDE},F={AB→C,DE→C,B→D}
R(U,F):∪= {ABCDEF},F={A→B,C→DF,AC→E,D→F}
3NF与BCNF范式判断的简便方法
3NF判断
BCNF判断
例题:考虑一个具有五个属性的关系R,U = {ABCDE}, F={A-> B, BC-> E, ED-> A}
求R的所有候选码
L:C,D
LR:A,B
R:E
N:
A C D + ACD^+ ACD+= {A、C、D、B、E} = U
B C D + BCD^+ BCD+= {B、C、D、E、A} = U
E C D + ECD^+ ECD+= {E、D、C、A、B} = U
故候选码为ACD、BCD、CDE
判断R是否为3NF
判断R是否为BCNF
数据库设计
广义的讲:是数据库及其应用系统的设计,即设计整个数据库应用系统;
狭义的讲:是设计数据库本身,即设计数据库的各级模式并建立数据库;
数据库设计的基本步骤
数据库的各级模式
E-R图的集成
E-R图之间的冲突
E-R图向关系模式的转换
1:1
例子:一个公司有一个经理,一个经理也只能在一个公司进行任职,所以公司和经理之间是一对一的关系。公司(公司编号,公司名,地址,电话),经理(职工编号,姓名,性别,电话)。经理任职会产生任职日期属性。
转换为关系模式:
公司(公司编号,公司名,地址,电话)
经理(职工编号,姓名,性别,电话)
任职(公司编号,职工编号,任职日期) 主键为公司编号或者是职工编号
经理(职工编号,姓名,性别,电话)
(2)公司(公司编号,公司名,地址,电话)
经理(职工编号,姓名,性别,电话,公司编号,任职日期) 主键为职工编号,外键为公司编号。
1:n
例子:一个部门中有多个员工,但是每个员工只能属于一个部门,所以部门和员工之间的关系就是一对多。部门(部门号,部门名称,电话),员工(员工号,姓名,电话)。
转换为关系模式:
1方:部门(部门号,部门名称,电话)
n方:员工(员工号,姓名,电话)
隶属(员工号,部门号) 主键是n方
部门(部门号,部门名称,电话)
员工(员工号,姓名,电话,部门号) 主键为员工号,外键为部门号
M:N
例子:学生(学号,姓名,性别),课程(课程号,课程名称,授课老师)。
转换为关系模式:
学生(学号,姓名,性别)
课程(课程号,课程名称,授课老师)
选课(学号,课程号,成绩) 主键为学号和课程号的组合,外键为课程号,学号
数据模型的优化
设计步骤
设计的内容:为关系模式选择存取方法,以及设计关系、索引等数据库文件的物理存储结构。
试述关系数据库管理系统查询优化的一般准则。
▲试述关系数据库管理系统查询优化的一般步骤。
①把查询转换成某种内部表示,通常用的内部表示是语法树。
②把语法树转换成标准(优化)形式,即利用优化算法把原始的语法树转换成优化的形式。
③选择低层的存取路径。
④生成查询计划,选择所需代价最小的计划加以执行。
事务:所谓事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一不可分割的工作单位。
定义事务的语句:
事务的ACID特性(ACID properties)
数据恢复的基本原理:冗余
数据转储
转储即数据库管理员定期地将整个数据库复制到磁带、磁盘或其他存储介质上保存起来的过程。这些备用的数据称为后备副本(backup)或后援副本。
静态转储:是在系统中无运行事务时进行的转储操作。
动态转储:是指转储期间允许对数据库进行存取或修改。即转储和用户事务可以并发执行。
方法
事务故障的恢复
系统故障的恢复
介质故障的恢复
登记日志文件时为什么必须先写日志文件后写数据库?
什么是数据库镜像?它有什么用途?
一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
二级封锁协议:在一级封锁协议基础上増加事务T在读取数据R之前必须先对其如S锁,读完后即可释放S锁。
三级封锁协议:在一级封锁协议的基础上増加事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
注:在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。(读完后数据可能被修改,再读数据发生变化)
写时加X锁,事务结束后解锁。– 一级封锁协议
读时加S锁,读完立即解锁。– 二级封锁协议
读时加S锁,事务结束后解锁。 – 三级封锁协议
所谓两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。(一次性对所需封锁数据进行封锁)
“两段”锁的含义是事务分为两个阶段:
两段锁协议⇨可串行化调度
一次封锁法要求每个事务必须依次将所有要使用的数据全部加锁,因此遵守两段锁协议;但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁。
关系代数的五种基本操作
四种组合操作
传统的集合运算
专门的关系运算
事务的特点
数据库的三级结构
数据库设计过程理论中,其核心作用的是数据依赖
规范化的基本原则:一是一地
数据的独立性分为:逻辑独立性和物理独立性
相关子查询:值查询的条件依赖于父查询
不相关子查询:子查询的条件不依赖于父查询
事务: 用户定义的一个数据库操作序列,这些操作要么全部要么全不做,是一个不可分割的工作单位。
关系的两个不变性:
日志文件:记录事务对数据库的更新操作的文件
E-R图之间的冲突
故障的种类
SQL语言的功能包括数据查询,数据定义,数据操纵和数据控制
CRUD:CRUD是数据库基本操作中的Create(创建)、Retrieve(读取)、Update(更新)、Delete(删除)。
数据依赖一般包括多值依赖,函数依赖和连续依赖
授予权限:GRANT … ON … TO … WITH GRANT OPTION
收回权限:REVOKE … ON … FROM …
数据库应用系统的维护阶段的任务
数据库系统中,物理存储视图用内模式描述
用户自定义完整性约束语句:NOT NULL, UNIQUE, CHECK
数据库角色:被命名的一组与数据库操作相关的权限,角色是权限的集合。
范式:关系数据库中的关系要满足一定要求,满足不同程度要求的为不同范式。
关系:笛卡尔集的子集,就是一个二维表。
集合运算符
运算符 | 含义 | 英文 |
---|---|---|
∪ | 并 | Union |
− | 差 | Difference |
∩ | 交 | Intersection |
× | 笛卡尔积 | Cartesian Product |
比较运算符
运算符 | 含义 |
---|---|
> | 大于 |
≥ | 大于等于 |
< | 小于 |
≤ | 小于等于 |
= | 等于 |
≠ | 不等于 |
专门的关系运算符
运算符 | 含义 | 英文 |
---|---|---|
σ | 选择 | Selection |
π | 投影 | Projection |
⋈ | 链接 | Join |
÷ | 除 | Division |
逻辑运算符
运算符 | 含义 |
---|---|
∧ | 与 |
∨ | 或 |
¬ | 非 |
简述数据库管理系统的概念和功能?
简述数据库系统的三级模式结构。
数据库系统的特点?
(1)数据结构化(是数据库的主要特征之一,也是数据库系统与文件系统 的本质区别);
(2)数据的共享性高,冗余度低,易扩充;
(3)数据独立性高——数据独立性是指程序和数据之间相互独立
SQL的特点?
数据库设计一般有那些过程?每个阶段的中心任务是什么?