之前给朋友整理过几门二级的笔记,这次顺便把三级数据库的也放出来。
内容按官方考试大纲的顺序过了一遍,真题都标了来源,答案以题库给的标准答案和解析为准。里面的图是让 AI 画的。
考试信息
| 项目 | 内容 |
|---|---|
| 下次考试 | 2027 年 3 月 27 日至 29 日(以中国教育考试网公布为准) |
| 考试时长 | 120 分钟 |
| 满分 / 及格 | 100 分 / 60 分 |
| 单选题 | 40 题,每题 1 分,共 40 分 |
| 应用题(填空) | 15 空,每空 2 分,共 30 分 |
| 设计与应用题 | 3 题,共 30 分 |
刷题用的是 三级数据库技术在线,应该其他的题库也行,主要是这个挺好看的,可以在手机上用,哎,下面也会用到这个网站的真题,希望不要侵权吧,侵权的话提醒我,我自己删掉。
这门的特点是考的面很宽:建模、SQL、SQL Server 管理、事务、分布式都有,但每一块都考得不深。用的数据库是 SQL Server 2008,题目里的代码都是 T-SQL 写法。
关系表、主键与外键
如果只是听说过"数据库",先把下面几个词弄明白,后面的题基本都是在这几个概念上展开的。
表的定义
下面这两张表是题库里反复出现的,后面的真题都会用到:
CREATE TABLE 商品表( 商品号 char(10) PRIMARY KEY, -- 主键 商品名 char(20) NOT NULL, 单价 int DEFAULT 0 ) CREATE TABLE 销售表( 商品号 char(10), 销售时间 datetime, 销售数量 int NOT NULL, PRIMARY KEY(商品号, 销售时间), -- 两列一起做主键 FOREIGN KEY(商品号) REFERENCES 商品表(商品号) -- 外键 )- 主键:能唯一确定一行的列。商品表里商品号不会重复,所以它是主键。销售表里同一个商品会卖很多次,光靠商品号分不清,所以用"商品号 + 销售时间"两列一起做主键。
- 外键:引用别的表主键的列。销售表的商品号必须是商品表里存在的商品号,这就是外键约束。
NOT NULL表示这列不能空着,DEFAULT 0表示不填就默认为 0。
SELECT 语句的执行顺序
写 SQL 是按 SELECT、FROM、WHERE……的顺序写,但数据库执行的顺序不一样:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
记住这个顺序,很多题就能想通。比如 WHERE 里不能用 SUM 这种聚合函数(那时候还没分组),要筛选分组后的结果得用 HAVING。
几个常用写法顺便记一下,填空题直接考过:
| 需求 | 写法 |
|---|---|
| 去掉重复行 | SELECT DISTINCT ... |
| 把查询结果复制成一张新表(新表原来不存在) | SELECT * INTO T2 FROM T1 |
| 两个查询结果求差(在前一个里、不在后一个里) | EXCEPT |
| 两个查询结果求交 / 求并 | INTERSECT/UNION |
注意 T-SQL 里求差用 EXCEPT,不是 Oracle 的 MINUS,填空题会专门考这个。
真题练习
前面的知识点讲完了,下面是这一部分对应的真题,每道都可以点进去直接做。
SELECT 语句的执行顺序
- 填空题第 9 题:在一个SELECT语句中,GROUP BY子句的逻辑执行顺序在ORDER BY子句之 。——答案:前
- 填空题第 20 题:在T-SQL的SELECT语句中,使用 选项可以消除查询结果返回的重复行数据。——答案:DISTINCT
- 填空题第 16 题:在T-SQL语言中,如果要将T1表中的全部数据复制到T2表中,T2表目前还不存在,可使用语句: SE……——答案:INTO
- 填空题第 13 题:在T-SQL语言中, 运算符用于实现两个查询结果的差运算。——答案:EXCEPT
数据库设计
这部分对应一个数据库应用系统从需求到建表的过程,选择题和填空题都爱考。
需求分析建模
需求分析阶段用的几种图,记住它们由什么组成、表达什么:
- DFD(数据流图):描述数据怎么流动、怎么被处理。
- IDEF0:描述系统的功能。只有两种元素:矩形框表示活动,箭头表示活动之间的联系。箭头按方向分四种:左边进来的是输入,上面进来的是控制,下面进来的是机制(谁来做、用什么做),右边出去的是输出。
- 用例模型(UML):描述参与者和系统的交互,表达的是系统的功能需求。
- UML 状态机图:状态之间的转移是由事件驱动的。
IDEF0 的四个方向很容易记混。我的记法:上面压下来的是规定(控制),下面托着的是干活的人和工具(机制),左进右出。
数据库应用系统的层次划分
从功能上看,系统分四层,题目会问某项工作在哪一层:
| 层次 | 负责什么 |
|---|---|
| 表示层 | 用户界面 |
| 业务逻辑层 | 业务规则、构件设计 |
| 数据访问层 | 访问数据的接口 |
| 数据持久层 | 数据的存储,完整性约束在这一层维护 |
E-R 图向关系模式的转换
设计与应用题经常给一段业务描述或一张 E-R 图,让你写出关系模式、标出主键和外键。核心就是看联系是一对多还是多对多:
- 一对多:不用新建表,把"一"那头的主键加到"多"那头,作为外键。
- 多对多:必须单独建一张表,主键是两头主键的组合,联系自己的属性(比如成绩、数量)也放在这张表里。
- 一对一:合并到任意一头都行。
最容易丢分的是多对多里"同一对能发生多次"的情况:同一个读者可以多次借同一本书,主键只用(读者号, 书号)就会重复,必须把借阅日期也加进去。
关系规范化与范式
范式是用来判断一张表有没有不合理冗余的。三级主要考到第三范式,用例子理解最快。
第一范式(1NF):每个格子里只能放一个不可再分的值。现在的数据库表基本都满足。
第二范式(2NF):不能有"只依赖主键一部分"的列。
选课(学号, 课程号, 姓名, 成绩),主键是(学号, 课程号)。
姓名只由学号决定,和课程号无关,这叫部分依赖,所以这张表只到 1NF。
拆成:学生(学号, 姓名) 和 选课(学号, 课程号, 成绩)。
第三范式(3NF):不能有"传递依赖",也就是 A 决定 B、B 又决定 C。
学生(学号, 姓名, 系号, 系主任),学号决定系号,系号又决定系主任,系主任是通过系号间接依赖学号的。
拆成:学生(学号, 姓名, 系号) 和 系(系号, 系主任)。
判断题一般就这么问:这张表属于第几范式?为什么?怎么拆?按上面两个例子的思路答就行。
真题练习
前面的知识点讲完了,下面是这一部分对应的真题,每道都可以点进去直接做。
需求分析建模
- 填空题第 17 题:IDEF0需求建模方法由箭头和 两种元素构成。——答案:活动
- 填空题第 4 题:用例模型通过对系统参与者及其重要行为的描述,表达系统的 需求。——答案:功能
- 填空题第 19 题:在UML的状态机图中,状态之间的转移是由 驱动的。——答案:事件
数据库应用系统的层次划分
- 第 17 题:从功能角度数据库应用系统可以划分为四个层次来实现,其中构件设计出现在——答案 B(业务逻辑层)
- 第 20 题:从功能角度数据库应用系统可以划分为四个层次来实现,其中数据的完整性维护工作出现在——答案 A(数据持久层)
SQL Server 数据库管理
系统数据库
| 数据库 | 作用 |
|---|---|
| master | 记录整个实例的系统信息,坏了实例就起不来 |
| model | 新建数据库的模板,新库会包含它里面的内容,大小不能比它小 |
| msdb | 保存作业、警报、备份记录这些 |
| tempdb | 放临时数据,每次重启都会重建 |
题目来源:选择题第 3 题,D 说"model 的空间必须大于 master",没有这个规定,选 D。
索引
索引就像书的目录,能让查询快一些,但不是越多越好,每次增删改都要维护它。几个常考的点:
- 有索引不代表一定会用,用不用由优化器根据代价决定。
- 散列索引只适合等值查找,范围查询用不上。
- 主键一定会建唯一索引,但不一定是聚集索引(SQL Server 允许主键用非聚集索引)。
- 一张表只能有一个聚集索引,因为数据本身只能按一种顺序存放。
题目来源:选择题第 7 题,答案 C:主键索引一定唯一,不一定聚集。
建索引的语句:
-- 不写 CLUSTERED 就是非聚集索引;升序 ASC 可以省略,降序必须写 DESC CREATE INDEX idx_职工表 ON 职工表(职工号, 所在部门 DESC)数据库性能优化
为了查得快,有时会故意让表"不那么规范":
- 增加派生性冗余列:比如在订单表里直接存一个"订单总金额",查询时就不用再连接明细表去算。代价是表不再满足第三范式。
- 水平分割:按行拆,比如按年份拆成几张表,各表结构相同,存的数据不同。
- 垂直分割:按列拆,常用的列放一张表,不常用的放另一张,各表结构不同。
- 聚集存储:把经常一起用的几张表的数据行,按公共列的值存放在一起,连接时少读磁盘。
RAID 只需要记一组对比:RAID1 是镜像,写入快;RAID5 每次写都要算校验,写入慢。所以写操作多的系统应该用 RAID1,"为了提高写性能把 RAID1 改成 RAID5"是错的。
题目来源:选择题第 15 题,答案 A。
数据库运行维护
- 监控看的是运行状态:锁、临时段、内存、用户连接数。数据完整性检查不算监控。
- 日常维护是系统上线后反复做的事:装补丁、建用户、调整索引。整理初始数据并加载进数据库是建库阶段的事,不算日常维护。
真题练习
前面的知识点讲完了,下面是这一部分对应的真题,每道都可以点进去直接做。
索引
- 第 13 题:设有职工表(职工号,姓名,所在部门,工资),现要建立基于职工号和所在部门的非聚集索引,索引键……——答案 A(CREATE INDEX idx_职……)
数据库性能优化
- 第 14 题:数据库优化工作中,下列有关增加派生性冗余列方法的说法,正确的是——答案 D(该方法一般可以减少查询时的连接操作)
- 填空题第 18 题:在使用分割表技术进行数据库优化时,进行 分割之后得到的所有表结构都相同,而存储的数据不同。——答案:水平
- 填空题第 3 题:将经常一起使用的多个表中的数据行按照其公共列值存储在一起,这种表存储方法为 。——答案:聚集
数据库运行维护
- 第 4 题:数据库的监控分析是指数据库管理员借助工具检测数据库系统运行情况并进行分析的工作,设有如下内容……——答案 B(仅Ⅰ、Ⅱ、Ⅲ和Ⅴ)
- 第 18 题:数据库系统运行维护工作的主要目的是保证数据库系统正常和高效的运行。下列工作中不属于数据库运行……——答案 D(整理初始数据并加载到数据库中)
T-SQL 编程
设计与应用题里一定有一道写代码的填空,考的就是下面这几种。好消息是它们的格式非常固定,一个模板记住了,换张表照样填。
用户自定义函数
题目来源:三级数据库技术在线 填空题第 1 题
要求:根据商品号返回该商品的销售总金额。补全以后是这样的:
CREATE FUNCTION dbo.f_TotalQty(@GoodID char(10)) -- (1) char,和商品号类型一致 RETURNS int -- (2) 声明返回类型用 RETURNS AS BEGIN -- (3) RETURN(SELECT SUM(单价 * 销售数量) -- (4) 总金额要求和 FROM 商品表 JOIN 销售表 -- (5) 销售数量在销售表里 ON 商品表.商品号 = 销售表.商品号 -- (6) WHERE 商品表.商品号 = @GoodID) -- (7) 用传进来的参数 END -- (8)要注意的是:声明返回类型用RETURNS(带 S),函数体里返回值用RETURN(不带 S),两个别搞混。另外商品号在两张表里都有,题目又不让起别名,所以要写成"表名.列名"。
存储过程
存储过程就是存在数据库里、可以带参数调用的一段 SQL。最简单的形式:
CREATE PROC P_COUNT @x varchar(20) -- 参数以 @ 开头 AS SELECT count(*) FROM 商品表 WHERE 类别 = @x难一点的是下面这道,要用到左外连接:
题目来源:三级数据库技术在线 填空题第 8 题
要求:查询指定类别每个商品的销售总利润,包括没卖过的商品(利润算 0)。
"包括没卖过的"这几个字,决定了必须用 LEFT JOIN。先看 LEFT JOIN 是什么效果:
看懂这张图,这道题的六个空就都顺了:
CREATE PROC p_Profit -- (1) PROC 或 PROCEDURE @lb char(10) AS SELECT 商品表.商品号, CASE WHEN MIN(销售表.商品号) IS NULL THEN 0 -- (2) 没卖过,右边是 NULL ELSE SUM((销售单价 - 进货单价) * 销售数量) -- (3) 卖过的把每笔利润加起来 END AS 销售总利润 FROM 商品表 LEFT JOIN 销售表 -- (4) LEFT,保留没卖过的商品 ON 商品表.商品号 = 销售表.商品号 WHERE 类别 = @lb -- (5) 用参数 GROUP BY 商品表.商品号 -- (6) 按商品分组,用商品表的商品号触发器
触发器是"某张表发生增删改时自动执行"的代码。考试里最常见的是插入一条销售记录后,自动更新商品表的销售总量。
题目来源:三级数据库技术在线 填空题第 14 题
CREATE TRIGGER tri_insert ON 销售表 -- (1) 是销售表的插入触发了它 FOR INSERT -- (2) 插入之后触发 AS UPDATE 商品表 -- (3) 要改的是商品表 SET 销售总量 = 销售总量 + -- (4) SET (5) 原来的销售总量 (SELECT 销售数量 FROM Inserted) -- (6) 刚插入的那条记录在 Inserted 里 WHERE 商品号 IN (SELECT 商品号 FROM Inserted)两张临时表要记住:Inserted 里是刚插入(或更新后)的新数据,Deleted 里是刚删除(或更新前)的旧数据。
还有两个关键字:FOR和AFTER都表示"操作完成之后"触发,是一个意思;INSTEAD OF是"代替原操作执行",是另一种触发器。
游标
游标用来一行一行地处理查询结果,用法固定是五步:
DECLARE c1 CURSOR FOR SELECT ... -- 1. 声明 OPEN c1 -- 2. 打开 FETCH NEXT FROM c1 INTO ... -- 3. 取一行(一般放在 WHILE 循环里) CLOSE c1 -- 4. 关闭 DEALLOCATE c1 -- 5. 释放FETCH NEXT取的是当前位置之后的那一行,然后把位置往下移一行。游标刚打开时,位置在第一行之前,所以第一次 FETCH NEXT 拿到的是第一行。
视图
视图是一张"虚表",本身不存数据,查视图最终都会变成查基本表。视图可以建在表上,也可以建在别的视图上。它对应数据库的外模式,能提供一定的逻辑独立性。
真题练习
前面的知识点讲完了,下面是这一部分对应的真题,每道都可以点进去直接做。
存储过程
- 填空题第 15 题:设在SQL Server 2008中有商品表(商品号,商品名,类别),现要建立查询指定类别的商品数量……——答案:@x
触发器
- 填空题第 10 题:在SQL Server 2008中,设要在销售表上定义一个更新操作的后触发器。请补全下列语句: CR……——答案:FOR
游标
- 填空题第 12 题:设在SQL Server 2008中有如下定义游标的T-SQL语句: DECLARE c1 CURS……——答案:NEXT
- 第 11 题:在SQL Server 2008中,设有游标c1,下列关于语句“FETCH NEXT FRO……——答案 B(返回紧跟在游标当前行指针之后的数据行……)
视图
- 第 12 题:下列关于视图的说法,错误的是——答案 D(视图只能定义在表上,不能在视图上再定……)
事务管理与故障恢复
事务与并发控制
事务是"要么全做、要么全不做"的一组操作,有四个特性 ACID:原子性、一致性、隔离性、持久性。
两种锁:
- 共享锁(S 锁):读数据时加,多个事务可以同时加。
- 排他锁(X 锁):写数据时加,和其他任何锁都不能共存。
三级封锁协议考它们各自解决了什么问题:
| 协议 | 规则 | 能解决 |
|---|---|---|
| 一级 | 写之前加 X 锁,事务结束才放 | 丢失修改 |
| 二级 | 一级 + 读之前加 S 锁,读完就放 | 再加上脏读 |
| 三级 | 一级 + 读之前加 S 锁,事务结束才放 | 再加上不可重复读 |
两阶段锁协议:每个事务先只加锁、再只解锁,分成两个阶段。遵守它能保证调度是可串行化的,但不能避免死锁。
恢复模式与备份还原
SQL Server 有三种恢复模式:完整、大容量日志、简单。事务日志备份只能在完整和大容量日志两种模式下做,简单模式会自动截断日志。
还原的顺序是固定的:先还原最近一次完整备份,再还原最近一次差异备份,再按时间顺序还原之后的日志备份。除了最后一步,前面每一步都要加 WITH NORECOVERY(表示还没还原完,后面还要接着还原),最后一步用 WITH RECOVERY。
RESTORE DATABASE MyDB FROM DISK = 'full.bak' WITH NORECOVERY -- 完整备份 RESTORE DATABASE MyDB FROM DISK = 'diff.bak' WITH NORECOVERY -- 最近一次差异备份 RESTORE LOG MyDB FROM DISK = 'log1.trn' WITH NORECOVERY -- 之后的日志备份 RESTORE LOG MyDB FROM DISK = 'tail.trn' WITH RECOVERY -- 最后一份基于检查点的故障恢复
设计与应用题有时会给一段事务日志,问系统故障后哪些事务要重做(REDO)、哪些要撤销(UNDO)。方法是把每个事务的 COMMIT 和检查点、故障点放在一条时间线上看:
- COMMIT 在检查点之前:检查点时已经写到磁盘了,不用管。
- COMMIT 在检查点之后、故障之前:放进 REDO,把它的修改重做一遍。
- 到故障都没有 COMMIT:放进 UNDO,把它的修改撤回去。
这类题第一组真题里没有,下面这段日志是我按真题格式自己编的:
T1 开始 → T1 把 A 从 10 改成 20 → T1 提交 → T2 开始 → T2 把 B 从 30 改成 40 → 检查点 → T2 把 C 从 50 改成 60 → T2 提交 → T3 开始 → T3 把 D 从 70 改成 80 → 故障
- T1 在检查点之前提交,不用管,A = 20。
- T2 在检查点之后提交,REDO:B = 40,C = 60。
- T3 没提交,UNDO:D 改回 70。
最后 A = 20,B = 40,C = 60,D = 70。
真题练习
前面的知识点讲完了,下面是这一部分对应的真题,每道都可以点进去直接做。
恢复模式与备份还原
- 填空题第 11 题:在SQL Server 2008中,事务日志备份仅可用在完整恢复模式和 日志恢复模式中。——答案:大容量
分布式数据库、并行数据库与数据仓库
选择题最后几道一般是这部分,概念多但不难,主要是别把几组概念记混。
分布式数据库
分布透明性是指用户感觉不到数据是分布存放的,用起来像一个集中式数据库。它由三个独立性保证:位置独立性、数据分片独立性、数据复制独立性。
透明性分三级,从高到低是:分片透明性 > 位置透明性 > 局部数据模型透明性。分片透明性是最高的。
题目来源:选择题第 1 题、第 9 题(C 说分片透明性是最低级别,错)。
分布式事务的恢复用的是两阶段提交协议(2PC):第一阶段协调者问所有参与节点"能不能提交",第二阶段根据大家的回答统一决定提交还是回滚。
并行数据库
三种结构按共享什么来分:共享内存、共享磁盘、无共享。每个处理机有自己的内存和磁盘、什么都不共享的叫无共享结构,扩展性最好。
数据怎么分到各个节点上,有三种划分方法:
| 方法 | 适合 |
|---|---|
| 轮转法 | 扫描整个表,负载最均衡 |
| 散列划分 | 等值的点查询 |
| 范围划分 | 范围查询,按划分属性排序时可以直接拼接结果 |
SUM、MIN、MAX 这些聚集函数是可以并行算的:每个节点先算自己那部分,最后再合并。
OLTP 与 OLAP
| OLTP | OLAP | |
|---|---|---|
| 做什么 | 日常业务处理,产生数据 | 分析数据,辅助决策 |
| 事务特点 | 量大、简单、重复率高 | 量少、复杂查询 |
| 面向谁 | 外部用户和基础业务人员 | 企业内部各层决策人员 |
还有一个容易选错的:决策支持系统是辅助人做决策的,最终决策还是人来做,不是系统自己去"实施决策"。
真题练习
前面的知识点讲完了,下面是这一部分对应的真题,每道都可以点进去直接做。
分布式数据库
- 填空题第 2 题:分布式数据库系统的恢复控制采用的最典型策略是基于 阶段的提交协议。——答案:两
并行数据库
- 填空题第 7 题:每个处理机拥有独立的主存储器和磁盘,不共享任何资源的并行数据库系统结构称为 结构。——答案:无共享
- 第 6 题:关于并行数据库,下列说法正确的是——答案 C(层次结构可以分为两层,顶层是无共享结……)
- 第 8 题:下列关于数据划分与并行算法的说法,错误的是——答案 D(SUM、MIN、MAX等聚集函数一般……)
OLTP 与 OLAP
- 第 10 题:下列关于OLAP和OLTP的说法,错误的是——答案 B(OLAP系统一般需要处理大量事务,且……)
- 第 16 题:下列关于数据仓库、数据挖掘、机器学习与决策支持系统中的相关概念或说法,错误的是——答案 D(决策支持系统一般是指企业中以数据为基……)
没有写进来的内容
当时的笔记里有几块没整理:SQL Server 的权限管理(GRANT、DENY、REVOKE 和几种固定角色)、分区表的完整语法、数据仓库里 ETL 和 ODS 的细节。考前需要的话,可以对着教材把这几块再过一遍。
如果只有一两周时间,我建议先把 T-SQL 那一节的四个模板(函数、存储过程、触发器、游标)各写一遍,设计与应用题的代码填空基本就是在这四个模板上改;选择题和填空题则是概念题居多,做题的时候错一个记一个,比通读教材快。我是在 三级数据库技术在线 上按题型一道道做的。