视频链接
mark一下链接
数据模型: CH01-2 数据模型
数据库系统的结构: CH01-3 数据库系统的结构
关系模式的数据结构和完整性约束规则: CH02-Part1 关系模式的数据结构…
关系代数: CH02-Part2 关系代数
SQL概述及数据定义语句: CH03 SQL-part1
简单查询及多表连接查询: CH03 SQL-part2
嵌套查询: CH03 SQL-part3
实践课SQL Server示范: MSSQL实践示范
实践课MySQL 示范: MySQL实践示范
关系数据理论-函数依赖与公理系统: CH06 关系数据理论1-upd1
关系数据理论-最小覆盖、正则覆盖、范式与多值依赖: CH06 关系数据理论2
关系数据理论-无损连接、保持函数依赖与模式分解: CH06 关系数据理论3-upd1
关系查询处理与优化: CH09 关系查询处理和查询优化
数据库恢复技术: CH10 数据库恢复技术
并发控制: CH11 并发控制
主要内容

第一章 绪论
概述
数据是数据库中存储的基本对象,数据与其语义密不可分
数据库是长期储存在计算机内,有组织的,可共享的大量数据集合
数据库管理系统(DBMS)
- 功能:
- 数据定义功能
- 数据组织、存储和管理
- 数据操纵功能
- 数据库的事务管理和运行管理
- 数据库的建立和维护功能
- 功能:
数据库系统:将数据库引入计算机系统后的系统构成

数据模型
概念模型
按照用户的观点来对数据和信息建模,例如**E-R(实体-联系)**模型
概念模型是从现实世界到机器世界的第一层抽象,是设计人员和用户之间进行交流的语言
几个基本概念
实体型之间的联系
特殊之处如下图:
1:1也可以有实体型之间不存在连接
1:N中的$N\geq0$
M:N中的$N\geq0,N\geq0$
E-R图:
存在一对一联系,也存在多对多联系
逻辑模型
从计算机实现的观点来对数据建模,例如层次模型、网状模型、关系模型、面向对象模型
组成要素
- 数据结构:描述数据对象的静态特性,数据结构刻画了数据模型的主要特征,因此,常以数据结构的类型来命名数据模型
- 数据操作:描述数据对象的动态特性,即对象的实例允许执行的操作以及操作规则
- 完整性约束条件:规定数据库状态以及状态变化应该满足的条件
每个实体和每个多对多联系,最终都会用一个关系来实现,实体的属性就是关系的属性,实体的码就是关系的码,两个实体的多对多联系其对应的关系的属性来自两个关系的码加上来自关系自己的属性,而且那两个实体的码将联合起来做这个关系的主码
E-R图实例
下图一共需要六张表
学生、课程、教师三个实体需要三张表
三个联系也需要三张表
一共需要六张表

上述概念模型中学生和老师之间的联系是多余的,可以删掉
下图就需要四张表

图书管理系统中读者和书应该是N:N的,一本书可以被多个读者借阅过
下图中1:N就不合适

酒厂
下图中从左到右的改进
酒和厂家之间是一对多的联系,上图只需要两个表,与上面的学生选修课程的类似也是两个实体+一个联系,但选修课程需要三个表,因为选修课程是多对多的N:N关系,而这个是一对多的1:N的关系
只需要在一对多的“多”那一端多加一个属性(一端的主码)即可

上图中食物的“评分”和“价格”并非其独有属性,应该是“供应”这个联系的属性
如下图所示:(包含实现需要用的表的结构)

演员-电影-制片公司
根据语义取舍E-R图的结构
要求:

