软考必看!关系数据库核心知识点全解析+记忆口诀+避坑指南
备考数据库系统工程师的速通秘籍,5分钟搞懂关系数据库核心考点!
通俗理解
-
关系数据库:像一个“电子表格仓库”,数据以二维表(行+列)形式组织,表之间通过主键-外键关联。
-
核心思想:用数学中的“集合”和“关系”理论管理数据,避免数据冗余和混乱。
例子:学生选课系统
-
学生表(学号、姓名、班级)
-
课程表(课程号、课程名、学分)
-
选课表(学号、课程号、成绩)
三个表通过学号、课程号关联,避免重复存储学生或课程信息。
一、关系数据库基础概念(上午题高频!)
1️⃣ 关系模型三要素
- 数据结构:用二维表(行+列)表示数据,比如学生表(学号、姓名、成绩)。
- 数据操作:关系代数(选择、投影、连接)和SQL语言(增删改查)。
- 完整性约束:实体完整性(主键非空)、参照完整性(外键关联)、用户自定义约束(如成绩≥0)。
记忆口诀:表是骨架,操作是手脚,约束是规则!
要素 | 说明 | 例子 |
---|---|---|
数据结构 | 表结构(关系模式):列定义(属性) + 行(元组) | 学生表的列:学号、姓名 |
数据操作 | 关系代数(选择、投影、连接)和 SQL(增删改查) | SELECT * FROM 学生表 |
完整性约束 | 保证数据正确性的规则(主键唯一、外键有效、用户自定义规则) | 学号不能重复(主键) |
键(Key)的作用与分类
键类型 | 定义 | 例子 | 考试重点 |
---|---|---|---|
超键 | 能唯一标识元组的属性集合(可能包含冗余属性) | 学号+姓名(冗余) | 不常用,理解即可 |
候选键 | 最小的超键(无冗余属性) | 学号 | 主键的基础 |
主键 | 被选中的候选键,唯一且非空 | 学号(唯一标识一个学生) | 必考! |
外键 | 一个表中的属性,是另一表的主键,用于关联表 | 选课表中的学号(关联学生表) | 必考!参照完整性 |
联合主键 | 多个属性组合作为主键 | 选课表的(学号+课程号) | 复合主键的应用场景 |
记忆口诀:
“主键唯一标识,外键连接表间情;候选超键一家亲,联合主键组合行。”
2️⃣ 关键术语速记
- 候选码:能唯一标识元组的属性(如学号、身份证号)。
- 主码:候选码中选一个当老大(比如学号为主码)。
- 外码:别人的主码(如学生表的“所属院系”引用院系表的“院系编号”)。
- 全码:所有属性联合才能唯一标识元组(极少见,比如考试座位号+时间+科目)。
避坑点:外码必须是被引用表的主码,否则报错!
二、关系代数与SQL(下午题必考!)
1️⃣ 关系代数三把斧
关系代数是 SQL 的数学基础,考试中常考符号和运算逻辑(上午题)。
运算类型 | 符号 | 功能描述 | 例子(伪代码) |
---|---|---|---|
选择 | σ | 按条件筛选行 | σ_{成绩>90}(选课表) |
投影 | π | 选择需要的列 | π_{学号,姓名}(学生表) |
并 | ∪ | 合并两个表的行(去重) | 学生表1 ∪ 学生表2 |
差 | - | 取表A有但表B没有的行 | 学生表1 - 学生表2 |
笛卡尔积 | × | 两表所有行组合 | 学生表 × 课程表 |
自然连接 | ⋈ | 按相同列名自动连接并去重 | 学生表 ⋈ 选课表 |
θ连接 | ⋈_{条件} | 按指定条件连接(如=, >, <) | 学生表 ⋈_{班级='计算机'} 选课表 |
记忆技巧:
“选行筛列投影忙,并差连接表间藏;笛卡尔积全配对,自然连接去冗行。”
2️⃣ SQL高频语法
-- 多表联查(下午题必写!)
SELECT 学生.姓名, 院系.名称
FROM 学生 JOIN 院系 ON 学生.院系编号 = 院系.编号
WHERE 学生.成绩 > 80;
避坑点:避免笛卡尔积!一定要写关联条件(如ON
或WHERE
)。
三、规范化理论(设计题核心!)
1️⃣ 范式升级打怪
- 1NF:字段不可再分(如“地址”拆成省/市/区)。
- 2NF:消除部分依赖(如订单表不能同时存商品ID和商品价格)。
- 3NF:消除传递依赖(如员工表不该存部门经理,应通过部门ID关联)。
记忆口诀:一拆字段,二砍冗余,三断传递!
2️⃣ 函数依赖判定
- 完全依赖:X→Y,且X的任意真子集都不能决定Y(如(学号,课程)→成绩)。
- 部分依赖:X→Y,但X的子集也能决定Y(如(学号,姓名)→性别,只需学号即可)。
避坑点:设计表时优先满足3NF,避免数据冗余和更新异常!
四、完整性约束与事务(综合题重点!)
约束类型 | 规则说明 | 实现方式 | 例子 |
---|---|---|---|
实体完整性 | 主键非空且唯一 | PRIMARY KEY | 学生表的学号不能为空 |
参照完整性 | 外键值必须存在于主键中(或为NULL) | FOREIGN KEY REFERENCES | 选课表的学号必须在学生表中存在 |
用户定义完整性 | 自定义规则(如范围、格式) | CHECK 约束、触发器 | 成绩必须在0~100之间 |
1️⃣ ACID特性
- 原子性:事务要么全成功,要么全回滚(如转账:A-100和B+100必须同时完成)。
- 隔离性:避免脏读(读到未提交数据)、不可重复读(同一事务内数据不一致)。
记忆口诀:原子全做全不做,隔离互不干扰!
2️⃣ 封锁协议
- 共享锁(S锁):读数据时加锁,别人只能读不能写(如
SELECT ... FOR SHARE
)。 - 排他锁(X锁):写数据时独占锁,别人不能读写(如
UPDATE
语句自动加锁)。
避坑点:死锁可通过“顺序加锁”或设置超时时间预防!
五、SQL优化技巧(下午应用题救命!)
1️⃣ 索引设计三原则
- 高频查询字段:对
WHERE
、JOIN
、ORDER BY
中的字段建索引。 - 避免过多索引:索引影响插入/更新速度,小表无需索引。
- 复合索引顺序:最常用字段放前面(如INDEX(学院, 专业))。
2️⃣ 执行计划分析
- 用
EXPLAIN
查看查询路径,重点关注:- type:
ALL
(全表扫描)→ 需优化! - key:是否命中索引。
记忆口诀:执行计划是X光,扫一眼知健康!
- type:
六、快速记忆表
核心概念 | 关键词 | 示例或公式 | 考试重点 |
---|---|---|---|
主键 | 唯一、非空 | 学号 | 实体完整性 |
外键 | 关联、参照 | 选课表的学号→学生表的学号 | 参照完整性 |
关系代数选择 | σ_{条件} | σ_{成绩>90}(选课表) | 行筛选 |
关系代数投影 | π_{列名} | π_{姓名,班级}(学生表) | 列筛选 |
自然连接 | ⋈ | 学生表 ⋈ 选课表 | 自动按同名列连接 |
七、易错点提醒
-
主键与外键的混淆:主键是当前表的唯一标识,外键是其他表的主键。
-
自然连接 vs 笛卡尔积:自然连接会自动去重同名列,笛卡尔积是“全组合”。
-
联合主键的表示:在 SQL 中用
PRIMARY KEY (列1, 列2)
,而非单独声明。