# 数据库原理提纲

期中考试复习心得体会

1. 概念是要的，但是不是记定义什么的，而是记名字、分类（比如说逻辑数据独立性这个词差点没写出来、子模式也没想出来，数据模型三要素，关系的基本性质（我服了这个也没记住====》原来数据库也是文科。。。【但是那个什么概念模型和结构模型和也考了定义？
2. 大题很重要！幸好中午把关系代数和SQL的大题猛猛学了点
3. 所以其实不应该把重点放在梳理课本上面的东西？就是那些定义找找别人的笔记copy一下就好了
4. 这次题型是选择2\*10 填空2\*10 简答6\*5 ，剩下的都是计算，但是我怎么记得不止30分，按照分数的就占比一半一半？
5. 颜老师的考试提纲可以信👍，比lh好多了

\
关于复习提纲：

1. “熟记”部分，一定要熟记
2. “查询习题讲解”课件中的题型及方法
3. 掌握蓝色部分的应用题型和解题方法（对应章节的课件中有）

### 第一章 引论

**1. 四个概念：什么是数据? 什么是数据库? 什么是数据库管理系统（DBMS）？什么是数据库系统(DBS)？**

数据就是**信息的载体**，可以是任何形式的，比如数字、文字、图片、声音等等。举个例子，当你在社交媒体上发布一张照片，这张照片就是一种数据。数据库是一**个里面按照一定的规则存放了很多数据的数据集合**。它包含了相关的数据及其描述，是数据管理的重要基础。数据库管理系统（DBMS）是一套**管理数据库**的软件系统，它提供了数据定义、数据操作、数据维护和数据控制的功能。常见的DBMS有MySQL、SQL Server等。数据库系统（DBS）包括了所有与数据库有关的东西，**除了数据库本身和管理它的软件（DBMS），还包括硬件设备**（比如服务器）、操作系统、数据库管理员和使用数据库的应用程序。可以把它看成是一个完整的生态系统，所有部分一起工作来处理和管理数据。\\

**2. 熟记数据库系统的组成。**

数据库，数据库管理系统，支持数据库运行的软、硬件环境，用户

* 硬件：用于存储和运行数据库系统的物理设备。
* 软件：包括操作系统、DBMS、应用程序等。
* 数据：数据库中存储的各种数据。
* 人员：包括数据库管理员（DBA）、最终用户、应用程序开发人员等。
* 程序：各种用于操作和管理数据库的数据处理程序。

\\

**3. 理解DBA是对数据库进行集中控制和管理的最重要人员。**

数据库管理员（DBA，Database Administrator）是负责数据库系统管理和维护的重要人员。他们的主要职责包括：

* 安装和升级数据库服务器和应用工具
* 分配数据库的存储并规划未来的存储需求
* 管理用户访问和数据安全
* 确保数据库的性能、可用性和安全性
* 备份和恢复数据库

\\

**4. 实例和模式的对比（内容/状态 vs 结构，变化 vs 稳定）**

* 内容/状态 vs 结构：实例是数据库在某一时刻的具体数据内容，即数据库的当前状态。模式是数据库的结构和约束，是数据库的逻辑设计，是相对稳定的。
* 变化 vs 稳定：实例是不断变化的，每次对数据库的操作都会引起实例的变化。模式则是相对稳定的，只在数据库设计或结构发生重大改变时才会变动。

\\

**5. 三级模式的含义是什么？一个数据库有几个物理模式，逻辑模式和子模式？三级模式间的两极映射，以及是由谁（DMBS）完成这种映射功能的？两级映射的作用（好处）是带来以下两种数据独立性——**

* 物理模式（内模式）：描述**数据在计算机里的实际存储方式**。一个数据库只有**一个**物理模式。
* 逻辑模式（模式）：描述**数据库的总体设计，描述了数据库中的数据以及数据之间的关系**。一个数据库只有**一个**逻辑模式。
* 子模式（外模式）：是数据库用户可见的部分，**每个用户只看到和自己相关的部分数据**。一个数据库可以有**多个**子模式。

