Skip to content

第一部分 绪论

数据与数据库

数据库的特点

  • 整体数据的结构化
  • 数据的共享性强,冗余度低且易于扩充
  • 数据的独立性
  • 数据由数据库管理系统统一管理和控制
  • 整体数据的结构化是数据库系统阶段与文件系统阶段的本质区别
  • 数据的独立性分为物理独立性逻辑独立性

数据模型

概念模型

**概念模型是对现实世界的事物符号化的描述,为计算机处理做准备。 **

常用的概念模型是E-R (Entity-Relationship)图 。

数据模型的三要素

  • 数据结构
  • 数据操纵
  • 完整性约束

三级模式

外模式(可以有多个)

外模式是用户看到的,不同用户看到的不同,比如老师、学生

外模式 ≠ 视图,但视图是外模式的一种实现方式

可以这么理解:

  • 外模式(External Schema / View Schema) 是一个 概念,指数据库为不同用户提供的 个性化、局部的数据视图
  • 视图(View) 是数据库系统里 实现外模式的主要手段之一

所以:

外模式比视图大,视图只是外模式的具体实现方式之一。

模式(只能有一个)

模式 = 数据库的逻辑结构定义。

也可以说:

模式就是数据库在逻辑层面上的“总体设计蓝图”。

它规定了数据库里有哪些表、每个表有哪些字段、字段类型是什么、主键外键是什么、约束是什么等。

两级映像

常考的题目

第二部分 关系模型

几个重要概念

理解成定义域、值域,就是取值范围

笛卡儿积

就是各种组合方式*(离散数学学过)*

候选码

某一(个)组属性的值可以唯一标识一个元组,而其子集不行

主码

选一个候选码作为主码

  • 主属性是候选码中的各个属性,不仅仅是主属性中的

  • 任意两个元素的码不能相同

关系的完整性

实体完整性

就是主属性不能是空值

空值是不知道、不存在或无意义的值

参照完整性

关系与关系之间可能存在引用,如课程、学生、选课三个关系

外码

R参照了S,例如选课表参照了学生、课程两个表

参照完整性约束

就是那个外码,要有的话,必须是真实存在的,比如选课表中,选的那个课必须是有的。

用户定义的完整性

根据需求,用户对数据自行定义的要求

参照完整性违约处理

关系代数(很重要)

以前学过的一些关系运算

并运算

差运算

R-S:属于R,不属于S

交运算

笛卡儿积

R x S 略

专门的关系代数运算

选择

从行的角度筛选,是行的运算

投影

  • 投影是从列的角度筛选
  • 投影后还可能消除某些元组,实现去重复

连接运算

等值连接

θ为等号“=”

自然连接

  • 省略了连接号底下的比较运算式子
  • 自然连接是一种特殊的等值连接
  • 自然连接比较的是两个关系中同名的属性组,并且连接后会去掉重复的属性列,比如两都有一个“学生ID”,那最后之后留为一个
悬浮元组

连接时被舍弃的元组:

外连接

除法运算(重要)

项集

除法

关系代数里的 除法(Division)用于解决这种类型的问题:

找出那些对所有 Y 都满足某个关系的 X。

即:

  • 有一个关系 R(X, Y),里面是 (X,Y) 的配对
  • 再有一个关系 S(Y),里面是一组 Y
  • R ÷ S 的结果,是R中:所有对 S 里的每个 Y 都有配对的 X

  • Y是R和S中共有的属性,R除以S的结果,是R中除去共同属性的属性
  • S中,除了共同属性,其它的可以不用管

第三部分 SQL语言

SQL语言特点

  • 综合统一
  • 高度非过程化
  • 面向集合的操作方式
  • 以一种语法结构提供多种组合方式
  • 语言简洁,易学易用

数据定义DDL

数据库的管理

表的管理

查看所有表

SQL 数据表的创建

