第一章 引言
1.数据库系统的目标
用文件系统存储数据存在缺陷:
数据的冗余和不一致;数据访问困难;数据孤立等
2.数据视图
- 物理层
- 逻辑层
- 视图层
3.数据模型
四要素:
- 数据
- 数据联系
- 数据语义
- 一致性约束
4.基本概念
- DB
- DBMS
- DBA
- DBS
第二章 关系模型介绍
1.关系数据库的结构
元组(tuple)
2.码
超码(superkey)
候选码(candidate key)--最小超码
主码(primary key)--被选中的候选码(not null)
外码(foreign key)--eg.在Employees
表(参照关系--referencing relation)中,DepartmentID
列被设置为外键,它引用了Departments
表(被参照关系--referenced relation)中的DepartmentID
列。
第三章 SQL(基础)
1.SQL语言概述
包括数据定义语言 (DDL)、数据操纵语言 (DML)、完整性约束、视图定义、事务控制、嵌入式 SQL 和动态 SQL、授权等
2.数据定义语言(DDL)
作用: 定义关系模式、删除关系、修改关系模式。
数据类型: char(n), varchar(n), int, smallint, numeric(p,d), real, double precision, float(n) 等。
创建表: 使用 create table 语句,指定关系名、属性名和数据类型,可添加完整性约束。
删除表: 使用 drop table语句,删除表及其内容(delete from 表名 删除关系表的所有内容,但保留表结构)
修改表: 使用 alter table 语句,可以添加或删除属性。
完整性约束:主码约束,外码约束,非空约束
! 表的删除顺序也需遵循完整性约束
3.数据操纵语言(DML)
查询: 使用 SELECT
语句,包括 select 子句、from 子句和 where 子句。
单关系查询: 查询一个关系中的数据,可以指定查询的属性、条件、排序等。
多关系查询: 查询多个关系中的数据,需要进行笛卡尔积和选择操作。
更名运算: 使用 AS
子句重命名属性或关系。
字符串运算: 使用 LIKE
操作符进行模式匹配。
- 字符串采用单引号(' ');
- %--匹配任意子串
- _--匹配任意一个字符
排序: 使用 ORDER BY
子句对查询结果进行排序。(asc 升序;desc 降序)
布尔运算: 使用 AND
, OR
, NOT
等逻辑连词进行布尔运算。
集合运算: 使用 UNION
, INTERSECT
, EXCEPT
等运算符进行集合运算。
空值: 使用 NULL
表示未知或不存在,需要注意空值对算术运算、比较运算、集合运算的影响。
- 空值表示值未知(unkown)或者不存在
- 任何与空值的比较返回 unknown
- 空值进行布尔运算
聚集函数: 使用 AVG
, MIN
, MAX
, SUM
, COUNT
等函数进行聚集运算。
分组聚集: 使用 GROUP BY
子句对查询结果进行分组,并结合聚集函数进行计算。
HAVING 子句: 对分组设置限定条件。HAVING子句的作用与WHERE子句类似,但是WHERE子句不能用于聚合函数上的筛选。
- 任何出现在 having 子句中,但没有被聚集的属性必须出现在 group by子句中
- eg.
嵌套子查询: 将子查询嵌套在另一个查询中,用于进行集合成员资格、集合比较、集合的基数等操作。
集合成员资格:使用 in 和 not in
集合比较:some(any)关键词;all关键词
重复元组存在性测试: 使用 UNIQUE
结构测试子查询结果中是否存在重复元组。
FROM 子句中的子查询: 将子查询作为关系处理。
WITH 子句: 定义临时关系,用于简化查询。
标量子查询: 子查询结果只返回单个值,可以出现在任何返回单个值的地方。
相关子查询:一种类型的子查询,它依赖于外部查询(主查询)中的值。
4.数据库的修改
- 删除(delete)
- 插入(insert)
- 更新(update)
5.其他
- SQL 语句不区分大小写。
SELECT
子句中的星号(*)表示所有属性。AS
关键字是可选的,但建议使用以提高可读性。NULL
与任何值的比较都返回UNKNOWN
。- 聚集函数除了
COUNT(*)
外都忽略输入集合中的空值。 WITH
子句定义的临时关系只在包含WITH
子句的查询中有效。CASE
结构用于条件表达式,可以避免更新次序引发的问题。
第四章 中级SQL
1.连接表达式(重点)
连接运算: 输入两个关系,返回一个新的关系作为结果。连接运算是一个笛卡尔积,要求两个关系中的元组相匹配(符合某种条件)。
自然连接: 两个关系基于相同的属性进行连接,并自动选择相同的属性。例如,连接 student
和 takes
表,基于 ID
属性连接。(会自动去掉重复列)
连接条件: 可以使用 ON
子句指定连接条件,比自然连接更灵活,可以表示任何 SQL 谓词。
外连接: 避免信息丢失,将未匹配的元组也添加到结果中,使用 NULL
值表示缺失的信息。
左外连接: 保留左关系中的所有元组,即使右关系中没有匹配的元组。
eg.
右外连接: 保留右关系中的所有元组,即使左关系中没有匹配的元组。
全外连接: 保留两个关系中的所有元组。
2.视图(虚表)
定义: 视图是用户可以看见的“虚关系”,通过 CREATE VIEW
语句定义,可以隐藏特定数据。
eg.创建教师的视图,不显示薪水
create view faculty as
select ID, name, dept_name
from instructor;
更新: 视图可以更新,但需要满足特定条件,例如 SELECT
子句只能包含简单属性名,不能包含表达式、聚集函数等。
可更新视图: 满足特定条件的视图可以进行更新操作。
物化视图: 存储视图关系,并保证与实际关系同步更新。
视图更新问题: 一些视图更新无法被唯一翻译,例如包含多个关系或包含聚合函数的视图。
3.事务
定义: 一个工作单元,由一系列查询和/或更新语句组成,由提交或回滚结束。
提交: 将事务所做的更新永久保存到数据库。
回滚: 撤销事务中所有更新,当做没有发生。
原子性: 事务要么完全执行,要么完全回滚。
隐式事务: 每个 SQL 语句默认自成一个事务,并自动提交。
4.完整性约束
定义: 防止数据被意外破坏,保证数据的一致性。包括实体完整性和参照完整性。
单个关系上的约束:
NOT NULL
: 属性值不能为空。PRIMARY KEY
: 属性集唯一标识元组,值不能为空。UNIQUE
: 属性值唯一,允许为空。CHECK
: 指定属性值必须满足的条件。【check (P),其中 P 是谓词】
参照完整性: 保证一个关系中属性集的取值也存在于另一个关系的特定属性集中。
级联操作: 在删除或更新参照关系中的元组时,自动更新或删除引用关系中的元组。
复杂约束: 使用 CHECK
子句中的子查询或断言表达更复杂的约束条件。
5.SQL 数据类型与模式
数据类型:
- 基本数据类型: 数字、字符、日期/时间等。
- 用户自定义类型: 创建基于基本数据类型的类型。
- 域: 创建带有约束的用户自定义类型。
- 大对象类型: 存储大型二进制或字符数据。
- 标识列:IDENTITY(自增)
模式: 数据库对象的命名空间,例如表、视图等。
目录: 包含数据库对象的集合。
6.SQL 中的索引定义
定义: 数据结构,用于快速查找关系中具有特定属性值的元组。
创建索引: CREATE INDEX
语句,指定索引名、表名和属性列表。
唯一索引: 索引键中不包含重复的值。
聚集索引: 索引的顺序与数据在表中的物理存储顺序相同。
7.授权
定义: 授予用户对数据库对象的访问权限。
权限类型: 读取、插入、更新、删除等。
授权语句: GRANT
语句,指定权限列表、对象和用户/角色列表。
eg.grant select on instructor to U1, U2, U3;
收回权限: REVOKE
语句,回收用户/角色的权限。
eg.revoke update (budget) on department from U1, U2, U3;
角色: 管理权限的分组,可以授予给用户或角色。
视图授权: 对视图授权,并不代表对视图相关实际关系的授权。
模式授权: 授予用户对数据库模式的访问权限。
权限转移: 权限的传递和收回过程。
第五章 高级SQL
1.动态SQL和嵌入SQL
- 动态SQL:动态SQL是指在程序运行时动态构造和执行的SQL语句(JDBC,ODBC)
- 嵌入式SQL:嵌入SQL是指将SQL语句直接嵌入到程序代码中
2.使用程序设计语言访问数据库
- JDBC
- ODBC
3.函数和过程
4.触发器
触发器机制:指明什么时候执行触发器(检测事件+满足条件),指明触发器执行时所采取的动作。
第六章 形式化关系查询语言
1.关系代数(重点)
过程化查询语言,包含6个基本运算:
- 选择 (σ):根据条件筛选元组
- 投影 (π):选择关系中的特定属性
- 并 (∪):合并两个关系中的元组
- 集合差 (-):找出存在于第一个关系中但不存在于第二个关系中的元组
- 笛卡尔积 (×):组合两个关系中的元组
- 更名 (ρ):为关系或属性命名
关系运算的复合:可以将多个关系代数运算组合起来,形成更复杂的查询。
连接运算:
- Theta连接:根据特定条件连接两个关系
- 自然连接:连接具有相同属性名的关系
多重集关系代数:与SQL语法兼容,保留关系中的重复元组。
2.元组关系演算(声明式)
3.域关系演算(声明式)
第七章 数据库设计和ER模型
1.实体-联系模型(Entity-Relationship)
概念模型: 将用户需求抽象为信息结构的过程,特点为真实、易理解、易更改、易转换。
设计过程: 需求分析 -> 概念设计 -> 逻辑设计 (ER图映射为关系模式)-> 物理设计
设计问题: 冗余(重复信息)、不完整
E-R模型: 用于数据分析和描述的工具,以E-R图为主,清晰易懂,完整精确。
2.实体-联系模型要素
实体集: 实体集用矩形表示,属性在矩形内列出,主码属性以下划线标明。
联系集: 联系集用菱形表示,线段连接实体集和联系集。
- 联系集也可以有属性
- 联系集的度:参与联系集的实体集数目称为联系集的度
复杂属性: 域–每个属性可取值的集合,也称值集
映射基数: 实体通过联系集关联的实体的数量,分为一对一、一对多、多对一、多对多。
一对一
一对多
参与约束: 实体是否必须参与联系集,分为全部参与和部分参与。(非重点)
主码: 唯一标识实体的属性集。
联系集的码:
二元联系集主码的选择取决于联系集的映射基数:
- 多对多联系:参与实体集的主码属性的并集成为主码
- 一对一联系:任何一个实体集的主码都可以选为主码
- 多对一或者一对多联系:“多”方实体集的主码构成主码
弱实体集: 没有足够属性形成主码的实体集,依赖于标识实体集。
从实体集中删除冗余属性:属性重复了联系中的信息,应该从实体集中除去
复合属性: 由多个子属性组成的属性,例如姓名由名、中间名、姓组成。
多值属性: 一个实体可以拥有多个值的属性,例如电话号码。
派生属性: 可以从其他属性派生出来的属性,例如年龄可以由出生日期派生。
3.转换为关系模式(逻辑模型)
强实体集: 与强实体集对应的关系模式具有相同的属性和主码。
- 简单属性:从具有简单属性的的强实体集转换而来的模式与强实体集具有相同属性、主码
- 复杂属性:
弱实体集: 与弱实体集对应的关系模式包含弱实体集的属性和所依赖的强实体集的主码。
联系集: 与联系集对应的关系模式包含参与实体集的主码属性和联系集的描述性属性。
模式的冗余: 弱实体集与其标志强实体集之间的联系集模式是冗余的。
模式的合并:合并一对一和一对多的联系集
第八章 关系数据库设计
1.数据库设计
设计目标:
- 避免冗余数据
- 确保属性间联系得以表示
- 方便检查更新是否破坏了数据库完整性约束
规范化理论:
2.函数依赖
定义:如果关系中所有合法实例都满足“决定”,则称为函数依赖。
函数依赖和码:
类型:平凡函数依赖和非平凡函数依赖,完全函数依赖和部分函数依赖,传递函数依赖。
平凡函数依赖:指在一个关系中,属性集合Y是属性集合X的子集时,存在函数依赖X → Y。eg.AB → A
闭包:
- 函数依赖集的闭包:从函数依赖集推导出的所有函数依赖的集合。
- 属性集的闭包:令a为一个属性集,我们将函数依赖集F下被a函数确定的所有属性的集合称为F下a的闭包。
- 正则覆盖:最小函数依赖集
无损分解:分解后能够通过连接恢复原始关系的分解方式。
保持依赖:函数依赖;多值依赖
3.范式
1NF (第一范式): 关系模式的所有属性都是不可分的基本数据项。
2NF (第二范式): 关系模式满足 1NF,且非主属性完全函数依赖于任何候选码。
3NF (第三范式): 关系模式满足 2NF,且非主属性不传递依赖于任何候选码。
对于F+ 中所有形如 a -> b 的函数依赖,以下至少一项成立:
1.a -> b 是平凡函数依赖(i.e., b Í a )
2.a 是R 的一个超码
3.b – a 中的每个属性A都包含在R 的一个超码中.
BCNF (Boyce-Codd 范式): 关系模式满足 3NF,且所有函数依赖的决定因素都是候选码。【一定无损连接但不一定保持依赖。】
一个关系模式 R 是BCNF的条件是
对于F+ 中所有形如 a ->b 的函数依赖,以下至少一项成立:
1.a ->b 是平凡函数依赖
2.a 是R 的一个超码
4NF (第四范式): 关系模式满足 BCNF,且不存在非平凡的多值依赖。
第十二章 查询处理
1.概述
查询处理是指从数据库中提取数据时涉及的一系列活动。
2.基本步骤
- 语法分析与翻译
- 优化
- 执行
3.术语大集合
计算原语:加了“如何执行”注释的关系代数运算
查询执行(计算)计划:用于执行一个查询的原语操作序列
查询执行引擎
查询优化: 构造具有最小查询执行代价的查询执行计划的这项工作
第十三章 事务管理
1.事务概念
定义: 事务是访问并可能更新各种数据项的一个程序执行单元,由 begin transaction 和 end transaction 语句界定。
ACID特性:
- 原子性 (Atomicity)
事务的所有操作在数据库中要么全部正确执行,要么全部执行失败
- 一致性 (Consistency)
隔离执行事务时(在没有其他事务并发执行的情况下)保证数据库的一致性
- 隔离性 (Isolation)
尽管多个事务可以并发执行, 但每个事务必须感觉不到其他并发执行的事务,中间事务结果必须对其他并发执行的事务隐藏
- 持久性 (Durability)
一个事务成功完成后,它对数据库的改变必须是永久的,即使系统可能出现故障
2.事务状态
活跃状态: 事务执行时处于这个状态。
部分提交状态: 最后一条语句执行后。
失效状态: 发现正常的执行不能继续后。
中止状态: 事务回滚并且数据库已经被恢复到事务开始执行前的状态。
提交状态: 成功完成后。
3.事务的隔离性
并发执行: 多个事务同时执行可以提高吞吐量和资源利用率,减少等待时间。
调度: 将一组并发事务的指令按照时间顺序排序的一个指令执行序列。
可串行化: 一个 (可能是并发的) 的调度是可串行化的,如果它等价于一个串行调度。
冲突可串行化: 如果调度 S 可以通过一系列非冲突指令的交换转换为调度 S´, 我们称 S 和 S´ 是冲突等价的。(冲突指令是针对同一数据项的)
可恢复调度: 对于每对事务 Ti 和 Tj ,如果 Tj 读取了之前由 Ti 写入的数据项,则 Ti 先于 Tj 提交。
无级联调度: 对于每对事务 Ti 和 Tj ,如果 Tj 读取了之前由 Ti 写入的数据项,则 Ti 必须在 Tj 这一读操作前提交。
4.事务的隔离性级别
可串行化 (Serializable): 可串行化调度。
可重复读 (Repeatable Read): 只允许读取已提交的数据,该事务对同一个数据的重复读取必须返回相同值。
已提交读 (Read Committed): 只允许读取已提交的数据,但不要求可重复读。
未提交读 (Read Uncommitted): 允许读取未提交的数据。
5.并发控制机制
锁: 事务T对某个数据对象操作之前,先向系统发出请求,对其加锁。加锁成功后,事务T开始对该数据对象进行操作,在事务T释放它的锁之前,其它的事务不能更新此数据对象。
时间戳: 为每一个事务分配一个时间戳,通常是当事务开始的时候。
多版本和快照隔离: 通过维护数据项的多个版本,可以允许一个事务读取一个数据项的旧版本。