\
三级模式间的两级映射：由DBMS负责完成。

* 外模式/模式映射：定义子模式到模式的映射，比如学生看到的成绩单和实际数据库表格之间的对应关系。
* 模式/内模式映射：定义模式到物理模式的映射，比如一张学生表格在硬盘上的具体存储位置和形式。

\
两级映射的作用（好处）：带来以下两种数据独立性：

**6. 熟记两种数据独立性：什么是逻辑数据独立性？什么是物理数据独立性？用户或者应用程序面向的到底是哪一级数据库模式？**

逻辑数据独立性：是指当数据库的逻辑结构发生变化时，应用程序不需要做相应的改变。这是通过外模式和模式之间的映射来实现的。【这就像是房间里的家具位置变了，客人还是进门就能看到沙发。】物理数据独立性：是指当数据库的物理存储结构发生变化时，应用程序不需要做相应的改变。这是通过模式和内模式之间的映射来实现的。【这就像是你把保险柜换了个地方，但你拿文件的方式不变。】用户或者应用程序面向的数据库模式：用户和应用程序主要面向外模式，即子模式。

**7. 概念数据模型用于数据库设计，是对客观世界的第一层抽象。常见例子是E-R模型。**

E—R模型：需求分析（用户需求）、概念设计（E—R模型）、逻辑设计（逻辑模式（关系模型））、物理设计（数据库模式）。

1. **（逻辑）数据模型中，了解层次、网状和关系模型，特别是它们（与名字相关的）数据结构。**

层次模型：用树状结构来组织数据；（结构简单、清晰，但缺少灵活性、只能1：n）网状模型：用有向图来表示实体和实体之间的联系；（能解决现实中的复杂问题、但结构复杂）关系模型：二维表（关系型数据库）

### 第二章 关系模型介绍（含第六章关系代数部分）

**1. 数据模型的三要素？关系模型的三要素？**

数据模型的三要素：数据结构、数据操作、数据完整性；关系模型的三要素：单一数据结构——关系、数据操作——关系操作、数据完整性——关系完整性。

**2. 关系的组成：什么是属性？什么是元组？什么是分量？**

* 属性：表格的列。每个属性代表数据的一个特性，比如学生表中的“学号”、“姓名”都是属性。
* 元组：表格的行。每一行代表一个完整的数据记录，比如学生表中的一行记录一个学生的信息。
* 分量：元组中的一个具体值。比如在某个学生的元组中，“学号”列的具体值是某个学生的学号。
* 度：属性的数目；
* 基数：元组的数目；
* 域：属性可能取值的集合。

\\

**3. 熟记关系有哪些基本性质？**

* 无重复元组：表格中每一行都是唯一的，没有重复。
* 无序性：表格中的行和列的顺序是无关紧要的，换句话说，行和列的顺序可以改变而不会影响数据的逻辑结构。
* 分量不可再分：每个分量必须是原子的，不可再分。比如，一个分量不能同时包含多个值。
* 列是同质的。列中的分量类型必须相同，因为它们来自同一个域；
* 不同的列可来自同一个域，但属性名不能相同；

\\

**4. 关系有哪四种键？数量（是否有多个）？什么是外部键？外部键的属性名可以和所对应的主键不同。外部键可以指向同一个关系的主键。例如：学生（学号，姓名，班长学号...）。外部键从E-R图的什么概念转化而来？**

* 超键：包含一个或多个属性的集合，这些属性可以唯一标识一个元组。超键可能包含多余的属性。
* 候选键：唯一标识表中元组的一个或多个属性组合。一个表可以有多个候选键。
* 主键：从候选键中选出的一个，用来唯一标识表中的每一行。一个表只有一个主键。
* 外键：表中的一个属性，它引用了另一个表的主键，用来建立两个表之间的联系。外键的属性名可以和它引用的主键不同。

