王珊 萨师煊编著的数据库系统概论(第5版)1~7章
# 第一章 绪论
数据库的4个基本概念
- 数据:描述事物的符号记录
- 数据库:数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合
- 数据库管理系统:是位于用户与操作系统之间的一层数据管理软件
- 数据定义功能
- 数据组织、存储和管理
- 数据操纵功能
- 数据库的事务管理和运行管理
- 数据库的建立和维护功能
- 其他功能
- 数据库系统:数据库系统是由数据库、数据库管理系统(及其开发工具)、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统
数据管理技术的发展
- 人工管理阶段:数据不保存、不共享,不具有独立性
- 文件系统阶段:可保存,但共享性差,冗余度大、独立性差
- 数据库管理系统
数据库系统的特点:
- 数据结构化(主要特征,与文件系统的本质区别)
- 数据的共享性高、冗余度低且易扩充
- 数据独立性高
- 物理独立性是指用户的应用程序与数据库中
数据的物理存储
是相互独立的 - 逻辑独立性是指用户的应用程序与
数据库的逻辑结构
是相互独立的
- 物理独立性是指用户的应用程序与数据库中
- 数据由数据库管理系统统一管理和控制
数据模型:
- 概念模型:主要用于数据库设计,用E-R图来描述现实世界中的概念模型
- 逻辑模型和物理模型
数据模型
通常由数据结构、数据操作和数据的完整性约束条件组成- 数据模型常见的有层次模型(树)、网状模型和关系模型(表)
E-R图:分为实体(长方形)、属性(椭圆形)、关系(菱形)三个部分
数据库系统的三级模式结构:由外模式、模式、内模式三级构成。
- 模式即表头
- 外模式:也称用户模式,是数据库用户(包括应用程序和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,如课表、成绩
- 模式:也称逻辑模式,是数据库中共全体数据的逻辑结构和特征描述,是所有用户的公共数据视图,如教务在线
- 内模式:也称存储模式,一个数据库只有一个内模式,它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式
二级映像:
- 外模式/模式映像∶当模式改变时,由数据库管理员对各个外模式/模式映像作相应改变,可以使外模式保持不变,应用程序不必修改,保证了
数据与程序的逻辑独立性
- 模式/内模式映像﹔当数据库的存储结构改变时,有数据库管理员对模式/内模式作相应改变,可以使模式保持不变,从而应用程序也不用改变,保证了
数据与程序的物理独立性
- 外模式/模式映像∶当模式改变时,由数据库管理员对各个外模式/模式映像作相应改变,可以使外模式保持不变,应用程序不必修改,保证了
# 第二章 关系数据库
关系:
- 一张二维表对应一个关系
- 域:是一组具有相同数据类型的值的集合,即某个属性的取值范围
- 若某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码
- 全码:该关系中所有属性组合才能唯一标识一个元组
关系操作:
查询:选择、投影、连接、除法、并∪、差-、交∩、笛卡尔积×
插入、删除、修改
选择
:例σ Sdept = 'IS' (Student)
,σ的下标为选择条件投影
:例π Sname,Sdept (Student)
,选择属性列连接
:连接是有条件和顺序的,没有条件的连接是笛卡尔积,无实际意义A和B分别为R和S上的属性组、θ为比较运算符
- 等值连接:θ为“=”的连接
- 自然连接:特殊的等值连接,两关系中相同属性组的等值连接,结果中去掉重复属性列
- 外连接:如在R(S)中可能存在S(R)中不存在的属性值,外连接会保持这些值并将S(R)中没有的置为空
除法
:R÷S即保留R中满足S的,且R中列要去掉包含S的列做题顺序:连接-选择-投影
- 先确定查询那个表,如果是跨表则用自然连接
查询条件用选择σ
查询内容用投影π
- 如果题目中“查询没有...”,用差运算-,所有-有的=没有的
关系的完整性
- 实体完整性:主码唯一且非空
- 参照完整性:外码要么为空,要么对应另一表的主码
- 用户定义完整性
# 第三章 关系数据库标准语言SQL
SQL是结构化查询语言,集数据定义(DDL)、数据查询(DQL)、数据操作(DML)、数据控制(DCL)等功能为一体
关系型数据库中的数据是放在表里面,而非关系型数据库类似于文档,放在集合里面
SQL语言的特点:
- 综合统一(独立完成数据库生命周期中的全部活动,包括定义关系模式、录入数据、建立数据库、查询、更新、维护、数据库重构、数据库安全)
- 高度非过程化(用户只需提出“做什么”,而不必指明“怎么做”)
- 面向集合的操作方式(SQL采用集合操作方式)
- 以同一种语法结构提供两种使用方式(SQL既是自含式语言,又是嵌入式语言。SQL语句能够嵌入到高级语言程序中)
- 语言简洁,易学易用(SQL语言语法简单,接近英语口语,因此容易学习,也容易使用)
模式的创建与删除:
- create schema "S-T"(模式名) authorization wang(用户名)
- drop schema 模式名 cascade|restrict
- cascade(级联):将该模式中所有的数据库对象同时全部删除
- restrict(限制):如果该模式已经定义下属数据库对象,则拒绝该语句的执行
基本表的创建、删除、修改
# 创建 create table 表名( 属性名 数据类型 完整性约束条件, sno char(9) primary key ) # 删除 drop table 表名 cascade|restrict # cascade 如果表有外键、视图、触发器的话也会一同删除 # restrict 如果表有外键、视图、触发器的话则该语句不执行 # 修改 alter table 表名 add 属性名 数据类型 完整性约束条件 alter table test add email varchar(255);
1
2
3
4
5
6
7
8
9
10
11
12
13
14数据查询:
select [distinct] 目标列 [别名],目标列... #distinct表示去重 from 表名或视图名 [别名] #from后面可以插入select语句 [where 条件表达式] #不同条件用 and 隔开 [group by 列名 [having 条件表达式]] #分组,having后是分组的筛选条件 [order by 列名 [asc|desc]] #排序,asc表示从小到大(默认),desc表示从大到小 # 聚集函数 count(*) 统计元组个数 count([distinct|all] 列名) 统计一列中值的个数 sum([distinct|all] 列名) 计算一列值的总和(必须为数值列) avg([distinct|all] 列名) 计算一列值的平均值(必须为数值列) max([distinct|all] 列名) 计算一列值的最大值 min([distinct|all] 列名) 计算一列值的最小值 # 子查询 where a>[any|all] (select...) any表示大于其中一个即可 all表示大于所有的 # 存在量词exists,如果子查询有值则返回1,无值则返回0,not exists相反 where exists (select * ...) #集合查询 并 union 交 intersect 差 except
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27- 列名或表名起别名时可以省略
as
like 匹配串
,匹配串可以是完整的一个字符串或者含有通配符%和_。%
表示任意长度(可为0)的字符串,_
表示一个任意字符。
- 列名或表名起别名时可以省略
更新数据
# 插入,如果是插入所有字段,可以省略字段列表,如果是插入部分字段,则要写出对应的字段列表 insert into 表名 [字段列表] values(值1,值2...) # 修改 update 表名 set 字段=值,... where 条件 # 删除 delete from 表名 [where 条件]
1
2
3
4
5
6
7
8基本表是本身独立存在的表,在SQL中一个关系就对应一个基本表。
视图(view):
- 视图是从一个或几个基本表(或视图)导出的表,本质对应一条select语句,结果集被赋予一个名字,即视图名
- 视图是一个虚表,数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在原来的基本表中,所以当基表数据发生变化时,视图数据也随之变化
优点
:简化用户操作;使用户能以多种角度看待同一数据;对重构数据库提供了一定程度的逻辑独立性;能够对机密数据提供安全保护
视图的操作
# 建立视图 create view 视图名[(列名,...)] as 子查询 [with check option] # with check option表示对视图进行更新、插入或删除的行要满足视图定义中的查询条件,防止用户进行不属于该视图的操作 # 例: create view bt(sno,sname,sbirth) as select sno,sname,2014-sage from student; # 删除视图,cascade表示把该视图和由它导出的所有视图一起删除 drop view 视图名 [cascade] # 查询视图与查询基本表操作差不多,将表名改成视图名即可 # 更新视图,视图本身是不存在的,所以对视图的更新最终要反映到基本表上 update 表名 set 字段=值,... where 条件 #该条件包括题目要求的条件和创建视图时的查询条件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 第四章 数据库安全性
数据库的安全性是指保护数据库以防止不合法使用造成的数据泄露、更改或破坏。
不安全因素
- 非授权对数据库的恶意存取和破坏
- 数据库中重要的数据泄露
- 安全环境的脆弱性
实现数据库安全性控制的常用技术:
- 用户身份鉴别:如静态口令、动态口令、生物特征、智能卡
- 存取控制
- 自主存取控制方法:数据库管理员可以自定义和分配其他用户的操作权限
- 视图机制
- 审计
- 数据加密
自主存取:
reference
权限代表是否允许创建外键- 授权
grant
:grant 权限 on 对象类型 对象名 to 用户 [with grant option],可选项表示获得某种权限的用户还可以授予权限给其他人 - 回收权限
revoke
:revoke 权限 on 对象类型 对象名 from 用户 [cascade|restrict]
数据库角色:
# 角色创建 create role 角色名 例:create role R1 # 角色授权 grant 权限 on 对象类型 对象名 to 用户 例:grant select,update,insert on table student to R1 # 让某个用户或角色担任某个角色 grant 角色 to 角色或用户名 [with admin option] 例:grant R1 to 王平,张明; # 角色权限回收 revoke 权限 on 对象类型 对象名 from 用户 例:revoke select,update,insert on table student from R1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15审计:把对数据库的所有操作都记录到审计日志中,然后就可以通过日志审查这里面是否存在非法行为
# 对修改SC数据的操作进行审计 audit update on SC # 取消对SC表的一切审计 noaudit update on SC
1
2
3
4
5
# 第五章 数据库的完整性
数据库的完整性是指数据的正确性和相容性。正确性是指符合现实世界的语义,相容性是指同一对象在不同表中的数据符合逻辑,如学生所选课程必须是学校开设的课程
数据库的完整性约束条件是指数据库中的数据应该满足的语义约束条件
数据的完整性和安全性
:- 数据的完整性是为了防止数据库中存在不符合语义、不正确的数据
- 数据的安全性是保护数据库防止恶意破坏和非法存取
为维护数据库的完整性,DBMS需有如下功能:
- 提供定义完整性约束条件的机制
- 提供完整性检查的方法
- 进行违约处理
三大完整性
:- 实体完整性:主码唯一且非空
- 参照完整性:外码要么为空,要么对应另一表的主码
- 用户定义完整性:
- 非空
- 列值唯一
- 满足某一个条件表达式(check)
create table course( name varchar(8) not null, # 非空 age int unique, # 列值唯一 sex char(2) check (sex in ('男','女')), # 指定满足条件 primary key(id) # 实体完整性设置 foreign key(id) references teacher(id) # 参照完整性设置 check (sex='女' or name not like 'Ms.%') # 元组中name和sex两个属性值之间的约束条件 )
1
2
3
4
5
6
7
8
9断言:可以定义涉及多个表或聚焦操作的比较复杂的完整性约束
create assertion 断言名 check子句 # 例:限制数据库课程最多60名学生选修,如果选择人数超过60,check子句返回值为假,对s表的插入操作会被拒绝 create assertion asse check (60>=(select count(*) from c,s where s.no=c.no and c.name='数据库' ) ) drop assertion 断言名
1
2
3
4
5
6
7
8
9
10触发器:也叫
事件-条件-动作
规则,当对一个表进行增删改时,对触发器里的条件进行检查,如果成立则执行触发中的动作,否则不执行。# 创建触发器 create trigger 触发器名 before|after 触发事件 on 表名 referencing new|old row as 变量 # 指出引用的变量 for each row|statement 指定是每一行触发一次还是语句执行完后触发 [when 触发条件] 触发动作体 # 例: create trigger st after update of grade on sc referencing oldrow as oldtuple,newrow as newtuple for each row when (newtuple.grade>=1.1*oldtuple) insert into su (no,oldgrage,newgrade) values(oldtuple.no,oldtuple.grade,newtuple.grade) # 删除触发器 drop trigger 触发器名 on 表名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 第六章 关系数据理论
为什么要引入范式?问题的提出:
- 数据冗余
- 更新异常
- 插入异常
- 删除异常
- 判断关系模式的好坏:应当不会发生插入、删除、更新异常,数据冗余尽可能少
码:
- 包含在任何一个候选码中的属性称为主属性
- 属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R的外码
求候选码
- L:只出现在左边的一定是
- R:只出现在右边的一定不是
- N:左右都不出现的一定是
- LR:左右都出现的不一定
1. 求最小函数依赖集 2. 按L、R、N、LR对U中的属性进行划分 3. 求(LN)的闭包,如果(NF)+ = U,则唯一候选码为(LN)中的属性;如果(LN)+ != U,则逐个加入LR中的属性依次求闭包,如果为U则是候选码,否则不是
1
2
3函数依赖:
- X->Y,但Y⊄X,称X->Y是
非平凡的函数依赖
(Y不属于X!) - X->Y,但Y⊆X,称X->Y是平凡的函数依赖,这是必然成立的
- X->Y,且X任何一个真子集X'都有X'推不出Y,则称Y对X
完全函数依赖
(X少一个属性都推不出Y!) - 如果Y不完全依赖X,则称Y对X
部分函数依赖
- 如果X->Y(Y⊄X),Y推不出X,Y->Z(Z⊄Y)则称Z对X
传递函数依赖
(两个非平凡的函数依赖)
- X->Y,但Y⊄X,称X->Y是
多值依赖:给定一对(x,z)值,有一组y值。y仅仅决定于x,而与z无关,称x->->y(一对多)
- 若x->->y,z为空,则为平凡的多值依赖
- 若x->->y,z不为空,则为非平凡的多值依赖
- 对称性:x->->y,则x->->z,其中z=U-x-y
- 传递性:x->->y,y->->z,则x->->z-y
- 若x->->y,x->->z,则x->->yz,x->->y∩z,x->->y-z,x->->z-y
按属性间依赖关系来将范式分为1NF、2NF、3NF、BCNF、4NF、5NF,遵循越高的范式数据库冗余越小
1NF:所有字段值都是不可分解的原子值
2NF:每一个非主属性完全函数依赖于任何一个候选码(即不存在非主属性对码的部分函数依赖)
3NF:没有一个非主属性传递依赖于码
BCNF:每一个决定因素都包含码(消除每一属性对候选码的传递依赖)
如:表中有属性S、T、J,有(S,T)->J,(S,J)->T,T->J,其中S、T、J都是主属性但T不包含码,所以不符合BCNF
4NF:R中每个非平凡多值依赖x->->y(y⊄x),x都含有码
规范化:一个低一级范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合
公理系统:设U是属性集总体,F是U上的一组函数依赖,对关系模式R<U,F>有以下推理规则
- 自反律:若Y⊆X⊆U,则F中包含X->Y
- 增广律:若F中包含X->Y,且Z⊆U,则F中包含XZ->YZ
- 传递律:若F中包含X->Y和Y->Z,则F中包含X->Z
- 合并规则:由X->Y,X->Z,有X->YZ
- 伪传递规则:由X->Y,WY->Z,有XW->Z
- 分解规则:由X->Y及Z⊆Y,有X->Z
公理的有效性:由F出发根据公理推导出来的每一个函数依赖一定在F+(F的闭包)中;完备性:F+中的每一个函数依赖必定可以由F出发根据公理推导出来。
求属性集X(X⊆U)关于U上的函数依赖集F的闭包
:1. 令X[0]=X,i=0 2. 求B,B={A | F中的V->W,如果V⊆X,则将W加入B} 3. X[i+1]=B ∪ X[i] 4. 如果X[i+1]=X[i]或X[i]=U,则X[i]就是最终结果,算法终止 5. 否则i=i+1,返回第二步
1
2
3
4
5最小依赖集:满足下列条件
- F中任一函数依赖的右部仅含有一个属性
- F中不存在多余的函数依赖(多余的可以由其他的推出来)
- F中函数依赖左部不存在多余属性
求最小函数依赖集
:1. 如果右边有多个元素,则进行拆分,如 A->BC 拆成 A->B 和 A->C 2. 对F中每个函数依赖X->Y逐一检查:如果从F中除去这个依赖,即G=F-{X->Y},求X在G上的闭包是否包含X->Y。如果包含则除去这个依赖,说明它多余了 3. 函数依赖左边最小化,通过遮住左边的一个元素,对剩下的求闭包看是否包含右边的。如BC->D,如果遮住B,求C+是否包含D,如果是则用C->D代替BC->D 右拆分->去多余->左最小化 例:有关系模式R<U,F>,U={A,B,C,D,E,F,G} F={BCD->A,BC->E,A->F,F->G,C->D,A->G},求F的最小依赖集 第一步:因为右边都是单个属性,所以该步可以跳过 第二步:先遮住BCD->A,求(BCD)+看是否有A,如果有则去掉BCD->A,否则保留,按照此方法依次检查后面的函数依赖 第三步:检查左边不是单属性的函数依赖,如BCD->A 遮住B,发现(CD)+不包含A; 遮住C,发现(BD)+不包含A; 遮住D,发现(BC)+包含A,所以可以用BC->A代替BCD->A
1
2
3
4
5
6
7
8
9
10
11
12
13
14模式分解:
- 无损连接:分解后的表可以通过自然连接恢复到分解前的,且不丢失或增加信息,则称为无损连接
- 保持函数依赖
算法6.2 判断分解是否保持无损连接
:1. 建立一张n列k行的表,每一列对应U中的一个属性,每一行对应分解中的一个关系模式,如果属性Aj属于Ui,则在j列i行交叉处填上aj,否则填bij 2. 对F中每个函数依赖X->Y,查找X属性组中是否有相同行,如果这些相同行中对应Y所在的j列有aj,则将Y列对应的值都改成aj,否则改成bij,其中i为相同行里最小的行 3. 对每个X->Y都试过去,如果有一行全为a1,a2,...,an,则算法终止,该分解具有无损连接性,否则回到第二步做第二趟,如果表不再改变,且没有一行全为a,则不具有无损连接性 注:ij都是指下标,i表示行,j表示列 很难懂的样子...看栗子: 已知R<U,F>,U={A,B,C,D,E},F={AB->C,C->D,D->E},R的一个分解ρ={R1(A,B,C),R2(C,D),R3(D,E)},判断此分解是否具有无损连接性。 解:由算法构造出初始表 A B C D E R1 a1 a2 a3 b14 b15 R2 b21 b22 a3 a4 b25 R3 b31 b32 b33 a4 a5 对AB->C:因为AB列没有相同分量,所以表不改变 对C->D:C列第1、2行相同,且D列第2行有a4,所以将b14改成a4 对D->E:D列第2、3行相同,且E列第3行有a5,所以将b15、b25都改成a5 修改之后的表为: A B C D E R1 a1 a2 a3 a4 a5 R2 b21 b22 a3 a4 a5 R3 b31 b32 b33 a4 a5 由表可看出第一行全为aj,所以此分解具有无损连接。 考试中要写出过程:根据X->Y修改为...(每步一个表)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22算法6.3 符合3NF且保持函数依赖
:1. 求R<U,F>的最小依赖集还是记为F 2. 找出不在F中出现的属性记作U0,这些属性构成一个关系模式R0<U0,F0>,并让U=U-U0 3. 若有X->A∈F,且XA=U,则ρ={R},算法终止 4. 否则,对F按相同左部原则将涉及到的属性分成一组,每一组函数依赖所涉及到的全部属性形成Ui,若Ui⊆Uj(i!=j),就去掉Ui 5. 于是ρ={R1<U1,F1>,...,Rk<Uk,Fk>} ∪ R0<U0,F0>构成R的一个保持函数依赖的分解,且每个Ri均属于3NF 栗子: R<U,F>,U={A,B,C,D},F={A->B,A->C,C->D},分解R使其保持函数依赖达到3NF。 解:F已经是最小依赖集,同时也找不到不在F中的属性,且没有函数依赖包含属性全集。现将F按相同左部原则进行分组,结果为: R1<(A,B,C),A->B,A->C> R2<(C,D),C->D>
1
2
3
4
5
6
7
8
9
10
11算法6.4 符合3NF既保持函数依赖又保持无损连接
:1. 根据算法6.3求出R<U,F>保持函数依赖的分解ρ 2. 设X是R<U,F>的码,令τ=ρ ∪ {R*<X,Fx>} 3. 如有某个Ui,X⊆Ui,将R*<X,Fx>从τ中去掉 或者Ui⊆X,将R<Ui,Fx>从τ中去掉 4. τ就是所求分解 栗子: 设U={A,B,C,D,E},F={A->B,C->D},分解R为一组3NF的关系模式,要求分解既具有无损连接性又保持函数依赖。 解:求得ACE为候选码,根据算法6.3得ρ={R1(AB),R2(CD)}; 因为候选码ACE不在分解后的子关系模式中,所以ρ={R1(AB),R2(CD),R3(ACE)}
1
2
3
4
5
6
7
8
9
10算法6.5 符合BCNF且保持无损连接
:1. 令ρ={R<U,F>} 2. 检查ρ中各关系模式是否均属于BCNF,即每一个决定因素都包含码。若是,则算法终止 3. 若Ri<Ui,Fi>中X->A的X不包含Ri的码,则对Ri进行分解,分解成U1=XA和U2=Ui-{A},代替Ri,返回第二步
1
2
3算法6.6 符合4NF且保持无损连接
:1. 使用算法6.5得到一个满足BCNF的无损连接分解ρ 2. 对每个Ri<Ui,Fi>,若不属于4NF,则将Fi中的多值依赖X->->Y分解成ρ={R1<X,Y>,R2<X,Z>},其中Z=U-X-Y。直到每一个关系模式均属于4NF为止
1
2
# 第七章 数据库设计
- 数据库设计的基本步骤
- 需求分析:建立数据字典
- 概念结构设计:画E-R图
- 逻辑结构设计:表格设计
- 物理结构设计:存取方法、路径选择和建立
- 数据库实施:创建数据库和表,编程
- 数据库运行和维护:性能检测、数据库重组和重构
- 数据字典:包括数据项、数据结构、数据流、数据存储和处理过程5个部分。数据字典是关于数据库中数据的描述,在需求分析阶段建立,是下一步进行概念设计的基础,并在数据库设计过程中不断修改、充实和完善。
- E-R图:实体、属性、实体之间的联系
- 长方形:实体
- 椭圆:属性
- 菱形:关系
- 实体之间的联系:1:1、1:n、m:n
- 属性分为实体属性和联系属性。实体属性是实体本身的属性,与实体直接相连;联系属性是两个实体联系后才有的属性,所以与表示关系的菱形相连,如一个学生本身不具有“成绩”属性,是选择课程之后才有”成绩“这个属性,所以成绩就是联系属性。
E-R图向关系模型的转换
:- 1:1联系->独立的关系模式or与任意一端对应的关系模式合并,如果合并则需要在该关系模式的属性中加入另一个关系模式的码和联系本身的属性
- 1:n联系->独立的关系模式or与n端对应的关系模式合并,如果独立则关系模式中的属性为与该联系相连的各实体的码以及联系本身的属性,码为n端实体的码
- m:n联系->独立的关系模式,关系模式中的属性为与该联系相连的各实体的码以及联系本身的属性,各实体的码组成关系的码或关系码的一部分
- 具有相同码的关系模式可以合并
- 考试时要指出每个关系模式的主码和外码