中级软考(软件工程师)第九章知识点——数据库技术基础
中级软考(软件工程师)第九章知识点——数据库技术基础
- 分值占比:6~25分
- 题型:单选,案例题至少一道
- 注意点: 重点,需要掌握计算和理论知识

一、数据库模型
1.1 三级模式
(1) 外模式—— 用户的眼镜
- 别名:用户模式、子模式。
- 定义:它是用户(包括应用程序员和最终用户)能够看到的数据库数据的局部描述。
- 通俗理解:“私人定制”的视图。
- 比如:财务部只能看到员工的“工资表”视图;人事部只能看到员工的“考勤表”视图。他们都只看到了数据的一部分。
- 数量:多个。一个数据库可以有各种各样的外模式,对应不同的用户组。
(2) 概念模式 —— 数据的全貌
- 别名:模式(注意:考试中单说“模式”通常指概念模式)、逻辑模式。
- 定义:它是数据库中全体数据的逻辑结构和特征的描述。
- 通俗理解:“上帝视角”的大表。
- 它定义了所有的表、字段、类型、主外键关系。它不关心数据存在哪个硬盘上,也不关心具体谁来看,它只关心数据本身的逻辑。
- 数量:只有一个。全公司只有一个总的员工信息逻辑定义。
(3) 内模式—— 硬盘的真相
- 别名:物理模式、存储模式。
- 定义:它是数据在数据库系统内部的物理存储方式的描述。
- 通俗理解:数据的物理“老巢”。
- 它决定了数据是按什么顺序存的(堆文件还是顺序文件)、索引是怎么建的(B+树还是Hash)、数据被压缩了吗、加密了吗。
- 数量:只有一个。物理存储结构在某一时刻是唯一的。
1.2. 二级映射
📝 这三级模式是隔离的,怎么把它们连起来?靠的就是两层映射(桥梁)。
(1) 外模式/模式映像
- 位置:介于 外模式 和 概念模式 之间。
- 作用:定义了用户的局部视图(外模式)和全局逻辑视图(概念模式)之间的对应关系。
- 例子:告诉系统,“财务视图”里的
salary字段,对应的是“员工总表”里的base_pay + bonus字段。
(2) 模式/内模式映像
- 位置:介于 概念模式 和 内模式 之间。
- 作用:定义了全局逻辑视图(概念模式)和物理存储(内模式)之间的对应关系。
- 例子:告诉系统,“员工总表”里的数据,实际上是存储在
D:\Data\emp.db文件中的,并且在 ID 字段上有个 B+ 树索引。
1.3. 数据的独立性
📝 这是设计“三级模式-两级映射”的终极目的:为了让程序和数据解耦。
(1) 逻辑独立性
- 含义:当模式(概念模式)改变时(例如:表中增加了一个新列),管理员只需要修改 “外模式/模式映像”,而使外模式保持不变。
- 结果:应用程序不需要修改。
- 例子:总表里加了“发际线”这一列,但财务部的视图定义不用变,财务软件也不用重写代码。
(2) 物理独立性
- 含义:当内模式改变时(例如:更换了更快的硬盘、改变了索引结构、数据存储路径变了),管理员只需要修改 “模式/内模式映像”,而使**模式(概念模式)**保持不变。
- 结果:应用程序(以及逻辑结构)完全不知道底层发生了变化。
- 例子:数据库从机械硬盘搬到了SSD,或者为了加速查询加了个索引,逻辑上的表结构完全没变,程序照样跑。
5. 知识模块总结 Flowchart
这张图展示了三级模式的层次结构和映射关系,请务必印在脑海里:
二、数据模型(重点,和下午第二道大题有直接关系)
2.1 两类数据模型
(1) 概念数据模型
- 视角:用户的视角(人能看懂的)。
- 作用:用来跟客户沟通需求。不关心电脑怎么存,只关心业务里有哪些东西(人、事、物)。
- 代表:E-R 模型(实体-联系图)。
- 考点:它是现实世界到机器世界的中间桥梁。
(2) 基本/逻辑数据模型
- 视角:计算机/DBMS 的视角(数据库软件能看懂的)。
- 作用:决定了数据在数据库里怎么组织(表?树?网?)。
- 代表:
- 关系模型 (Relational):目前最主流(用二维表存储),也是软考必考。
- 层次模型(树状,像文件系统)、网状模型(图状)、面向对象模型。
2.2 数据模型三要素
任何一个数据库系统(比如 MySQL, Oracle),都必须具备这三个条件:
- 数据结构(静态):
- 数据长什么样?(是表还是树?)
- 比如:关系模型的数据结构是“二维表”。
- 数据操作(动态):
- 能对数据干什么?
- 比如:增、删、改、查 (CRUD)。
- 数据的约束条件(规则):
- 数据必须遵守什么规矩?为了保证数据的正确性。
- 比如:学号不能重复(主键约束)、年龄不能是负数(用户定义约束)。
2.3. E-R 模型与图符详解
这一部分是下午作图题的基础,请务必区分清楚以下图形:
(1) 基础三件套(必会)
- 矩形
→
\to
→ 实体 (Entity):
- 现实中存在的独立事物(如:学生、课程、老师)。
- 菱形
→
\to
→ 联系 (Relationship):
- 实体之间的交互(如:学生 选修 课程,老师 教授 课程)。
- 重点:联系也可以有属性!(比如“选修”这个联系,可以有一个属性叫“成绩”)。
- 椭圆
→
\to
→ 属性 (Attribute):
- 实体的特征(如:姓名、学号)。
(2) 进阶符号
这些符号用于描述更复杂的业务逻辑,下午题中有时会出现:
- 双边矩形
→
\to
→ 弱实体集 (Weak Entity):
- 含义:它不能独立存在,必须依附于另一个实体(强实体)。
- 例子:员工(强实体)和 家属(弱实体)。如果员工离职删库了,家属的信息也就没意义了。家属没有独立的主键,通常靠员工ID+家属编号来区分。
- 双边菱形
→
\to
→ 弱实体集对应的标识性联系:
- 含义:连接强实体和弱实体的那个菱形,要画成双层的。
- 双椭圆
→
\to
→ 多值属性 (Multi-valued Attribute):
- 含义:一个属性对应多个值。
- 例子:一个人的 “手机号”(可能有一个移动、一个联通)、“学位”(学士、硕士)。
- 虚椭圆
→
\to
→ 派生属性 (Derived Attribute):
- 含义:这个属性在数据库里不直接存,而是通过其他属性算出来的。
- 例子:“年龄”。数据库里只存“出生日期”,年龄是根据(当前日期 - 出生日期)算出来的,画图时用虚线椭圆。
- 双线
→
\to
→ 全部参与 (Total Participation):
- 含义:实体集中的每一个实例都必须参与到这个联系中。
- 例子:职工与部门的“从属”关系。如果规定“每个职工必须属于一个部门”,那么职工这边的连线就要画双线。