\
外部键的属性名可以和所对应的主键不同。比如学生表中的“班长学号”可以是外键，引用班长的“学号”。外部键可以指向同一个关系的主键。比如学生表中的“班长学号”指向同一个学生表中的“学号”。外部键从E-R图的什么概念转化而来？外部键从E-R图中的“关系”概念转化而来，用来表示实体之间的联系。

**5. 关系模式和关系实例的对比。**

关系模式：是关系（表格）的结构定义，包括表名、列名和列的数据类型等。它描述了表的框架和格式，是静态的。关系实例：是关系在某一时刻的具体数据内容。它是表格中的具体数据，是动态的，会随着数据的增删改而变化。

**6. 过程化和非过程化语言的区分和理解——看课件。**

过程化语言：需要用户明确指定操作步骤和执行顺序。用户告诉系统“怎么做”。例如，关系代数是一种过程化语言。非过程化语言：用户只需指定“做什么”，不需关心具体操作步骤。系统会自动找出实现的方法。SQL和关系演算都是非过程化语言。

**7. 关系操作分为查询和更新操作。表示关系操作的语言：关系代数，关系演算（又分为元组关系演算和域关系演算）。关系代数是过程化的，关系演算是非过程化的。后面讲到的SQL是非过程化的。**

表示关系操作的语言：关系代数：是一种过程化语言，用运算符对关系进行操作，表示查询过程。关系演算：是一种非过程化语言，用谓词逻辑来表达查询条件

**8. 掌握关系代数的各种运算（包括符号）。其中最基本的运算（不可替代）是哪些？**

**9. 查询优化不要求。【这可是面试重点烙铁！怎么能不要求！】**

**10. 应用题型：用关系代数表达查询问题（查询习题课件）**

### 第三章 SQL（含课本第四章部分）

**1. SQL的全名（中英文）。SQL是非过程化的语言。熟记SQL的特点**

SQL（Structured Query Language）统一化、非过程化、面向集合的操作方式（高效性）和提供多种方式使用（可移植性）

**2. 熟记SQL的四种功能。这些功能分别由哪些语句（动词）实现？**

\\

**3. SQL对数据库三级模式的规定：每级模式由什么组成？**

外模式：由用户视图组成，是用户能看到和操作的部分。逻辑模式：由数据库的逻辑结构组成，是所有数据的全局视图。内模式：由数据的物理存储结构组成，是数据在物理设备上的存储方式。

**4. 理解SQL中的系统数据类型，char/varchar/numeric等。**

char（n）：长度固定为n的字符串；Varchar（n）：可变长度的字符串，最大长度为n；Numeric（p，q）：小数点左边p位，右边q位的定点数；Real：浮点数；Float（n）：精度至少为n位的浮点数；Interval：两个date或time类型数据之间的差。

**5. 掌握SQL的各个数据定义语句（特别是新建表，建视图，修改表，删除表的语句）。**

```sql
// 新建表
CREATE TABLE 表名 (
    列名1 数据类型1,
    列名2 数据类型2,
    ...
);
create table S(
  SNO VARCHAR (4),
  SNAME PERSON-NAME not null,
  AGE SMALLINT default 22,
  SEX VARCHAR (1),
  primary key (SNO),
  check(AGE<200 and AGE>0)
)
// 修改表
ALTER TABLE 表名
ADD 列名 数据类型
alter table S (add DEPT VARCHAR(20) not null)
alter table SC(modifY RESULT SMALLINT)
// 删除表 包括删除数据、结构、视图
DROP TABLE 表名
// 建视图
CREATE VIEW 视图名 AS
SELECT 查询语句
```

**6. 掌握SQL的Select数据查询语句。掌握Like运算中的通配符和转义符。**

```sql
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件
ORDER BY 列名
```