以下两种E-R图都可行,要根据语义取舍
A:需要五个关系
B:只需要四个关系
可以储存制片公司和演员之间的信息,例如:“一个演员的片酬如何由相应的制片公司分摊”
三个实体之间的三元联系和两两之间的二元联系是不等价的,其各自表达的语义也不相同
多对多联系和实体之间是可以互相转化的
层次模型
结点的双亲是唯一的
层次模型只能处理一对多的联系
其数据结构就是普通的树
多对多的联系在层次模型中 采用间接表达,多对多分解成一对多
层次模型是数据库系统中最早出现的数据模型
网状模型
允许一个以上的结点没有双亲
一个结点可以有多余一个的双亲(否定了树形结构)
同样只能直接处理一对多的实体联系,多对多要间接处理
关系模型
- 最重要的一种数据模型,也是目前主流的数据模型
- 关系模型的数据结构是一张二维表,由行和列组成

冗余的列信息表达彼此之间的联系
一些概念:
关系模式举例:
学生(学号,姓名,年龄,性别,系,年级)
举例:
数据库系统的结构
三级模式结构
二级映象功能与数据独立性
从用户角度看数据库系统的结构
模式结构
也就是
内模式(数据物理结构和存储方式)
↓
模式(数据逻辑结构和特征)
↓
外模式(局部数据的逻辑结构和特征)
模式
外模式
外模式与应用的关系:一对多
外模式是保证数据库安全的有效措施
内模式:存储模式、物理模式
一个数据库只有一个内模式
结构图:

外模式/模式映象
用途:保证数据的逻辑独立性
模式/内模式映象
用途:保证数据的物理独立性
模式结构实操
用户角度看数据库系统的结构
单用户数据库系统
整个数据库系统(应用程序、DBMS、数据)装在一台计算机上,为一个用户独占,不同机器之间不能共享数据
主从式结构的数据库系统
一个主机带多个终端
分布式结构
客户/服务器结构(C/S结构)
应用程序需要安装
启动独立的窗口
示意图:某些主机安装DBMS成为数据库服务器,另外的安装客户应用程序
浏览器/服务器结构(B/S结构)
不需要安装
第二章 关系数据库
关系模型的三大要素:数据结构、数据操作、完整性约束规则
关系数据操作语言:关系代数语言、关系演算语言和结构化查询语言(SQL)
关系数据结构
关系中的概念
域:一组具有相同数据类型的值的集合
笛卡尔积:所有域所有可能取值的组合
元组和分量
基数
关系:
关系是笛卡尔积中有意义的子集
关系中不同的列可以对应相同的域,但每一列都必须有各自的属性
n目关系必有n个属性
例如:一个关系中既有出生日期,也有参加工作的日期,这是两个属性,但他们都来自日期域
候选码-全码-主码-外码
主码和对应的外码可以不同名,但语义应该相同
举例:
“成绩”关系中主码由两个属性“学号”和“课号”组成
三类关系
关系模式

关系数据库

关系操作
关系代数-关系演算-SQL
关系的完整性
实体完整性

主属性不能取空值,所有的主属性都不能取空值
参照完整性
主码和对应的外码可以不同名,但语义应该相同

但是在下面的例子中
由于“选修”关系中,“学号”和“课程号”既是外码,也是主码,既要遵循实体完整性,又要遵循参照完整性,所以两个属性不能取空值
![]()
用户定义的完整性

举例:
下图中AD可以,BCE不可以插入

关系代数
概述
关系代数是一种抽象的查询语言,用对关系的运算来表达查询
运算对象和结果都是关系,运算符有:集合、关系、比较、逻辑


传统的集合运算
注意关系代数表达
并:
差:
差运算不满足交换律
交:
元组的连接
笛卡尔积
专门的关系运算
几个记号

【象集】的实例:


选择$\sigma$
举例:
且有下面的式子
要能根据查询需求写出关系代数的式子
投影$\pi$
“从R(U)中选择出若干属性列组成新的关系”
投影的结果要去掉相同的行
通常情况下投影和选择不满足交换律
投影与选择的区别
选择是对行的筛选,投影是对列的筛选
连接$\theta$
等值连接、自然连接
R和S中都有叫做B的属性,为了以示区别,要使用R.B和S.B
等值连接:
上述连接结果中R.B和S.B两列属性完全相同,将相同的属性去重,即得到自然连接的结果(自然连接要连接所有的相同属性)
外连接
悬浮元祖:被丢弃的元组
例如下图:
自然连接可以用基本的关系运算表达:
除
例子:
R÷S的结果一定来自R中除了(R和S共有属性)之外的属性,即属性A
一般用来选择:“选修了所有选修课的人”、“在所有案发现场都有踪迹的人”
用基础运算表达:
例题