三、数据库操作
3.1 关系模型的完整性规则
- 实体完整性:主属性不能为空值。
- 参照完整性:外键的值必须存在。
- 用户定义完整性:满足用户要求,这是脱离数据库本身,用户制定的规则。
3.2 基本关系运算

📝 这里我们重点说一下比较容易犯错的几个运算符,其余的简单说明,下面是要用到的数据
关系 R(学生表)
| A (学号) | B (姓名) | C (课程号) |
|---|---|---|
| 1 | 张三 | 01 |
| 1 | 张三 | 02 |
| 2 | 李四 | 01 |
关系 S2(用于连接/除法)
| C (课程号) | D (课程名) |
|---|---|
| 01 | 数学 |
| 02 | 英语 |
(1)关系运算符
📝 这是考试中最常考、最容易混淆的部分,尤其是除法。
(1) σ \sigma σ 选择
- 含义:“横向”切一刀。根据条件筛选出行(元组)。对应 SQL 中的
WHERE子句。 - 例子:
σ
A
=
1
(
R
)
\sigma_{A=1}(R)
σA=1(R) (选出学号为1的记录)
- 结果:
A B C 1 张三 01 1 张三 02
- 结果:
(2) π \pi π 投影
- 含义:“纵向”切一刀。根据条件筛选出列(属性),并自动去重。对应 SQL 中的
SELECT DISTINCT 列名。 - 例子:
π
A
,
B
(
R
)
\pi_{A, B}(R)
πA,B(R) (只看学号和姓名)
- 结果:
A B 1 张三 2 李四 - 注意:原表中张三有两行,投影后去重变为一行。
- 结果:
(3) ⋈ \bowtie ⋈ 自然连接
- 含义:将两个表拼接起来。自动寻找同名列(这里是 C 列),相等才拼接,并且去掉重复的列。
- 例子:
R
⋈
S
2
R \bowtie S2
R⋈S2
- 逻辑:R 中的 C=01 与 S2 中的 C=01 拼,02 与 02 拼。
- 结果:
A B C D 1 张三 01 数学 1 张三 02 英语 2 李四 01 数学 - 考点:列数 = R列数 + S2列数 - 公共列数(3+2-1 = 4列)。
(4) ÷ \div ÷ 除
- 含义:“包含所有”。R ÷ \div ÷ S 的结果是:R 中包含了 S 中所有值的那些记录。
- 通俗解释:假设 S2 中有“数学”和“英语”两门课。 R ÷ S 2 R \div S2 R÷S2 的意思就是:“找出既选修了数学,又选修了英语的学生”。
- 例子:设 S3 只有一列 C(01, 02)。求
R
÷
S
3
R \div S3
R÷S3。
- 分析:
- 张三(1):选了 01,也选了 02。 -> 选中
- 李四(2):只选了 01,没选 02。 -> 淘汰
- 结果:
A B 1 张三
- 分析:
(2) 集合运算符
这就完全是数学里的集合概念。前提:参与运算的两个关系(表)必须列数相同,且对应列的数据类型相同。
假设我们有 表 R1 和 表 R2:
- R1: { (1, 张三), (2, 李四) }
- R2: { (1, 张三), (3, 王五) }
(1) ∪ \cup ∪ 并
- 含义:R1 和 R2 加起来,去重。
- 例子: R 1 ∪ R 2 R1 \cup R2 R1∪R2
- 结果:{ (1, 张三), (2, 李四), (3, 王五) }
(2) − - − 差
- 含义:属于 R1 但不属于 R2 的。
- 例子: R 1 − R 2 R1 - R2 R1−R2 (R1 减去 R2 中有的)
- 结果:{ (2, 李四) } (因为 (1,张三) 在 R2 里也有,被减掉了)
(3) ∩ \cap ∩ 交
- 含义:既属于 R1 又属于 R2 的。
- 例子: R 1 ∩ R 2 R1 \cap R2 R1∩R2
- 结果:{ (1, 张三) }
(4) × \times × 笛卡尔积
- 含义:暴力组合。R1 的每一行去配对 R2 的每一行。不需要列相同。
- 例子: R 1 × R 2 R1 \times R2 R1×R2
- 考点计算:
- 行数 (基数) = R1行数 × \times × R2行数 ( 2 × 2 = 4 2 \times 2 = 4 2×2=4 行)
- 列数 (度) = R1列数 + R2列数 ( 2 + 2 = 4 2 + 2 = 4 2+2=4 列)
- 结果:
- (1, 张三, 1, 张三)
- (1, 张三, 3, 王五)
- (2, 李四, 1, 张三)
- (2, 李四, 3, 王五)
(3) 比较与逻辑运算符
这两个通常不单独作为代数运算,而是作为 σ \sigma σ (选择) 和 ⋈ \bowtie ⋈ (连接) 的辅助条件。
比较运算符
- 符号: > , ≥ , < , ≤ , = , ≠ >, \ge, <, \le, =, \ne >,≥,<,≤,=,=
- 例子:
σ
成绩
≥
60
(
学生表
)
\sigma_{成绩 \ge 60}(学生表)
σ成绩≥60(学生表)
- 含义:选出成绩大于等于60分的学生。
逻辑运算符
- 符号:
- ¬ \neg ¬ (非/NOT)
- ∧ \wedge ∧ (与/AND)
- ∨ \vee ∨ (或/OR)
- 例子:
σ
(
成绩
≥
60
)
∧
(
性别
=
′
女
′
)
(
学生表
)
\sigma_{(成绩 \ge 60) \wedge (性别 = '女')}(学生表)
σ(成绩≥60)∧(性别=′女′)(学生表)
- 含义:选出成绩及格并且是女生的记录。
(4)扩展关系运算
1. 自然连接