like比较运算中使用escape关键词来定义转义字符。“%”代表零个或者多个字符“\_”代表一个且只能是一个字符

**7. 掌握SQL的各个数据修改语句： Insert, Update, Delete。**

```sql
// 插入数据
INSERT INTO 表名 (列名1, 列名2, ...)
VALUES (值1, 值2, ...)
// 更新
UPDATE 表名
SET 列名1 = 值1, 列名2 = 值2, ...
WHERE 条件
// 删除 删除的是数据不是结构
DELETE FROM 表名 WHERE 条件
```

\\

**8. 空值的意义；掌握空值的运算规则（包括聚集函数忽略空值等），例如给出一个包含空值的式子，能计算最终结果。在关系代数和SQL中如何（根据以上规则）处理空值。**

空值（NULL）表示未知或不存在的值。运算规则：

* 聚合函数会忽略空值。例：SUM、AVG、COUNT等。
* 表达式中含有空值的运算结果通常为空值。例：5 + NULL结果为NULL、NULL > 5 的结果是 NULL、TRUE AND NULL 的结果是 NULL、FALSE OR NULL 的结果是 NULL。

```sql
// 在关系代数和SQL中处理空值
SELECT AVG(列名) FROM 表名 WHERE 列名 IS NOT NULL
```

**9. 理解视图的本质：命名的查询语句，只有这个才是真正存储在数据库里的；表象：虚拟表，与真正的表基本表相比有相同也有不同；动态变化）。**

**10. 熟记理解视图的优点。**

* 简化查询：将复杂的查询封装成简单的视图。
* 数据安全：限制用户访问特定的数据。
* 逻辑独立性：数据结构变化时，视图可以保持不变，减少对应用程序的影响。

\\

**11. 掌握定义视图的语句。理解对视图的查询以及对视图的更新在后台是怎样进行的（视图的查询：展开视图——替换视图为它所对应的查询。视图的更新：转化为对基本表的更新，这种转化可能因为缺少主键等原因失败，从而无法更新）。**

```sql
// 定义视图
CREATE VIEW 视图名 AS
SELECT 查询语句
CREATE VIEW HighScores AS
SELECT ID, Score FROM Scores WHERE Score > 85
// 查询视图
SELECT * FROM HighScores
SELECT ID, Score FROM Scores WHERE Score > 85
// 更新视图
UPDATE HighScores SET Score = 95 WHERE ID = 3
UPDATE Scores SET Score = 95 WHERE ID = 3 AND Score > 85
```

**12. 什么样的视图可以成功修改？什么样的视图不可以？**

可以成功修改的视图：

* 视图包含基本表的主键或唯一键，可以唯一标识要更新的行。
* 视图的定义中没有复杂的聚合函数、子查询或连接。

\
不可以成功修改的视图：

* 视图中不包含基本表的主键或唯一键，导致无法唯一标识要更新的行。
* 视图的定义中包含聚合函数、子查询或连接，导致更新操作无法转化为对基本表的更新。
* 视图定义中包含计算列或派生列，这些列无法直接更新到基本表。

\\

**13. 嵌入式SQL不要求。**

**14. 应用题型：用SQL表达数据查询(Select)和数据修改(Insert, Update, Delete)问题。用SQL建表(Create Table，包括主码、外部码、检查约束等)，建视图(Create View)等数据定义操作。**

\\

### 第四章 关系数据库模式设计

1. **熟记关系模式设计不当可能产生的四种问题：数据冗余和三种异常。**
   1. 数据冗余：指同一数据被存储多次，导致存储空间浪费和数据一致性问题。
   2. 插入异常：指在插入数据时，由于某些数据依赖关系的存在，无法插入某些数据。
   3. 删除异常：指在删除数据时，意外地删除了有用的信息。
   4. 更新异常：指在更新数据时，由于数据冗余，导致需要更新多处，容易出现数据不一致的问题。

\\