总结

第三章 SQL
SQL概述及数据定义语句: CH03 SQL-part1

SQL基本概念
表对应模式,视图对应外模式,存储文件对应内模式

基本表-视图-游标-查询表

游标是集合运算和行运算的桥梁

成绩管理数据库
本章举例都用到这个表

实例:

数据定义
数据定义语句
模式的定义
直接跳过了
基本表的定义

最常用的完整性约束

[]
内为可选内容
[,...n]
表示可以重复n次

列约束:
ON DELETE和ON UPDATE是参照完整性约束,决定级联删除和级联更新
CHECK是用户定义的完整性约束
表约束
与列约束不同的是没有NULL与NOT NULL的约束
PRIMARY KEY约束要加上
(列名[ASC|DESC][,...n])
外码约束FOREIGN KEY同样
数据类型:

创建表

列约束写法:


删除表

修改基本表



索引的定义
- 建立索引是加快查询速度的有效手段

建立索引
普通索引vs聚簇索引

删除索引

例如

修改索引
最好先drop,再create
数据字典

数据查询
单表查询
简单查询及多表连接查询: CH03 SQL-part2
基本结构:
from子句
where子句

上述展示了三种重命名的方式
distinct
对查询结果进行去重

LIKE
表示模糊查询/模式匹配
例3.28表示以U2017
开头的任何字符串都满足条件
例3.29表示以U2016
/U2017
开头

如果要查询的字符串本身就含有%
或_
在下例中%/%%
,两侧的%
表示通配符,中间的用/
转义的%表示要查询的%

select Sno,Cno from SC where Grade IS NULL
NULL要用IS进行选择,不能用=或≠
聚集函数

病句:

兼容的正确写法:

使用了嵌套查询
分组统计查询(Group by)
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句

HAVING是先分组再筛选记录,WHERE在聚合前先筛选记录。
也就是说WHERE作用在GROUP BY 子句和HAVING子句前;而 HAVING子句在聚合后对组记录进行筛选
例3.39:

在上例的基础上加上“且成绩在90分以上”,写法如下:

WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。
因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数。
如下例,控制平均成绩在80分以上,只能使用having子句,不能使用where子句


group by之后的列表,必包含select列表中除去集函数之后的列表
列出至少有三门功课在90分以上的学生学号及这些同学的平均成绩

难点在于确认行选择where
和组选择having
的写法
==不能在行选择中加入条件“成绩>90分”,这样的话求的平均成绩就是大于90分那些课的平均成绩了,所以两个限制条件(“三门”和“90分以上”)都要在having子句中实现==
用函数实现

兼容的写法:(嵌套查询)


仍然是利用top 3
或linmt 3

group by left(sname,1)
之后,count(*)
就表示对surname
进行计数
连接查询
等值连接
通过在
FROM
子句中指定连接类型,也可以实现,如下:
列出每门课的间接先修课(先修课的先修课)


既选修课1,又选修课2的学生的学号(将表自身做等值连接)

右外连接

外连接+where行选择

外连接的连接条件无法用where子句的条件替代
而内连接join是可以用where替代的,前面例子中也有提到

group by
分组不能只有Sno
,必须有sname
因为:(参考例3.39)
统计函数和组别属性不一定非要出现在查询列表中,但非统计函数及非组别属性,一定不允许出现在查询列表中
人话:
查询列表(select后面跟的)∈ [组别属性(group by 后面跟的)+统计函数(Avg、Max等)]
也就是说:
select < group by + having
嵌套查询
嵌套查询: CH03 SQL-part3