一句话核心:找同名列,值相等的拼在一起,列去重。
-
规则:
- 找到两个表中所有同名的属性(列)。
- 保留这些同名属性值完全相同的行。
- 去掉重复的列(同名列只留一份)。
-
图片实例分析(图 9-3):
- 同名列:关系
R
R
R 和
S
S
S 都有列
A
A
A 和列
C
C
C。所以连接条件是
R.A = S.A AND R.C = S.C。 - 比对过程:
- R 第一行 (a, b, c):去 S 里找
A
=
a
A=a
A=a 且
C
=
c
C=c
C=c 的行。
- 找到了 S 的第一行 ( a , c , d ) (a, c, d) (a,c,d)。匹配成功!
- 合并结果: ( a , b , c , d ) (a, b, c, d) (a,b,c,d)。
- R 第二行 (b, a, d):去 S 里找
A
=
b
A=b
A=b 且
C
=
d
C=d
C=d 的行。
- 找到了 S 的第三行 ( b , d , g ) (b, d, g) (b,d,g)。匹配成功!
- 合并结果: ( b , a , d , g ) (b, a, d, g) (b,a,d,g)。
- R 第三行 (c, d, e):去 S 里找 A = c A=c A=c 且 C = e C=e C=e 的行。没找到。 → \to → 舍弃。
- R 第四行 (d, f, g):去 S 里找 A = d A=d A=d 且 C = g C=g C=g 的行。没找到。 → \to → 舍弃。
- R 第一行 (a, b, c):去 S 里找
A
=
a
A=a
A=a 且
C
=
c
C=c
C=c 的行。
- 最终结果:就是图 © 中的那两行。
- 同名列:关系
R
R
R 和
S
S
S 都有列
A
A
A 和列
C
C
C。所以连接条件是
2. 除法 ( ÷ \div ÷) —— 图 9-4