1. **理解函数依赖X→Y的含义。掌握判定函数依赖的方法。**
   1. **函数依赖X→Y**：表示在一个关系中，如果对于任意两个元组，只要它们在X上的值相同，它们在Y上的值也相同。X称为决定因素，Y称为被决定因素。
   2. **判定方法**：通过分析关系的实际数据，检查是否对于任意两个元组，如果X相同则Y也相同，来判定是否存在函数依赖。

\\

1. **用函数依赖判断一个属性集是否超码，或者是否候选码的方法。**
   1. **三对特殊类型的函数依赖**：
      * 平凡/非平凡函数依赖：
        * 平凡：如果Y是X的子集，则X→Y是平凡函数依赖。
        * 非平凡：如果Y不是X的子集，则X→Y是非平凡函数依赖。
      * 部分/完全函数依赖：
        * 部分：如果存在一个真子集Z (Z ⊂ X) 使得Z→Y成立，则X→Y是部分函数依赖。
        * 完全：如果对于X的任何真子集Z (Z ⊂ X)，Z→Y不成立，则X→Y是完全函数依赖。
      * 传递/非传递函数依赖：
        * 传递：如果X→Y和Y→Z成立且Y不包含于X和Z，则X→Z是传递函数依赖。
        * 非传递：如果不存在上述条件，则X→Z是非传递函数依赖。
   2. **超码**：如果一个属性集能够唯一标识一个元组，则称为超码。
   3. **候选码**：如果一个属性集是超码且没有冗余属性（即任何真子集都不是超码），则称为候选码。
   4. **判定方法**：通过检查属性集的函数依赖关系，确定它是否能唯一标识元组，以及是否有冗余属性。

\\

1. **掌握计算属性集闭包的算法。以及由此判定一个函数依赖是否成立的方法。**
   1. **属性集闭包**：指给定属性集X，计算所有通过函数依赖可以推导出的属性集称为X的闭包，记为X⁺。
   2. **算法**：
      * 初始化闭包X⁺为X。
      * 循环应用函数依赖：如果X⁺包含函数依赖的左侧，则将函数依赖的右侧加入X⁺。
      * 直到X⁺不再增加。
   3. **判定方法**：如果给定的函数依赖Y→Z，且Y的闭包包含Z，则函数依赖成立

\\

1. **最小函数依赖集不要求。4.3这一节不要求。**
2. **掌握1NF、2NF、3NF、BCNF的定义/要求，并能依此进行判定。**
   1. 1NF（第一范式）：每个字段的值都是原子值，即不可再分。
   2. 2NF（第二范式）：在1NF的基础上，消除部分函数依赖，即每个非主属性完全依赖于候选码。
   3. 3NF（第三范式）：在2NF的基础上，消除传递函数依赖，即每个非主属性非传递依赖于候选码。
   4. BCNF（Boyce-Codd范式）：在3NF的基础上，消除任何形式的冗余，即每个决定因素必须是候选码。

\\

1. **掌握规范化到1NF，3NF，BCNF的相关方法。关系模式应该至少规范化到3NF。规范化到3NF和规范化到BCNF相比，后者得到的关系模式属于更高级别，但是可能会丢失函数依赖。**
   1. 规范化到1NF：确保所有字段的值都是原子值。
   2. 规范化到3NF：确保消除部分和传递函数依赖。
   3. 规范化到BCNF：确保消除所有冗余，使得每个决定因素都是候选码。

\\

1. **多值依赖不要求。**
2. **应用题型：给出关系和函数依赖**
   1. **找出候选码，并证明。**
   2. **判断某个函数依赖是否成立，给出证明。**
   3. **判断关系所属的最高范式，给出证明。**
   4. **将关系规范化到3NF，或者BCNF**
   5. **判断一个分解是否无损依赖，给出证明**

\\

### 第五章 数据库设计