一个例子:
这个例子也可以用自身连接实现:
又一个例子:
用嵌套查询写:
列出每个同学超过其平均成绩的课程号:
X.sno
是父查询中的sno,``sno=X.sno`表示相关子查询子查询的执行结果每次都不同,和父查询的``X.sno`相关
谓词:
exists谓词:
exists和in谓词可以互相替代:
一个替换的例子:
没有选修数据库的学生学号和姓名:not exists
exists谓词是逻辑表达能力最强的谓词
SQL没有全称量词,但总是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词
查询选修了全部课程的学生姓名→不存在有一门课程,该学生没有选修
例子:
语句:
使用exists子查询
查询至少选修了学生15122(学号)选修的全部课程的学生学号
结果:
求既选修了1号又选修了2号课程的学生学号:
求至少选修了两门课程的学生学号:
使用集函数:
group by
集合查询
查询结果进行集合操作

基于派生表的查询
列出每个同学超过其平均成绩的课程号
原先的相关子查询的方法:
弊端是每个记录都要计算一次平均成绩
下图,使用基于派生表的查询
用join子句表达:
where子句中的两个或一个条件均可以移到on中表达
列出至少有三门课程成绩90分以上的学生学号及其平均成绩(基于派生表)
先筛选出有三门课程90分以上的学生得到派生表,连接条件是
sc.sno=cnt.sno
再
group by sc.sno
并求平均成绩嵌套查询方法 in谓词
exists谓词
列出计算机系(‘CS’)没有获得‘数据库’课程学分的男生学号和姓名
第六章 关系数据理论
函数依赖
==X→Y:X确定Y Y依赖于X==
定义:
排除函数依赖,只需要一组反例,不满足上面的规定
函数依赖也可以成组
一个例子:
相互依赖和不依赖的符号:
有关函数依赖的几点说明
函数依赖与属性之间的联系类型有关
1:1 X↔Y
m:1 X→Y
m:n 无函数依赖
仅对于下图:
因为==找不出反例==,所以
B→ABCDE
成立平凡函数依赖和非平凡函数依赖:
完全函数依赖与==部分==函数依赖
(多不多于)
==传递==函数依赖:
码
外码
函数依赖的公理系统
逻辑蕴含
函数依赖集的闭包
属性集的闭包
由于任何属性都能函数决定自己,所以属性集的闭包不可能是空集
Armstrong公理系统
其正确性和完备性:
合并律、分解律、伪传递律
揭示了函数闭包与属性集依赖之间的关系
引理6.2:
引理6.3:
一个例子:
==求属性集闭包的算法==
一个例子:
一个例子:
一个例子:
函数依赖集的等价定义:
方法:
极小函数依赖集
做法:
最小依赖集不一定是唯一的,和循环中的处置顺序有关
正则依赖F
c在求得最小依赖集后,将左部相同的函数依赖合并,即得到正则依赖
求关系模式的候选码
一些定义:(**==是针对属性定义的==**)
两个结论:
求候选码的步骤:
一个例子:
==(AD)^+^表示AD的闭包==
范式与规范化
范式:
1NF:
2NF:
3NF:
不允许非主属性对码的传递性依赖
任何二元关系模式R(A,B)必为3NF
没有非主属性的范式一定是三范式3NF
3NF仍然可能存在冗余与更新异常,因为还可能有主属性对候选码的部分函数依赖和传递函数依赖
BCNF:
每一个非平凡函数依赖左部一定包含一个候选码
如果R∈BCNF,则R∈3NF
- 事实上,3NF有另外一个定义:关系模式R的所有非平凡函数依赖,要么左侧包含候选码,要么右侧是主属性
- 任何二元关系模式R(A,B)必为BCNF
一个例子:
多值依赖、4NF
关系数据理论-无损连接、保持函数依赖与模式分解: CH06 关系数据理论3-upd1
没看
第八章