一句话核心:必须包含“对方”所有的组合,才能被选中。
-
场景比喻:
- R R R 是“选课表”(学生,课程)。
- S S S 是“必修课表”(课程)。
- R ÷ S R \div S R÷S 的结果就是:选修了所有必修课的学生。
-
图片实例分析(图 9-4):
- 被除数 R:包含属性 { A , B , C , D } \{A, B, C, D\} {A,B,C,D}。
- 除数 S:包含属性 { C , D } \{C, D\} {C,D}。
- 结果属性: R R R 的属性减去 S S S 的属性 → { A , B } \to \{A, B\} →{A,B}。
- 运算逻辑:
- S 中有的组合是:
{(c, d), (e, f)}。这意味着,要想被选中,R 中的某组 { A , B } \{A, B\} {A,B} 必须同时拥有 ( c , d ) (c, d) (c,d) 和 ( e , f ) (e, f) (e,f) 这两对后缀。
- S 中有的组合是:
- 逐行检查 R 中的候选人
{
A
,
B
}
\{A, B\}
{A,B}:
- 看
{
a
,
b
}
\{a, b\}
{a,b}:
- R 第一行有 ( a , b , c , d ) (a, b, \mathbf{c, d}) (a,b,c,d) → \to → 满足条件1。
- R 第二行有 ( a , b , e , f ) (a, b, \mathbf{e, f}) (a,b,e,f) → \to → 满足条件2。
- 结论: { a , b } \{a, b\} {a,b} 全部命中,保留。
- 看
{
b
,
d
}
\{b, d\}
{b,d}:
- R 第四行有 ( b , d , e , f ) (b, d, \mathbf{e, f}) (b,d,e,f) → \to → 满足条件2。
- R 第五行有 ( b , d , d , l ) (b, d, d, l) (b,d,d,l) → \to → 不相关。
- 找遍了也没找到 ( b , d , c , d ) (b, d, \mathbf{c, d}) (b,d,c,d)。
- 结论: { b , d } \{b, d\} {b,d} 未能包含所有,淘汰。
- 看
{
c
,
k
}
\{c, k\}
{c,k}:
- R 第六行有 ( c , k , c , d ) (c, k, \mathbf{c, d}) (c,k,c,d) → \to → 满足条件1。
- R 第七行有 ( c , k , e , f ) (c, k, \mathbf{e, f}) (c,k,e,f) → \to → 满足条件2。
- 结论: { c , k } \{c, k\} {c,k} 全部命中,保留。
- 看
{
a
,
b
}
\{a, b\}
{a,b}:
- 最终结果:图 © 中的 { a , b } \{a, b\} {a,b} 和 { c , k } \{c, k\} {c,k}。
3. 外连接—— 图 9-5