sql
CREATE TABLE 表名 (
    列名1 数据类型 [列级约束],
    列名2 数据类型 [列级约束],
    ...,
    [表级约束]
);
列级约束
sql
PRIMARY KEY        主键
NOT NULL           非空
UNIQUE             唯一
DEFAULT 默认值     默认值
AUTO_INCREMENT     自增(MySQL)
CHECK (表达式)     检查约束
表级约束
sql
PRIMARY KEY (列名)
UNIQUE (列名)
FOREIGN KEY (列名) REFERENCES 外表(列)
CHECK (表达式)
通式
sql
CREATE TABLE 表名 (
    列名1 数据类型 [PRIMARY KEY | NOT NULL | UNIQUE | DEFAULT 值 | CHECK(条件)],
    列名2 数据类型 [NOT NULL | UNIQUE | DEFAULT 值],
    列名3 数据类型,
    ...
    
    -- 表级约束
    [PRIMARY KEY (列名1)],
    [UNIQUE (列名2)],
    [FOREIGN KEY (列名X) REFERENCES 外表(外列)],
    [CHECK (条件)]
);
常见数据类型

表的修改

修改表名

添加字段

删除字段

修改字段

MODIFY COLUMN
ALTER TABLE 表名
MODIFY COLUMN 列名 数据类型 [约束];
  • 作用:修改列的数据类型、约束(如 NOT NULL、DEFAULT),列名不变
  • 优点:语法简洁。
  • 限制:不能改列名。

示例

ALTER TABLE users
MODIFY COLUMN age BIGINT NOT NULL;

这条命令只修改了 age 的类型和约束,列名保持不变。


CHANGE COLUMN
ALTER TABLE 表名
CHANGE COLUMN 旧列名 新列名 数据类型 [约束];
  • 作用:修改列的数据类型、约束,同时可以改列名
  • 优点:灵活,可以改名字和类型。
  • 注意:必须写新列名,即使不改名字也要写。

示例:改名字+类型

ALTER TABLE users
CHANGE COLUMN username name VARCHAR(50) NOT NULL;

示例:只改类型,不改名字

ALTER TABLE users
CHANGE COLUMN age age BIGINT;
  • 如果你只是改类型,MODIFY 更简洁;如果要改名字,必须用 CHANGE
  • MODIFYCHANGE 只能修改列级属性(列的数据类型、约束、默认值等),不能直接修改表级约束(如主键、外键、唯一约束、索引、表名等)。
添加唯一约束
方法一:列级创建表时直接加 UNIQUE
CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,   -- 列级唯一约束
    username VARCHAR(50)
);
方法二:表级约束
CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(100),
    username VARCHAR(50),
    CONSTRAINT uq_email UNIQUE (email)   -- 给约束起名字
);
方法三:给已存在的表添加唯一约束
ALTER TABLE users
ADD CONSTRAINT uq_username UNIQUE (username);

注意:CONSTRAINT uq_username 是约束名,可自定义。

删除唯一约束

MySQL 中唯一约束在内部是 唯一索引,删除方式如下:

方法一:删除索引(最常用)
ALTER TABLE users
DROP INDEX uq_username;
方法二:如果没有命名约束名
  • MySQL 自动生成的约束名就是索引名,执行 SHOW INDEX FROM 表名; 查看索引名,然后再用 DROP INDEX

数据更新 DML

添加 insert into

修改数据 update

删除数据

数据查询 DQL

基本查询

条件查询

like相关

如果 LIKE 模式里本身包含 %_ 或转义字符本身,需要使用 ESCAPE 子句 或在 MySQL 里加反斜杠 \ 转义。下面给你详细讲清楚。


使用反斜杠转义(MySQL 默认)
SELECT * FROM products
WHERE name LIKE '100\%'  -- 匹配包含 "100%" 的字符串
  • \% 表示字面上的 %,而不是通配符
  • 同理,\_ 表示字面上的 _

MySQL 默认反斜杠就是转义字符。


使用 ESCAPE 子句(通用 SQL)

