期末季最让人头疼的,就是 Oracle 这种课,内容又多又杂,光体系结构就能讲一节课,SQL 和 PL/SQL 还各有各的坑。这门课我啃了两周,把课件、实验手册和历年题过了一遍,整理出一份可以直接照着用的复习大纲。它覆盖了从基础 SQL 到数据库体系结构、事务并发、备份恢复这些期末高频考点,也包含了一些容易踩的细节坑,适合正在准备 Oracle 期末考试的本科或专科同学,也适合想快速系统梳理一遍 Oracle 核心知识、考前突击的人。这份大纲不追求面面俱到,重点放在“期末到底怎么考、你该重点背什么练什么”。
1. 期末复习的核心思路与考点地图
1.1 先搞懂这门课到底考什么
Oracle 期末卷子一般就四大块:基础 SQL 和 PL/SQL、数据库体系结构、事务与并发控制、备份恢复与安全管理。听起来多,实际上每一块都有非常固定的得分点。你得先明确考试范围,再决定往哪儿使劲,别把时间浪费在冷门功能上。以我接触过的几套期末题来看,SQL 部分必考多表查询和聚合分组,PL/SQL 必考游标和异常处理,体系结构必考 SGA 组成和后台进程,事务部分逃不开隔离级别和锁机制,备份恢复则总要区分冷备热备、知道 redo 和 undo 的区别。
1.2 梳理一份自己的考点清单
先别急着刷题,建议你拿一张 A4 纸,把大标题列出来:SQL、PL/SQL、体系结构、事务与锁、备份恢复、权限与安全。每列下面写出自己能想到的关键词,写不出来就翻目录补。完成之后,你会明显发现自己哪里熟、哪里是空白。这个过程本身就是一轮高效的回忆复习。等到把所有章节的关键词都填满,再对照历年题去补充遗漏的知识点,比一上来就从头看课件效率高得多。
- SQL:多表连接、子查询、聚合与分组、分页查询、集合运算、空值处理
- PL/SQL:块结构、变量类型、游标、异常、存储过程与函数、触发器
- 体系结构:实例与数据库、SGA/PGA、后台进程、表空间与数据文件、redo 与 undo
- 事务与并发:ACID、隔离级别、锁类型、阻塞与死锁、一致性读
- 备份恢复:冷备、热备、逻辑备份、闪回、不完全恢复
- 安全管理:系统权限、对象权限、角色、用户管理
1.3 复习时间的分配建议
如果你还有两周,我的建议是前一周按主题过知识点,每天一个大方向,每个方向大概两到三小时;第二周专门刷题和上机练习,特别是 SQL 和 PL/SQL,光看代码是没用的,必须自己在命令行或 SQL Developer 里跑一遍。如果时间只剩三天,那就优先保住 SQL、PL/SQL 和事务并发三块,这三块翻来覆去考的都是套路,性价比最高。体系结构和备份恢复里那些名词解释、原理背诵放到碎片时间反复记忆,不要一开始就死磕。
2. SQL 与 PL/SQL:必考的基础,别在细节上丢分
2.1 基础查询最容易忽略的三个点
SELECT 看起来最简单,实际考试里到处埋雷。第一个是空值问题,Oracle 里 NULL 参与任何比较都返回未知,你用= NULL查不出任何记录,必须用IS NULL。第二个是字符串与日期,日期类型要加单引号并且格式要匹配,默认格式是DD-MON-YY,很多人在这上面写错。第三个是别名和排序,中文别名要用双引号括起来,ORDER BY 后面可以用别名,但在 WHERE 里不能直接用别名。
2.2 聚合函数与分组逻辑
聚合查询必考,而且常考 HAVING 和 WHERE 的先后逻辑。WHERE 是在分组之前过滤原始行,HAVING 是在分组之后过滤组。很多同学搞反了,以为 HAVING 可以替代 WHERE,实际上你问“工资大于 3000 的员工有哪些”这种问题就应该用 WHERE,问“平均工资大于 3000 的部门有哪些”才用 HAVING。
-- 正确示例:查询平均工资大于 3000 的部门 SELECT deptno, AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 3000;另一个易错点是 COUNT、SUM、AVG 对空值的态度。COUNT(*) 统计所有行,COUNT(列名) 统计非空值个数;SUM 和 AVG 会自动忽略 NULL,但如果你想让 NULL 参与计算,就得用 NVL 提前处理。考试里经常会给你一张含 NULL 的表,让你求平均值,结果比想象中小,就是因为 NULL 没有计入分母。
- COUNT(*) 是硬统计行数,不关心列内容
- COUNT(字段) 忽略 NULL
- AVG、SUM 忽略 NULL,需要时先用 NVL 填充
- 分组查询中 SELECT 列表里只能出现分组列和聚合函数
2.3 多表连接与子查询的解题顺序
多表连接是期末大题常客。你需要分清内连接、左外连接、右外连接和自连接。Oracle 老写法里用(+)表示外连接,新标准用 JOIN 关键字,建议考试时优先写 ANSI 标准写法,语义清楚不容易错。子查询套路更固定:非关联子查询先执行内部查询,把结果给外层用;关联子查询则要逐行匹配外部行,效率低但能解决“每一行都要比较”的问题。
-- 左外连接:查出所有部门及其员工人数,包括没有员工的部门 SELECT d.dname, COUNT(e.empno) FROM dept d LEFT JOIN emp e ON d.deptno = e.deptno GROUP BY d.dname;遇到比较复杂的查询,先画表关系再写代码,别急着动手。比如题目让你查“工资高于所在部门平均工资的员工”,这就是典型关联子查询:
SELECT e.empno, e.ename, e.sal FROM emp e WHERE e.sal > (SELECT AVG(sal) FROM emp WHERE deptno = e.deptno);很多同学在这个地方漏掉别名关联,写出来子查询的 WHERE 条件没有和外层对应,结果查出来全是空。你只要记住两句口诀:关联子查询先看外层行,再看内层条件;非关联子查询先执行内层,再把结果作为条件。考试时分辨清楚,正确率能提高一大截。
2.4 分页查询与集合运算
Oracle 分页查询非常有特点,因为 ROWNUM 是在结果返回前分配的伪列,你直接在WHERE ROWNUM > 5是永远查不到数据的。正确做法是嵌套子查询,先取出带 ROWNUM 的结果,再在外层过滤。新版本可以用OFFSET n ROWS FETCH NEXT m ROWS ONLY,简洁不少。集合运算 UNION 去重、UNION ALL 不去重、INTERSECT 交集、MINUS 差集,期末选择题很喜欢考它们之间的区别。
-- 分页查询:查询第 6 到第 10 条记录 SELECT * FROM ( SELECT rownum rn, emp.* FROM emp ) WHERE rn BETWEEN 6 AND 10;2.5 PL/SQL 块结构与游标
PL/SQL 的基础结构是声明部分、执行部分、异常处理部分,期末经常让你补全结构或者指出错误。变量声明时要注意:=是赋值,=是比较,这一点每年都有人栽。游标是 PL/SQL 最核心的考点,显式游标四步走:CURSOR 声明、OPEN、FETCH、CLOSE,缺一步都要扣分。游标属性%FOUND、%NOTFOUND、%ROWCOUNT也要会判断。
DECLARE CURSOR c_emp IS SELECT ename FROM emp; v_name emp.ename%TYPE; BEGIN OPEN c_emp; LOOP FETCH c_emp INTO v_name; EXIT WHEN c_emp%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_name); END LOOP; CLOSE c_emp; END;游标的细节坑在于:FETCH 之前%NOTFOUND是 NULL,而不是 TRUE;循环退出条件一般放在 FETCH 之后,否则会漏掉最后一条记录。考试里如果要求修改游标数据,记得在 SELECT 语句最后加FOR UPDATE,然后在循环里用WHERE CURRENT OF定位当前行,这两个关键词是一对。
2.6 存储过程、函数与触发器
存储过程和函数的区别是面试和期末都爱问的点:函数必须有返回值,可以在 SQL 语句中直接调用;过程没有返回值,通过 OUT 参数传出结果。触发器按触发时机分为 BEFORE 和 AFTER,按事件分为行级和语句级,考试中常考的是“禁止删除某表数据”或“自动记录操作日志”这类场景。写触发器时一定要搞清楚:OLD和:NEW的用法,插入操作只有:NEW,删除操作只有:OLD,更新操作两者都有。记住了这一点,触发器题基本不会做错。
3. Oracle 体系结构:理解实例与数据库的分工
3.1 实例和数据库的关系
一句话总结:实例是内存加进程,数据库是磁盘上的物理文件。平时你启动 Oracle,实际上是先启动实例,再由实例去装载和打开数据库。期末题里常给一个情景,问“关闭数据库但保留实例”是什么状态,这就要理解 MOUNT 和 OPEN 的区别。复习时不要硬背概念,最好把启动过程拆成三步:NOMOUNT 读参数文件启动实例,MOUNT 装载控制文件,OPEN 打开数据文件和重做日志。
3.2 SGA 各组件的职责
SGA 是共享内存区,主要包括共享池、数据库缓冲区缓存、重做日志缓冲区。共享池里最常考的是库缓存和数据字典缓存,库缓存存放 SQL 语句和执行计划,所以相同的 SQL 语句能复用执行计划,减少解析开销。数据库缓冲区缓存按 LRU 算法管理,存放从数据文件读出的数据块,脏块由数据库写进程 DBWn 写回磁盘。重做日志缓冲区则临时存放重做记录,由日志写进程 LGWR 快速写入联机重做日志文件。
SGA 核心组件: - 共享池(Shared Pool):SQL 解析、执行计划、数据字典 - 数据库缓冲区缓存(Buffer Cache):数据块的读写缓存 - 重做日志缓冲区(Log Buffer):记录所有修改操作 - 大池(Large Pool):并行操作、RMAN 备份等专用内存 - PGA 不属于 SGA,是每个会话私有的内存区考试常见的误区是搞混“哪些操作会产生 redo”。记住一点:所有数据修改操作都会先生成重做记录,而不是直接写数据文件。这就是数据库能在崩溃后重放修改的关键。SELECT 一般不会产生 redo,除非你开启了某些审计或日志功能。
3.3 后台进程怎么记
后台进程是期末名词解释和选择题的密集考点。DBWn 负责把脏缓冲区写回数据文件,LGWR 负责把重做日志缓冲区写入联机重做日志,SMON 负责实例恢复和清理临时段,PMON 负责监控其他进程并在进程异常退出时清理资源,CKPT 负责更新控制文件和数据文件头部的检查点信息。这些进程的英文全称和职责要一一对应,千万不要答串。
背进程的小技巧是用场景记忆:你往表里插入一条数据,修改先发生在缓冲区,同时日志缓冲区记了重做记录,LGWR 赶紧把日志写出去;等到脏块积累到一定程度,DBWn 才真正写数据文件;检查点发生时,CKPT 负责做标记。整个流程顺下来,四个关键进程就全记住了。再就是每个进程的缩写大小写,DBWn 的叫法有很多,因为实际可以有多个写进程,考试写 DBW0 也没问题,但别写成 DBWR 之外的奇怪名称。
3.4 存储结构:表空间、数据文件、段、区、块
逻辑存储结构从上到下是表空间、段、区、数据块,物理存储结构对应的是数据文件。段是表或索引这样的逻辑对象占用的空间,区是分配空间的最小单位,数据块是 I/O 的最小单位。期末高频题包括:表空间与数据文件的关系、为什么一个段可以跨多个区、块大小的作用。记忆时可以类比仓库:表空间是整栋仓库,数据文件是一个个库房,段是某个货架区域,区块就是具体的储物格。
实际工作中还要注意,表空间满了会导致 DML 操作失败,所以 DBA 查空间都喜欢看dba_data_files和dba_segments。考试中也可能给你一张空间使用情况表,让你判断哪个表空间需要扩容。这个不难,只要算出已用空间和剩余空间的比例,再做简单的判断就行。
3.5 redo 与 undo:一对容易混淆的兄弟
redo 和 undo 是 Oracle 里最容易搞混的两个概念,但其实分工极其明确。redo 记录“做了什么操作”,用于崩溃后前滚,保证事务持久性;undo 保存“修改前的映像”,用于回滚和一致性读,保证原子性和隔离性。可以这么记:redo 是后悔药的制作流程,undo 是后悔药本身;redo 管重做,undo 管撤销。
考试特别爱考“某事务未提交就断电,重启后会怎样”。答案是:实例恢复时,SMON 会利用 redo 把已提交未写入数据文件的更改重新应用,用 undo 把未提交事务的修改回滚掉。也就是说,提交了的用 redo 捞回来,没提交的用 undo 抹掉。理解了这句话,恢复相关的简答题基本就稳了。
4. 事务、锁与并发控制:考试最难啃的骨头
4.1 事务 ACID 的四个特性
ACID 是事务的基础,Atomicity 原子性、Consistency 一致性、Isolation 隔离性、Durability 持久性。期末喜欢让你解释每个特性对应 Oracle 的哪个机制。原子性对应 undo 回滚,持久性对应 redo 重做,一致性对应完整性约束和 undo,隔离性对应锁和事务隔离级别。每个对应关系都要能链起来,面试问“Oracle 怎么实现持久性”也能用上。
4.2 Oracle 的隔离级别
Oracle 默认隔离级别是 READ COMMITTED,但要注意它并不支持脏读,因为 SQL 语句执行时用 undo 构建一致性读版本。这是 Oracle 和其他数据库不太一样的地方。SERIALIZABLE 级别下,查询看到的是事务开始时的快照,如果此时其他事务修改了数据,你的事务在尝试修改时可能会收到“快照太旧”或无法序列化的错误。READ ONLY 隔离级别也是事务隔离级别的一种考法,它保证整个事务期间看到一致的快照,但只读,不能执行 DML。
4.3 锁的类型和作用
Oracle 锁分为 DML 锁、DDL 锁、内部锁和闩锁。DML 锁里面最常见的是行级锁 TX 和表级锁 TM。执行 UPDATE、DELETE 时,Oracle 自动对受影响行加行锁,同时对表加表锁。表锁并不是真的禁止别人读表,而是防止其他事务修改表结构或与不兼容的锁冲突。很多同学误以为“加锁了别人就读不了”,实际上 Oracle 的多版本读一致性允许查询读到修改前的快照,所以读通常不会被写阻塞。
锁相关的选择题常给一个场景:两个会话分别更新不同的行,是否阻塞?答案是不阻塞,因为行锁粒度是行,互不冲突。但如果两个事务交叉更新对方已经锁定的行,就会造成死锁。Oracle 检测到死锁后会自动回滚其中一个事务的语句,并返回 ORA-00060 错误。期末题问“死锁如何解决”,你答“由数据库自动检测并回滚一方”就能得分。
4.4 阻塞与死锁的排查思路
考试之外,实际排查阻塞也是 Oracle 的常用技能。最常查的视图是v$session、v$lock、v$sql,根据 BLOCKING_SESSION 字段找到谁在等谁。期末如果出上机题,让你找出阻塞会话,一般思路是先查 v$session 中 STATUS 为 ACTIVE 且等待事件的会话,再结合 v$lock 判断锁类型。回答这类题的时候,把排查顺序写清楚比直接给出结果更重要,因为阅卷看的是思路。
5. 备份恢复与安全管理
5.1 三种备份方式的对比
备份恢复是 Oracle 期末的固定板块。冷备是关闭数据库后复制数据文件、控制文件和重做日志,简单可靠但需要停机。热备是数据库运行状态下备份,必须配合归档日志,主要用在无法停机的生产环境。逻辑备份用 EXPDP/IMPDP 导出导入数据,灵活但速度相对较慢,适合迁移特定表或方案。考试常考的就是让你根据场景选备份方式,比如“某系统要求 7x24 运行,选什么”,答案就是热备加归档。
5.2 RMAN 与闪回技术的区别
RMAN 是 Oracle 的备份恢复工具,能做增量备份、备份集、恢复到指定时间点。考试重点一般不是复杂命令,而是让你说出 RMAN 恢复的基本步骤:先恢复数据文件,再用归档日志前滚,最后用 undo 回滚未提交事务。闪回是更快速的时间点恢复手段,最常用的是闪回查询、闪回表、闪回数据库。闪回查询依赖 undo 保留期,如果 undo 被覆盖,闪回查询就会报“快照太旧”。记住这个因果链,能帮你答对很多概念题。
5.3 用户、权限与角色
安全管理部分是拿分项,内容不难但条理多。系统权限是用户执行某种操作的权力,比如 CREATE TABLE、CREATE SESSION;对象权限是对某个对象操作的权力,比如 SELECT ON scott.emp。对象的权限可以再授予他人,所以会有 WITH GRANT OPTION 的知识点。角色是一组权限的集合,你把一个角色授予用户,就相当于一次给了很多权限。创建用户、授予权限、撤销权限这些命令要能写出来。
-- 创建用户并授予基本权限 CREATE USER u_stu IDENTIFIED BY password; GRANT CONNECT, RESOURCE TO u_stu; GRANT SELECT ON scott.emp TO u_stu; REVOKE SELECT ON scott.emp FROM u_stu;常见的选择题陷阱是问“哪个权限可以让用户把自己的权限再给别人”,答案就是 WITH GRANT OPTION,而不是单纯的 GRANT。还有查数据字典的表:查用户权限看user_tab_privs、user_sys_privs,查角色看dba_role_privs。这些视图的名字容易记混,考前稍微花十分钟过一遍,选择题拿到分很容易。
5.4 控制文件与参数文件的作用
控制文件是数据库的大脑,记录了数据库物理结构信息,包括数据文件位置、重做日志组信息、检查点 SCN。参数文件则用来配置实例启动参数,常见的有内存大小、进程数等。期末概念题有时会问“控制文件损坏了怎么办”,答案是利用多路复用副本复制恢复。所以复习时注意:控制文件建议配置多个副本,放在不同磁盘,防止单点故障。
5.5 表空间与用户的关系
给一个用户创建表后,数据默认存在于该用户的默认表空间。期末会考一条 SQL:创建用户时指定默认表空间和临时表空间。临时表空间用来排序和哈希操作,空间不足会导致 SQL 报错。常见错误是“表空间不足”和“临时表空间不足”,前者是数据放不下,后者是排序区不够,解决方案分别考虑扩容数据表空间和临时表空间。
6. 考试题型实战与避坑指南
6.1 选择题高频陷阱清单
选择题其实是最容易靠细节拉开差距的。我整理几个高频陷阱,考前过一遍很有用:ROWNUM 不适用于大于比较;NULL 不能参与算术运算,结果还是 NULL;COUNT(*) 和 COUNT(列) 结果可能不同;UNION 会自动去重,UNION ALL 不去重;WHERE 不能使用聚合函数,HAVING 可以;外连接的 ON 条件里加过滤条件和 WHERE 里加过滤条件语义不同;DELETE 是 DML,TRUNCATE 是 DDL,TRUNCATE 不能回滚。这些陷阱分布在各个章节,考前当成清单快速过一遍,能有效避免低级失误。
6.2 简答题答题套路
简答题答题要分段、写关键词,别只写一句话。比如问到“Oracle 实例由什么组成”,你要写出 SGA 和一组后台进程,再把 SGA 的四大组件各自一句功能写出来,后台进程挑三四个说明职责。回答简答题的时候,答案要像列点一样清晰,每个要点占一行,阅卷更容易踩到得分点。如果题目里给了场景,先判断它考的是哪个知识点,再往知识点上靠。比如“某公司在做月度结账时发现长时间卡住”这种题干,往往就是事务锁相关。
6.3 上机题/设计题的常见模式和参考答案
上机题往往需要建表、插数据,再写查询或 PL/SQL 块。常见模式包括:统计每个部门工资前几名的人、根据输入参数查询员工信息、用过程统计全班成绩等级等。我的建议是平时把 SCOTT 示例库跑熟,尤其是 EMP、DEPT 这两张表,几乎每个上机题都能用到。考前不要只背理论,把几个典型题目亲手写一遍,比如游标循环、存储过程加 OUT 参数、触发器审计日志,只要跑通三个案例,上机题基本不会慌。
6.4 考前快速记忆清单
考前最后一天,不建议再刷题,而是看自己整理的错题本和关键词表。重点记忆:SGA 四大组件和职责、五个关键后台进程、redo 与 undo 作用、事务隔离级别、锁类型、备份方式选择、系统权限与对象权限区别、PL/SQL 游标步骤、HAVING 与 WHERE 区别。这一页清单你在考前半小时过一遍,进考场碰到选择题至少能多拿五分。
我个人这段复习下来最大的体会是,Oracle 期末考试其实非常“套路化”,知识点多但方向和重点很稳定。与其焦虑资料看不完,不如按这份大纲把每个章节的考点过一遍,再用两天刷题和上机。最后再分享一个小技巧:考前把你经常记混的一组概念抄在一张纸上,比如 redo/undo、DELETE/TRUNCATE、WHERE/HAVING、UNION/UNION ALL,用表格对比着写一遍,印象会深很多。把这些细节处理好,期末拿到一个理想的分数远比想象中简单。