一句话核心:不想丢数据,连不上的用 NULL (空值) 填。
在图 9-5 中,连接的公共列是 B B B 和 C C C。
(1) 左外连接 ( R ⊐ ⋈ S R \sqsupset\kern-2pt\bowtie S R⊐⋈S)**
- 口诀:左边是老大,右边配合它。
- 逻辑:保留左表
R
R
R 的所有行。如果
S
S
S 中有匹配的,就填数据;如果
S
S
S 中没有匹配的,就填
null。 - 分析图 ©:
- R 的第一行 ( a , b , c ) (a, b, c) (a,b,c) 能在 S 中匹配到 ( b , c , d ) (b, c, d) (b,c,d),所以结果是完整数据。
- R 的第二行 ( b , a , d ) (b, a, d) (b,a,d),在 S 中找不到 B = a , C = d B=a, C=d B=a,C=d 的行。怎么办?保留 R,S 部分填 null。
- R 的第三行 ( c , d , e ) (c, d, e) (c,d,e),能匹配到 S 的 ( d , e , g ) (d, e, g) (d,e,g),结果完整。
- R 的第四行 ( d , f , g ) (d, f, g) (d,f,g),在 S 中找不到 B = f , C = g B=f, C=g B=f,C=g 的行。保留 R,S 部分填 null。
(2) 右外连接 ( R ⋈ ⊏ S R \bowtie\kern-2pt\sqsubset S R⋈⊏S)**
- 口诀:右边是老大,左边配合它。
- 逻辑:保留右表
S
S
S 的所有行。R 中没匹配上的填
null。 - 分析图 (d):
- S 的 ( b , c , d ) (b, c, d) (b,c,d) 和 ( d , e , g ) (d, e, g) (d,e,g) 都在 R 中找到了匹配,正常显示。
- S 的第三行 ( f , d , g ) (f, d, g) (f,d,g),找 R 中 B = f , C = d B=f, C=d B=f,C=d 的行,没找到。保留 S,R 部分填 null。
- S 的第四行 ( d , e , c ) (d, e, c) (d,e,c),找 R 中 B = d , C = e B=d, C=e B=d,C=e 的行,虽然 R 有 ( c , d , e ) (c, d, e) (c,d,e) 但那是 B = d , C = e B=d, C=e B=d,C=e,匹配上了!(注:仔细看图,R的第三行是 c, d, e,对应 B=d, C=e。S的第二行是 d, e, g,对应 B=e, C=g 吗?不对,S的列是 B, C, D。所以 S 的第二行是 B=d, C=e, D=g。这与 R 的第三行 B=d, C=e 匹配。)
- 修正观察 S 的第四行:S 的第四行是 f , d , g f, d, g f,d,g (B=f, C=d),R 里没这个组合,所以填 null。图中的第四行是 d , e , c d, e, c d,e,c (B=d, C=e),这应该能匹配上 R 的第三行啊?
- 图 (d) 解析勘误:仔细看图 (d) 的最后一行。S 是
(
d
,
e
,
c
)
(d, e, c)
(d,e,c),即
B
=
d
,
C
=
e
,
D
=
c
B=d, C=e, D=c
B=d,C=e,D=c。R 中有没有
B
=
d
,
C
=
e
B=d, C=e
B=d,C=e?有!是
(
c
,
d
,
e
)
(c, d, e)
(c,d,e)。所以应该匹配。但图中显示的是
null, f, d, g,这对应的是 S 的第三行。图中似乎少画了 S 的第四行 ( d , e , c ) (d, e, c) (d,e,c) 的结果,或者 S 的数据我看错了。 - 以图为准:图 (d) 展示了 S 中那些在 R 里找不到“对象”的行,左边都被填上了 null。
(3) 全外连接 ( R ⊐ ⋈ ⊏ S R \sqsupset\kern-2pt\bowtie\kern-2pt\sqsubset S R⊐⋈⊏S)**
- 口诀:大家都是老大,谁也别丢。
- 逻辑:左外连接的结果 ∪ \cup ∪ 右外连接的结果。
- 分析图 (e):
- 既包含了 R 中没匹配上的(右边补 null),也包含了 S 中没匹配上的(左边补 null),当然还有匹配成功的。
四、数据库语言SQL
📝 这部分大家基本都熟悉了,什么查询语句什么的就不多说了,说几个容易犯错的点。
4.1 SQL 语言分类的考点
(1)DROP vs DELETE
- DELETE (DML):
- 删除表中的数据,表结构还在。
- 可以回滚 (Rollback),有日志记录,速度慢。
- 支持
WHERE条件。
- DROP (DDL):
- 删除整个表(连同结构、数据、索引全部炸掉)。
- 不可回滚,速度极快。
- TRUNCATE (DDL - 扩展考点):
- 清空表中数据,保留结构。
- 速度快(不记行级日志),不可回滚,重置自增 ID。
(2)权限控制 (DCL) - GRANT/REVOKE
- 考点:语法细节。
- 语法公式:
GRANT <权限列表> ON <对象类型> <对象名> TO <用户> [WITH GRANT OPTION]; - 陷阱:
WITH GRANT OPTION:表示该用户拿到权限后,还可以把这个权限转手送给别人。- 级联收回:如果 A 把权限给了 B,B 给了 C。当 A 收回 B 的权限时,C 的权限通常也会被级联收回。
4.2 三级模式结构图的考点