如果你想自定义转义符,可以用 ESCAPE

SELECT * FROM products
WHERE name LIKE '100!%' ESCAPE '!';
  • ! 是自定义转义符
  • !% 表示字面 %
  • 你也可以用其他字符,比如 ~ 等。
情况解决方法
匹配字面 %\%LIKE 'xxx!%' ESCAPE '!'
匹配字面 _\_LIKE 'xxx!_' ESCAPE '!'
匹配转义符本身MySQL: \\,ESCAPE: 需要转义符两次

聚合函数

分组查询

排序查询

分页查询

DQL语句执行顺序

先找表 → 再连表 → 过滤行 → 分组 → 分组过滤 → 选列 → 去重 → 排序 → 限制行数

数据控制语言 DCL

主要管理数据库的用户,控制数据库的访问权限

用户管理

权限控制

权限种类

权限控制

WITH GRANT OPTION 决定权限能否继续传播
A → B(WITH GRANT OPTION)

如果 A 给 B 的权限带 WITH GRANT OPTION 则 B 可以继续给 C 授权。

MySQL 权限撤销的级联规则

MySQL 的授权是链式依赖的:

如果某个用户因失去上级权限,不再有授予权,则他授予给其他人的权限会被自动撤销。撤销 A → B 的授权会导致 B 的权限失效,并且 B 曾授予给 C 的权限也会自动被撤销(级联撤销)。

约束

外键约束

外键的定义、添加

外键的删除、更新行为

连接查询

内连接

外连接

联合查询

子查询

视图

WITH CASCADED CHECK OPTION

严格检查:检查当前视图和所有底层基视图的条件

WITH LOCAL CHECK OPTION

宽松检查:只检查当前视图的条件,不检查底层视图

视图写入时,会检查这个视图的 CHECK OPTION(如果有)。 如果该视图是 CASCADED,则继续检查父视图; 如果是 LOCAL,则不会自动检查父视图。 但是:如果父视图本身也有 CHECK OPTION(无论 Local / Cascaded),写入必定会触发父视图自己的检查。

不管是宽松还是严格,只要with了checkoption,都会触发上一层的检查,由上一层决定后续的检查

删除表,会删除表上的视图吗(考过)

第四部分 ER模型

ER模型

ER图中的冲突

第五部分 关系数据库理论

关系的五部分

五元组

函数依赖

平凡的函数依赖,可以理解为自己推自己,如(A,B)->A,但是A本身就能退出自己,没意义。

部分函数依赖(不完全),(A,B)->C,如果A可以单推C,那这叫做部分函数依赖。

范式

第一范式

每个单元格都不可再分

第二范式

若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF

第三范式

即在第二范式的基础上,消除非主属性对主属性的传递函数依赖

BC范式

通常认为,BCNF是3NF的修正与扩充

多值依赖

有一组Y的值,把这一组理解为一个集合,一个x值就决定了一个集合,与z无关

如下图:

第四范式

ArmStrong

属性闭包

由一组(个)属性,可以推出的所有属性,包括自身。

最小函数依赖集

第一步就是先拆开

第二步的意思是,如果不用加这一条,X也能推A,就可以把这一句废话删掉。

第三步意思是,如果AB就可以推Y,那么ABC->Y就显得冗余了,只要AB->Y就好

求解候选码

属性的分类

L属性不可被别人推,那自己必然就在码中

R只能被别人推,自己谁都推不了

求解方法

  • 候选码必然包含了L、N所以以二者的并为初始

  • 如果一次成功推出了U,就说明成功,直接解释

  • 如果不,就要尝试把LR中的“挪”过来,先一个一个挪,找到能推出U的,就成功结束,不行就两个两个,再不行三个三个......

数据库设计

概述

构造优化的数据库逻辑模式和物理结构,建立数据库及其应用系统

基本步骤

image

数据库的物理设计

