适合读者:软考中级备考同学
阅读时间:7分钟
内容:关系代数、SQL查询、规范化三大模块核心对比表、易错点、记忆口诀汇总
一、关系代数部分
1.1 基本运算速查表
| 运算 | 符号 | 操作对象 | 核心含义 | SQL类比 |
|---|---|---|---|---|
| 选择 | σ\sigmaσ | 行 | 按条件筛选元组 | WHERE |
| 投影 | π\piπ | 列 | 选择指定属性 | SELECT 列 |
| 并 | ∪\cup∪ | 关系(整体) | 两个关系的并集 | UNION |
| 差 | −-− | 关系(整体) | 两个关系的差集 | EXCEPT |
| 笛卡尔积 | ×\times× | 关系(整体) | 两表所有元组组合 | CROSS JOIN |
并相容性 :并、差运算要求两个关系属性个数相同 且对应属性域相同。
1.2 连接运算对比
| 连接类型 | 连接条件 | 是否去重 | 是否保留未匹配元组 | 结果列数 |
|---|---|---|---|---|
| 等值连接 | 指定属性相等(可不同名) | 否 | 否 | 两表列数之和 |
| 自然连接 | 同名属性自动相等 | 是(同名属性只保留一列) | 否 | 列数和 −-− 同名属性数 |
| 左外连接 | 指定条件 | 否 | 保留左表全部 | 两表列数之和 |
| 右外连接 | 指定条件 | 否 | 保留右表全部 | 两表列数之和 |
| 全外连接 | 指定条件 | 否 | 保留两表全部 | 两表列数之和 |
除运算(÷\div÷) :用于回答"所有"、"至少"类查询,R÷SR \div SR÷S 的结果是 RRR 中与 SSS 中所有元组都匹配的元组。
1.3 关系代数综合查询思路
| 步骤 | 操作 | 说明 |
|---|---|---|
| 第1步 | 识别涉及的表 | 查询涉及哪些关系 |
| 第2步 | 连接 | 把需要的表全部连接起来 |
| 第3步 | 选择(σ\sigmaσ) | 筛选满足条件的行 |
| 第4步 | 投影(π\piπ) | 选出需要输出的列 |
| 第5步 | 特殊处理 | "所有"类查询用除运算或差运算 |
二、SQL查询部分
2.1 SQL语言分类
| 分类 | 核心命令 | 作用 |
|---|---|---|
| DDL(数据定义语言) | CREATE、DROP、ALTER |
定义数据库结构 |
| DML(数据操纵语言) | SELECT、INSERT、UPDATE、DELETE |
数据查询与更新 |
| DCL(数据控制语言) | GRANT、REVOKE |
权限管理 |
| TCL(事务控制语言) | COMMIT、ROLLBACK、SAVEPOINT |
事务管理 |
2.2 SELECT语句执行顺序(重点!)
| 执行顺序 | 关键字 | 作用 |
|---|---|---|
| 1 | FROM |
确定数据来源 |
| 2 | WHERE |
筛选行(不能使用聚合函数) |
| 3 | GROUP BY |
分组 |
| 4 | HAVING |
筛选分组(可以使用聚合函数) |
| 5 | SELECT |
选择列、计算表达式 |
| 6 | ORDER BY |
排序 |
2.3 WHERE vs HAVING(必考辨析)
| 对比项 | WHERE | HAVING |
|---|---|---|
| 执行时机 | 分组前 | 分组后 |
| 能否使用聚合函数 | ❌ 不能 | ✅ 可以 |
| 作用对象 | 单个元组(行) | 分组后的组 |
2.4 嵌套查询关键词对比
| 关键词 | 含义 | 等价关系 |
|---|---|---|
IN |
在子查询结果集合中 | --- |
NOT IN |
不在子查询结果集合中 | --- |
EXISTS |
子查询是否有返回行(相关子查询) | --- |
= ANY |
等于子查询结果中的任意一个 | 等价于 IN |
<> ALL |
不等于子查询结果中的全部 | 等价于 NOT IN |
> ANY |
大于子查询结果中的最小值 | --- |
> ALL |
大于子查询结果中的最大值 | --- |
IN vs EXISTS :
IN是不相关子查询(先执行子查询),EXISTS通常是相关子查询(外层每行执行一次)。子查询结果集小时用IN,子查询结果集大时用EXISTS。
三、规范化部分
3.1 函数依赖的四种分类
| 类型 | 定义 | 示例 |
|---|---|---|
| 平凡函数依赖 | Y⊆XY \subseteq XY⊆X | (学号,姓名)→学号(学号, 姓名) \rightarrow 学号(学号,姓名)→学号 |
| 非平凡函数依赖 | Y⊈XY \not\subseteq XY⊆X | 学号 →\rightarrow→ 姓名 |
| 完全函数依赖 | YYY 依赖于 XXX 的全部属性 | (学号,课程号)→成绩(学号, 课程号) \rightarrow 成绩(学号,课程号)→成绩 |
| 部分函数依赖 | YYY 依赖于 XXX 的某个真子集 | (学号,课程号)→姓名(学号, 课程号) \rightarrow 姓名(学号,课程号)→姓名(只依赖学号) |
| 传递函数依赖 | X→YX \rightarrow YX→Y,Y→ZY \rightarrow ZY→Z,Y↛XY \not\rightarrow XY→X | 学号 →\rightarrow→ 班级号 →\rightarrow→ 班级名称 |
软考只关心非平凡函数依赖 。部分依赖只可能出现在组合键中。
3.2 范式递进关系(重点!)
| 范式 | 要求 | 消除的问题 |
|---|---|---|
| 1NF | 属性不可再分(原子性) | 多值属性 |
| 2NF | 1NF + 非主属性完全依赖于候选键 | 非主属性的部分函数依赖 |
| 3NF | 2NF + 非主属性直接依赖于候选键 | 非主属性的传递函数依赖 |
| BCNF | 3NF + 所有FD的左部都包含候选键 | 主属性的传递/部分函数依赖 |
| 4NF | BCNF + 消除非平凡多值依赖 | 多值依赖 |
三个关键结论:
- 满足 BCNF ⇒ 满足 3NF(反过来不一定)
- 满足 3NF ⇒ 满足 2NF(反过来不一定)
- 满足 4NF ⇒ 满足 BCNF(反过来不一定)
3.3 模式分解的两个核心性质
| 性质 | 含义 | 判断方法(二元分解) |
|---|---|---|
| 无损连接性 | 分解后能通过自然连接还原原表 | R1∩R2→R1R_1 \cap R_2 \rightarrow R_1R1∩R2→R1 或 R1∩R2→R2R_1 \cap R_2 \rightarrow R_2R1∩R2→R2 |
| 保持依赖性 | 分解后的FD集等价于原FD集 | 检查所有FD是否都能从投影FD推导出 |
重要原则 :无损连接必须满足,保持依赖尽量满足。
四、E-R图部分
4.1 E-R图三要素
| 要素 | 图形符号 | 含义 |
|---|---|---|
| 实体 | 矩形 | 现实世界中可区分的事物 |
| 属性 | 椭圆 | 实体的特征 |
| 联系 | 菱形 | 实体之间的联系 |
4.2 属性分类
| 属性类型 | 图形符号 | 转换规则 |
|---|---|---|
| 简单属性 | 椭圆 | 直接作为表的字段 |
| 复合属性 | 椭圆(子属性用椭圆连接) | 拆分成多个子属性 |
| 多值属性 | 双椭圆 | 单独建表 |
| 派生属性 | 虚线椭圆 | 通常不存储 |
4.3 联系类型与转换规则
| 联系类型 | E-R图标注 | 转换规则 |
|---|---|---|
| 1:1 | 两侧写 1 和 1 |
任一端加另一端的主键作为外键 |
| 1:N | 两侧写 1 和 N |
在 N端 加 1端 的主键作为外键 |
| M:N | 两侧写 M 和 N |
新建独立关系,包含两端主键作为外键,组合成主键 |
五、事务与并发控制部分
5.1 ACID特性
| 特性 | 含义 | 实现技术 |
|---|---|---|
| 原子性 | 要么全做,要么全不做 | Undo Log |
| 一致性 | 约束不被破坏 | DBMS约束 + 应用程序 |
| 隔离性 | 并发互不干扰 | 锁 + MVCC |
| 持久性 | 提交后不丢失 | Redo Log |
5.2 并发事务的三种问题
| 问题 | 定义 |
|---|---|
| 丢失修改 | 后提交的事务覆盖先提交的修改 |
| 脏读 | 读到未提交事务的修改 |
| 不可重复读 | 同一事务内两次读取结果不一致 |
5.3 三级封锁协议
| 封锁协议 | 解决丢失修改 | 解决脏读 | 解决不可重复读 |
|---|---|---|---|
| 一级 | ✅ | ❌ | ❌ |
| 二级 | ✅ | ✅ | ❌ |
| 三级 | ✅ | ✅ | ✅ |
六、易错点汇总
| 易错点 | 正确理解 |
|---|---|
| 选择(σ\sigmaσ)修改列,投影(π\piπ)修改行 | ❌ 选择改行,投影改列 |
| 自然连接会保留重复列 | ❌ 自然连接去除重复列 |
| 外键不能为NULL | ❌ 外键可以为NULL |
| WHERE中可以使用聚合函数 | ❌ 不能,HAVING才能用 |
= ANY 等价于 NOT IN |
❌ = ANY 等价于 IN ,<> ALL 等价于 NOT IN |
| 2NF消除了传递依赖 | ❌ 2NF消除的是部分依赖 ,3NF才消除传递依赖 |
| BCNF一定满足3NF | ✅ 正确(BCNF是3NF的加强版) |
| 4NF消除的是函数依赖 | ❌ 4NF消除的是多值依赖 |
| M:N联系在任一端加外键 | ❌ M:N联系必须单独建表 |
| 无损连接和保持依赖都是必须的 | ❌ 无损连接必须满足,保持依赖尽量满足 |
| 二级封锁协议解决了不可重复读 | ❌ 二级解决了脏读,三级才解决不可重复读 |
七、记忆口诀汇总
关系代数:
选择选行σ\sigmaσ,投影选列π\piπ。
并差要求并相容,笛卡尔积行相乘。
自然连接同名连,去除重复留一边。
等值连接指定条件,同名异名都能连。
除运算:
除运算找"所有",先投影出全集,再乘全部课程。
减去实际选课,缺课学号就出现。
全集减去缺课,就是全能选手。
SQL执行顺序:
FROM最先WHERE后,GROUP BY在中间,
HAVING后筛组,SELECT选列,ORDER BY排最后。
WHERE vs HAVING:
WHERE筛行分组前,HAVING筛组在分组后。
WHERE不能聚合函数,HAVING专治聚合条件。
规范化递进:
1NF原子不可分,2NF消除部分依赖(组合键中部分决定),
3NF消除传递依赖(X→Y→ZX \rightarrow Y \rightarrow ZX→Y→Z),
BCNF补3NF漏(所有FD左部都含候选键),
4NF消除多值依赖。
E-R图转换:
1:1任一端加外键,1:N在N端加,M:N必须单独建。
ACID:
原子全做全不做(Undo),一致约束不能破。
隔离并发互不扰(锁+MVCC),持久提交不丢失(Redo)。
封锁协议:
一级防丢失,二级加脏读,三级防重读。
🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容
#软考中级 #软件设计师 #关系代数 #SQL #规范化 #数据库技术 #软考备考