这张图展示了 SQL 对象与三级模式的对应关系,核心考点只有两个:
(1)视图 (View) = 外模式
- 定义:视图是虚表,物理存储中没有数据,只存了 SQL 逻辑。
- 考点:
- 逻辑独立性:修改基本表的结构(如改列名),可以通过修改视图定义来保持对外接口不变。
- 视图更新限制:不是所有视图都能执行
INSERT/UPDATE/DELETE。如果视图包含了GROUP BY、DISTINCT或聚合函数,通常不可更新。
(2)基本表 = 模式 (概念模式)
- 定义:实际存储数据的逻辑表。
- 考点:一个基本表可以对应一个或多个存储文件(内模式)。
4.3 下午题(试题三)实战填空“坑点”
(1)DDL 中的约束
下午题第一小问通常是补充 CREATE TABLE 语句。
- 主键:
PRIMARY KEY (列名) - 外键:必考!
FOREIGN KEY (本表列名) REFERENCES 主表名(主表主键) [ON DELETE CASCADE] -- 级联删除,常考填空 - 检查约束:
CHECK (条件),例如CHECK (age > 18 AND gender IN ('M','F'))。 - 默认值:
DEFAULT 'Unknown'。
(2) GROUP BY 与 HAVING 的区别
- 死穴:初学者习惯在
GROUP BY后面写WHERE。 - 铁律:
WHERE:在分组前过滤(不能用聚合函数,如SUM,COUNT)。HAVING:在分组后过滤(专门用来过滤聚合函数的结果)。
- 例题:查询平均成绩大于 60 分的学生 ID。
- ❌
SELECT id FROM score WHERE AVG(grade) > 60 GROUP BY id(错!WHERE 里不能有 AVG) - ✅
SELECT id FROM score GROUP BY id HAVING AVG(grade) > 60
- ❌
(3) 连接查询 (JOIN)
- 填空技巧:如果题目说“列出所有部门及其员工信息(包括没有员工的部门)”,看到“所有”且在主语位置,立刻反应出
LEFT JOIN(或RIGHT JOIN)。 - 语法:
FROM TableA LEFT JOIN TableB ON TableA.id = TableB.aid。
(4)子查询中的 EXISTS / IN
- 考点:下午题常考“查询没有选修数学课的学生”。
- 写法:
SELECT * FROM Student s WHERE NOT EXISTS ( SELECT * FROM Course c WHERE c.stu_id = s.id AND c.name = 'Math' )
4.4 真题模拟
【场景】
有两个表:
Emp(eid, ename, did, salary)- 员工表Dept(did, dname)- 部门表
【问题 1:DDL】
创建员工表时,要求薪水必须大于 0,且如果部门被删除了,该部门的员工自动删除。请补全 SQL:
CREATE TABLE Emp (
eid INT PRIMARY KEY,
salary INT,
did INT,
CHECK ( [salary > 0] ), -- 空 1
FOREIGN KEY (did) REFERENCES Dept(did) ON DELETE [Cascade] -- 空 2
);
【问题 2:DQL】
查询平均工资超过 5000 的部门名称。
SELECT dname
FROM Emp e, Dept d
WHERE e.did = d.did
GROUP BY [d.did, d.dname] -- 空 3
[HAVING] AVG(salary) > 5000; -- 空 4
五、数据库管理系统
📝 说白了就是类似Navicat的软件。
5.1 什么是DBMS
📝 数据库管理系统(DBMS)是操作和管理数据库的软件,用于建立、使用和维护数据库。位于 用户/应用程序 和 操作系统之间。
5.2 DBMS的功能
- 数据定义: 提供DDL语言,建表啊什么的。
- 数据操纵: 提供DML语言,增删改查。
- 数据库的运行管理: 通过并发控制、安全性检查、存取控制、完整性检查等手段,保持数据的正确录入和完整。
- 数据的组织、存储和管理: 这是数据在硬盘上的相关存放。
- 数据库的建立和维护: 数据导入导出、数据库转储、恢复、性能重组等。
- 其它功能,如通信、数据转换等: 通信一般就是和Java等语言产生链接。
5.3 DBMS的特征
- 数据的结构化且统一管理
- 有较高的数据独立性
- 数据的控制功能:
- 安全性
- 完整性
- 并发控制
- 故障恢复
5.4 DBMS的分类
- 关系数据库系统
- 面相对象的数据库系统
- 对象关系数据库系统
六、关系数据库的规范化(重点)
6.1. 函数依赖
📝 这是规范化的基石。
-
定义: X → Y X \to Y X→Y。意思是“只要我知道了 X X X 的值,我就能唯一确定 Y Y Y 的值”。
- 例子:
学号→ \to →姓名。因为一个学号只对应一个学生。
- 例子:
-
核心分类:
- 完全函数依赖 (
X
→
F
Y
X \xrightarrow{F} Y
XFY):
- Y Y Y 依赖于 X X X,且不依赖于 X X X 的任何真子集。
- 场景:通常发生在组合主键上。比如
(学号, 课程号) -> 成绩。你必须同时知道学号和课程号,才能确定成绩。只知道学号不行,只知道课程号也不行。
- 部分函数依赖 (
X
→
P
Y
X \xrightarrow{P} Y
XPY):
- Y Y Y 依赖于 X X X 的一部分(真子集)。
- 场景:
(学号, 课程号) -> 姓名。其实只需要学号就能决定姓名了,课程号是多余的。这就是部分依赖。这是 2NF 要消灭的敌人。
- 传递函数依赖 (
X
→
Y
,
Y
→
Z
X \to Y, Y \to Z
X→Y,Y→Z):
- X X X 决定 Y Y Y, Y Y Y 决定 Z Z Z(且 Y Y Y 不能决定 X X X)。
- 场景:
学号 -> 系名,系名 -> 系主任。于是学号 -> 系主任。这是 3NF 要消灭的敌人。
- 完全函数依赖 (
X
→
F
Y
X \xrightarrow{F} Y
XFY):
-
Armstrong 公理系统(计算候选键的工具):
- 不需要背诵公理的定义,但要会用它们来推导。
- 核心用途:求属性闭包
(
X
)
+
(X)^+
(X)+。
- 比如:已知 A → B , B → C A \to B, B \to C A→B,B→C。求 A A A 的闭包?
- ( A ) + = { A , B , C } (A)^+ = \{A, B, C\} (A)+={A,B,C}。因为 A 能推 B,B 能推 C。所以 A 能决定 A,B,C。
- 如果一个属性集的闭包包含了所有属性,那它就是候选键。
6.2 规范化
📝 范式是衡量表结构“优劣”的标准。级别越高,冗余越小,但查询可能越慢(因为表被拆散了)。
口诀:1NF 存原子,2NF 没部分,3NF 没传递。
(1) 第一范式 (1NF)
- 规则:属性不可再分。
- 反例:有一列叫“联系方式”,里面存了“手机:138…, 微信:wx…”。这就不满足 1NF。
- 正例:拆成“手机号”一列,“微信号”一列。
- 现状:现代关系数据库只要能建表,默认就是 1NF。
(2) 第二范式 (2NF)
- 规则:满足 1NF,且消除了非主属性对候选键的部分依赖。
- 判别技巧:
- 检查主键。
- 如果主键是单属性(只有一个字段),那自动符合 2NF。
- 如果主键是组合键(A, B),检查有没有非主属性 C 是仅由 A 决定的。如果有,就不是 2NF。
- 解决:把部分依赖的列拆出去单独建表。
(3) 第三范式 (3NF)
- 规则:满足 2NF,且消除了非主属性对候选键的传递依赖。
- 判别技巧:
- 检查非主属性之间有没有依赖关系。
- 比如:
主键A -> 普通列B -> 普通列C。这里 B 和 C 都是非主属性,它们之间居然有依赖,这就是 3NF 不允许的。
- 解决:把
B -> C拆出去单独建表。
6.3 模式分解
📝 把一个大表拆成几个小表,必须满足两个条件,否则拆了就回不去了。
(1) 无损连接
- 含义:分解后的表 R 1 R1 R1 和 R 2 R2 R2,通过自然连接(Join)后,能完全还原成原来的表 R R R,没有多出垃圾数据,也没少数据。
- 判定公式(必背):
- 设分解为 R 1 R1 R1 和 R 2 R2 R2,公共属性为 K = R 1 ∩ R 2 K = R1 \cap R2 K=R1∩R2。
- 如果 K → R 1 K \to R1 K→R1 或者 K → R 2 K \to R2 K→R2 成立(即公共属性 K K K 是 R1 或 R2 的候选键/超键),则分解是无损的。
- 口诀:“交集必须是某一方的码”。
(2) 保持函数依赖
- 含义:原表里的所有依赖关系(如 A → B A \to B A→B),在分解后的某张小表里依然能直接找到,不需要跨表。
6.4 知识模块总结
七、数据库的控制功能
7.1 事务
📝 事务是指作为单个工作逻辑单元的一系列操作,要么完全执行,要么完全不执行。
7.2 事务的性质(ACID)
- 原子性(Atomicity) 要么都做,要么都不做
- 一致性(Consistency) 事务完成时,必须保证所有数据都保持一致的状态
- 隔离性(Isolation) 事物之间相互隔离
- 持久性(Durability) 事务完成后,更新操作永久有效
7.3 并发带来的三大问题