确定数据库存储结构

  1. 存放位置
  2. 存储结构 确定数据库存取方法
  3. 索引方法
  4. 聚簇方法 聚簇的局限性 1. 聚簇只能提高某些特定应用的性能 2. 建立与维护聚簇的开销相当大 聚簇索引的选择原则 1.对经常进行自然连接的表的连接项建立聚簇 2.对经常做相等比较的属性或属性组建立聚簇 3.对重复率高的属性(组)建立聚簇索引
  5. HASH 方法 该关系的属性主要出现在等值连接条件中或主要出现在 相等比较选择条件中。

存储管理

数据库的逻辑组织方式:表空间—段—分区—数据块 数据库的物理组织方式:记录——>块——>文件 表空间对应文件,数据块对应物理块

##索引分类 1.稠密索引与稀疏索引 2.聚集索引与非聚集索引 3.主索引与辅助索引 4.全文索引 索引结构 1.B+树索引 2.Hash索引 3.位图索引

数据库恢复技术

原子性 一致性 隔离性 持续性

故障种类

1.事务故障 2.系统故障 3.介质故障

恢复的实现技术

  • 数据转储( backup)
  • 日志文件(logging) 日志文件的作用 —— 故障恢复必须使用日志文件 事务提交日志 检查点日志 事务回滚日志

系统故障恢复

系统故障造成数据库不一致状态的原因

  • 未完成事务:数据可能已经部分写入,但后来的故障导 致这个事务需要终止。
  • 已提交事务:日志已经写入磁盘,但对数据库的更新可 能还留在缓冲区没来得及写入磁盘 系统故障恢复方法
  • 故障发生时未完成的事务:Undo
  • 故障发生时已完成的事务:Redo

并发控制

事务是并发控制的基本单位 并发控制的任务 n 对并发操作进行正确调度 n 保证事务的隔离性 n 保证数据的一致性

丢失修改 T2回滚的结果覆盖了T1提交的结果(第一类错误) T2提交的结果覆盖了T1提交的结果(第二类错误) 脏数据 - T1修改写回,T2读,T1回滚,此时T2读数据为脏数据

不可重复读- T1读,T2更新,T1再次读(与第一次读取数据不同) 该类错误中还包括:幻读(phantom row)- T1读后,T2删除/插入部分记录,T1再读时不同

封锁

基本封锁类型 排他锁 Xlock 共享锁 Slock

封锁协议

image 1级:解决修改丢失 2级:解决读脏数据 3级:解决不可重复读

活锁与死锁

活锁解决方案: 依据请求封锁的先 后次序对事务排队, 首先批准申请队列 中第一个事务获得 锁。 死锁解决方案:

  1. 一次封锁法
  2. 顺序封锁法
  3. 超时法
  4. 等待图法

并发调度的可串行化

将所有事务串行的调度策略一定是正确的调度策略

几个事务的并行执行是正确的,当且仅当其结果与 按某一次序串行地执行它们时的结果相同。

冲突可串行化调度 一个调度Sc在保证冲突操作的次序不变的情况下,通过 交换两个事务不冲突操作的次序得到另一个调度Sc',如 果Sc'是串行的,称调度Sc是冲突可串行化的调度。

两段锁协议

第一阶段是获得封锁,也称为扩展阶段; 第二阶段是释放封锁,也称为收缩阶段。

(1)所有遵守两段锁协议的事务,其并行执行的结果一 定是正确的。 (2)事务遵守两段锁协议是可串行化调度的充分条件, 而不是必要条件

封锁的粒度

  • 显式封锁:直接加到数据对象上的封锁
  • 隐式封锁:该数据对象没有独立加锁,是由于其上级结点 加锁而使该数据对象加上了锁

意向锁: 如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁 对任一结点加基本锁,必须先对它的上层结点加意向锁

常用意向锁: 意向共享锁 意向排他锁 共享意向排他锁

Re ord Lock :单个行记录上的锁 Gap Lock :间隙锁,锁定一个范围,不包含记录本身 Next-Key Lock:Gap Lock + Record Lock