1. **理解E-R模型的三要素：实体、属性和联系。以及在E-R图中的表示。**
2. **三种特殊类型的属性，并能够判断。**
3. **能判断二元联系的类型：一对一，一对多，多对多。以及在E-R图中的表示。**
4. **能将E-R图转化为关系模型。注意：多值属性的处理（如果有n个多值属性，n个分开来处理）；1对1，1对多，多对1，多对多，三元以上联系各自的转化方式——不要张冠李戴。**
5. **熟记数据库设计的基本过程，包括在各个阶段分别要做的工作？**
6. **应用题型：**
   1. **给出用户需求，画E-R图（概念设计）。**
   2. **将E-R图转化为关系模型（逻辑设计）。**

\\

### 第六章 数据库安全性与完整性

1. **安全性是防止非法用户进入数据库，以及合法用户进入数据库后做了（未授权的）非法操作。完整性是防止非法数据进入数据库，即使是合法用户及合法操作产生的。**
2. **掌握用SQL授予权限和回收、禁止权限的语句(grant, revoke, deny)。with grant option子句的作用。**
3. **理解常见权限的含义。（例如 insert on (table) S, update on (view) A等)**
4. **理解完整性的含义：正确、有效、相容。完整性约束（规则）是数据为保证完整性所必须满足的条件。**
5. **熟记关系模型中的三类完整性规则。各有什么要求？理解哪些（修改）操作会破坏这些规则？**
6. **掌握用SQL定义主码约束、外码约束、非空(not null)约束、唯一(unique)约束、域约束、检查(check)约束的语句？以及这些约束的含义、作用。**
7. **在定义外部码约束时，有哪几种参照动作？代表什么意义？**
8. **断言不作要求**
9. **熟记以下全部触发器的概念。触发器有哪些作用？触发器/ECA规则构成的三个方面，包括英文单词。哪些事件会激活（INSERT,UPDATE,DELETE操作）。**

\\

### 第七章 数据库事务管理。

1. **深刻理解事务的概念。熟记事务的ACID性质（包括英文单词、解释、保障机制）。**
2. **掌握事务控制的多个SQL语句。两种结束方式（提交或回滚）的含义及区别。不能提交的事务结局只能是回滚。**
3. **事务调度分串行调度和并发调度，并发调度的效率高，但也有问题：破坏数据一致性，产生错误。**
4. **熟记并发引起的三类数据不一致问题，它们是如何发生的（过程？）。产生不一致问题的根本原因是事务在并发执行（调度）时，没有保证隔离性。**
5. **并发执行（调度）的正确性准则：可串行化——效果等价于一个串行调度。**
6. **封锁的基本类型：排他锁（写锁、X锁）、共享锁（读锁、S锁）。各个锁的含义（例如排他锁是读+写，共享是读），相容/排斥关系？**
7. **意向锁不要求。更新锁不要求。**
8. **有哪几种封锁协议？规则是什么？它们的作用（各自解决了哪些数据不一致性问题）？两段封锁协议是可串行化调度的充分非必要条件。**
9. **数据库恢复技术的基本原理：冗余。建立冗余的两种方法：数据备份和登记日志文件**
10. **静态备份 vs 动态备份（有否一致性；是否允许用户运行事务来操作数据库）。**
11. **日志文件的定义：是用来记录事务对数据库进行更新操作的文件**
12. **日志文件的基本内容（事务开始一条；事务结束一条；事务若干次更新若干条）。在登记更新操作的日志记录时，更新前后的旧值与新值都要保存到日志记录中。**
13. **什么是运行记录优先（先写日志）原则？**
14. **熟记以下全部不同类型的数据库故障，包括它们的定义，故障的起因（例如死锁引起事务故障，停电引起系统故障，硬盘坏道引起介质故障等等...），影响范围（事务本身？DBMS系统？内存中的数据？磁盘上的数据？）、恢复策略（方法过程），及由谁完成（系统自动 or 用户干预？）**
15. **检查点不要求**