(1)丢失修改
- T1和T2同时修改,T2后提交,覆盖了T1的修改内容,T1的修改丢失。
(2)读脏数据
- T1修改了A,但是还没有提交,结果此时T2读到了这个A,但是后面T1又回滚了这个操作,所以此时T2读到的A是个假的。
(3)不可重复读
- T1一共读取了两次A,第一次读取的时候正确,但在第二次读取之前,T2修改了A,导致了两次读取不一致,破坏了隔离性。
7.4 封锁技术
(1)排它锁(X锁/写锁)
- 如果事务A对某个数据加了X锁,自己可以读和写,但其他人不允许读也不能写。
(2)共享锁(S锁/读锁)
- 如果事务A对某个数据加了S锁,自己只能读不能写,别人也可以加S锁来读,但是不能加X锁来写。
7.5 三级封锁协议
| 协议级别 | 规则 (怎么加锁) | 解决的问题 |
|---|---|---|
| 一级封锁协议 | 写前加 X 锁,事务结束才释放。 | 解决 丢失修改 |
| 二级封锁协议 | 一级基础上,读前加 S 锁,读完立刻释放。 | 解决 读脏数据 (+丢失修改) |
| 三级封锁协议 | 一级基础上,读前加 S 锁,事务结束才释放。 | 解决 不可重复读 (+丢修+读脏) |
7.6 其它锁协议
(1)两段锁协议(2PL)
- 含义: 事务分为两个阶段
- 增长阶段: 只拿锁,不放锁
- 缩减阶段: 只放锁,不拿锁
这是“可串行化调度”的充分调度,一般只要遵守2PL,并发结果就是正确的
(2)死锁
- 含义: T1拿了A等B,T2拿了B等A,形成循环。
- 解决:
- 预防:一次性申请所有资源。
- 解除:系统检测到死锁后,选择一个代价最小的事务强制回滚。
(3)可串行化
📝 遵循2PL协议的操作。
7.7 故障和恢复
(1)故障类型
- 事务故障: 程序报错,死锁被杀
- 系统故障: 断点、OS崩溃
- 介质故障: 硬盘损坏等
(2)备份方法
- 静态转储: 备份时关闭数据库的使用,业务停摆
- 动态转储: 备份时允许读写(配合日志文件才能恢复)
- 海量转储: 每次备全量
- 增量转储: 只备份变化的部分
八、数据仓库和分布式数据库基础知识