第九章 关系查询处理和查询优化
查询处理
4个阶段:
查询分析
查询检查
查询优化
查询执行
查询操作算法示例
选择操作


连接操作

查询优化
代价模型
代数优化和物理优化:
代数优化
关系代数的等价变换规则
几种运算的交换律和结合律
投影的串接定律
选择的串接定律
选择与投影的交换律
选择与笛卡尔积的交换律
先选择再做笛卡尔积
选择与一些运算的分配律
确保先做选择,再做其它运算
等等
查询树的启发式优化


优化查询树步骤
- ==分解选择运算==
- ==通过交换选择运算,将其尽可能移动到叶端==
- ==通过交换投影运算,将其尽可能移动到叶端==
- ==合并选择和投影的串接==
- ==对内结点分组(用双目运算分隔)==
例子1



例子2




投影运算在下移的过程中要保留连接的属性(下图中多出来的cno)

蓝色箭头处的投影可以去掉,其他的投影运算都跟在一个选择或连接运算之后,而箭头处的没办法和选择/连接运算一起,导致产生额外的开销

物理优化
代数优化改变查询语句中操作的次序和组合,不涉及底层的存取路径
物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划
没看
第十章 数据库恢复技术
事务的基本概念
事务是恢复和并发控制的基本单位
事务的ACID特性:
原子性(Atomicity)一致性(Consistency)
隔离性(Isolation)持续性(Durability )commit和rollback
一个例子:
恢复的实现技术

日志文件
主要有两种格式:
以记录为单位的日志文件
以数据块为单位的日志文件
日志文件的作用:
恢复的策略
事务故障的恢复步骤
系统故障的恢复
一个例子:
介质故障的恢复步骤
因为装入的是以前的数据库副本,所以不需要UNDO日志中未提交的事务
具有检查点的恢复技术
提出问题:
检查点记录的内容:
- 建立检查点时刻所有正在执行的事务清单
- 这些事务最近一个日志记录的地址
通常故障发生时,【重新开始文件】的最后一个检查点记录最有价值
在检查点如何维护日志文件:
使用检查点可以提高恢复效率
例子:
步骤
注意:将UNDO-LIST初始化为ACTIVE-LIST
每遇到一个新开始的事务,就送入UNDO-LIST,有提交的事务,则将其从UNDO-LIST移入REDO-LIST
数据库镜像
SQL Server的恢复技术
都没看
小结

第十一章 并发控制
并发操作可能带来的数据不一致性
丢失更新举例:
读脏数据
读脏举例:
不可重复读:
不可重复读举例:
封锁
封锁的类型:
封锁类型的相容矩阵
一个对象上如果有两个锁,那一定是两个S锁
封锁协议
约定何时申请X锁或S锁,以及持锁时间、何时释放
一级封锁协议:
只能防止丢失更新
二级封锁协议:
防止丢失更新+读脏
但还是无法避免【不可重复读】
三级封锁协议:
X锁和S锁都是事务结束才释放
三种问题全都能防止
三种协议主要区别:
活锁和死锁
活锁:
死锁:
死锁产生条件:
死锁的预防:
一次封锁法:每个事务事先一次获得所有所需数据的全部锁
顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁
死锁的监测:
超时法:一个事务的等待时间超过了规定的时间,就认为发生了死锁等待图法:
并发调度的可串行性
一个不可串行化的调度:
产生了不可重复读的问题,遵循的是二级封锁协议
可串行化的调度:
冲突
冲突可串行化调度
冲突可串行化的调度一定也是可串行化调度
冲突可串行化调度是可串行化调度的充分条件,不是必要条件
可串行化调度不一定是冲突可串行化调度
两段锁协议
定义:
- 在释放一个封锁之后,事务不再获得任何其他封锁
一次封锁法和两段锁协议
封锁的粒度


- 本文链接:https://wan-nan.github.io/2022/05/03/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA%E7%AC%94%E8%AE%B0/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。