8.1 数据仓库的概念
- 传统数据库: 用来记账的(增删改查快,数据实时)
- 数据仓库: 用来分析的(读多写少,数据量大)
8.2 四大特征
- 面向主题: 数据方向主要根据业务而定,而不是按照“应用程序”组织。
- 集成: 把不同来源的数据统一格式,清洗数据。
- 相对稳定:
只读不改,因为是用作分析,一般入库后不进行实时更新。 - 反映历史变化: 记录了过去多年的数据,带有时间戳,用于分析趋势。
8.3 关键流程:ETL
- E(抽取): 从各种源头将数据抓取。
- T(转换): 清洗数据、统一格式、计算衍生字段。
- L(加载): 将完整的数据入库。
8.4 数据仓库的分类
- 企业仓库
- 数据集市
- 虚拟仓库
8.5 分布式数据库
(1)核心概念
📝 物理上分散,逻辑上集中,数据分散在多台计算机上,但在用户来看就像在操作一台数据库一样。
(2)体系结构
📝 分布式数据库的数据是怎么组织的。
- 全局外模式 / 全局概念模式: 用户看到的最后一张大表。
- 分片模式: 切分的方式,比如数据是按照水平切分(比如北京数据放在北京,上海数据放在上海),或者按照列切分,也就是垂直切分(比如工资表放在哪个部门)
- 分布模式: 定位,也就是数据存放在哪台机器上。
- 局部模式 / 局部内模式: 每台机器上实际运行的数据库是什么,MySQL或者Oracle。
(3)三大透明性
| 透明性名称 | 含义 | 对应层级 |
|---|---|---|
| 分片透明性 | 用户不需要知道数据是怎么切分的(水平还是垂直),只管查大表。 | 最高级(对应分片模式) |
| 位置透明性 | 用户不需要知道数据存放在哪个物理节点上(北京还是上海)。 | 中级(对应分布模式) |
| 逻辑透明性 (或局部数据模型透明性) | 用户不需要知道局部数据库是用什么模型(MySQL还是SQL Server)。 | 低级(对应局部模式) |
8.6 分布式数据库的特点
- 高可扩展性
- 高并发性
- 高可用性

九、真题练习





DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)