数据库王珊经典题库合集,帮你轻松搞定学习难点和考核
- 问答
- 2026-01-15 12:01:48
- 4
数据库王珊经典题库合集,帮你轻松搞定学习难点和考核
直接开始,我们先从最基础也是最重要的“关系代数”说起,在王珊的《数据库系统概论》里,关系代数是SQL语言的理论基础,不懂关系代数,写复杂的SQL查询就会很吃力。
关系代数经典题:如何表达“查询选修了全部课程的学生姓名”? 是关系代数中的一个难点,叫做“除运算”(Division)的应用,很多同学一看到“全部”就发懵,我们不用记复杂的除运算公式,用一个逻辑转换来理解。
-
来源题目(思路重现): 设有学生表S(学号Sno,姓名Sname)、课程表C(课程号Cno,课程名Cname)和选课表SC(学号Sno,课程号Cno,成绩Grade),查询选修了所有课程的学生姓名。
-
解题思路拆解(王珊教材中的方法):
- 正向思考困难,就反向思考。 “选修了所有课程”等价于“不存在一门课程是这个学生没有选修的”。
- 分步写出关系代数表达式:
- 第一步:先得到所有可能的(学号,课程号)组合,这叫笛卡尔积,用学生表的学号投影和课程表的课程号投影做笛卡尔积:π_Sno(S) × π_Cno(C),这表示理论上每个学生都应选所有课。
- 第二步:从上面这个理论上的全选课集合中,“减去”实际选课表SC中已有的记录,使用的运算符是“差集”(-),没选的课是:[π_Sno(S) × π_Cno(C)] - SC,这个结果集包含了所有“缺课”的记录,即(某个学号,某个他没选的课程号)。
- 第三步:现在我们有了所有“缺课”的学生学号,我们要找的是“一门课都不缺”的学生,从全体学生学号中,找出那些不在“缺课”学生学号列表里的学号。π_Sno(S) - π_Sno( [π_Sno(S) × π_Cno(C)] - SC )。
- 第四步:把这个最终学号集合与学生表S进行自然连接,取出姓名即可。
- 核心要点: 这个题的关键在于利用“差集”运算来巧妙表达“全部”的概念,王珊老师在书中通过这类例题反复强调,理解运算的语义比死记硬背公式更重要。
SQL查询难题:涉及自身连接的查询

另一个高频考点是SQL中表的自身连接,当查询条件需要将同一张表里的不同行进行比较时,就必须用到自身连接。
-
来源题目(思路重现): 还是在学生选课数据库中,查询至少选修了学号为“200215121”的学生所选全部课程的学生学号。
-
解题思路拆解:

- 理解题意: 这其实是上一个关系代数除运算的SQL实现,意思是:找出这样的学生A,不存在一门课程是“200215121”选了而A没选的。
- 使用双重NOT EXISTS嵌套查询(王珊教材中推荐的清晰方法):
SELECT DISTINCT Sno FROM SC SC1 WHERE NOT EXISTS ( SELECT * FROM SC SC2 WHERE SC2.Sno = '200215121' AND NOT EXISTS ( SELECT * FROM SC SC3 WHERE SC3.Sno = SC1.Sno AND SC3.Cno = SC2.Cno ) ); - 语句解读:
- 最外层
SC SC1:遍历每一个选课记录,相当于遍历每一个学生(因为学号在SC1里)。 - 中层
WHERE NOT EXISTS (...):这是一个条件,意思是“不存在这样的情况”。 - 中层子查询
SELECT * FROM SC SC2 WHERE SC2.Sno = '200215121':这是找出参考学生(200215121)所选的每一门课。 - 内层
AND NOT EXISTS (...):这是对参考学生的每一门课进行判断,条件是“不存在这门课不在当前学生(SC1.Sno)的选课列表中”。 - 连起来读: 选择那些学生(SC1.Sno),使得不存在这样一门课(由SC2代表,且是参考学生选的),而这门课又不在该学生(SC3代表,连接条件是SC3.Sno=SC1.Sno and SC3.Cno=SC2.Cno)的选课记录中。
- 最外层
- 难点突破: 王珊的题库通过这种逐层分解的方式,把复杂的逻辑变得清晰,关键是给同一张表起不同的别名(SC1, SC2, SC3)来扮演不同的角色。
范式判断与分解:如何判断一个关系属于第几范式?
这是笔试大题必考内容,王珊教材的核心思路是“按步骤判断”。
-
来源题目(思路重现): 给定一个关系模式R(商店编号,商品编号,数量,部门编号,负责人),以及函数依赖集合F = { 商店编号,商品编号 -> 数量,部门编号;部门编号 -> 负责人 },判断R最高属于第几范式,并分解为3NF。
-
解题步骤(严格按照王珊教材的步骤):
- 找出候选码: 根据函数依赖,左边出现的属性有{商店编号,商品编号}和{部门编号},计算{商店编号,商品编号}的闭包,可以发现它能推导出所有属性(数量、部门编号、负责人),商店编号,商品编号}是候选码。
- 判断非主属性: 主属性是候选码中的属性,即商店编号和商品编号,其余属性(数量,部门编号,负责人)都是非主属性。
- 判断2NF: 看非主属性是否完全函数依赖于候选码,我们发现“负责人”这个非主属性,实际上只依赖于“部门编号”,而部门编号只是候选码的一部分,这就产生了“部分函数依赖”,R不属于2NF。
- 既然不属于2NF,最高就是1NF。
- 分解为3NF(采用王珊教材的“分解算法”):
- 消除部分函数依赖: 将部分依赖的关系单独拆出去,负责人部分依赖于部门编号(它依赖于候选码的一部分),所以我们拆出:(部门编号,负责人)作为一个新关系R1。
- 剩下的属性与完整的候选码组成另一个关系: (商店编号,商品编号,数量,部门编号)作为关系R2,注意,部门编号要保留,作为外键。
- 检查R2: 现在R2的候选码仍是(商店编号,商品编号),非主属性是“数量”和“部门编号”。“数量”完全依赖于整个码。“部门编号”是否完全依赖?是的,因为一个商品在一个商店里,只属于一个部门,但“部门编号”是否传递依赖于候选码?在R2中,有(商店编号,商品编号)-> 部门编号,但部门编号能否决定其他非主属性?在R2中不能,因为负责人已经被移走了,所以R2已经属于3NF。
- 检查R1: R1的候选码是“部门编号”,没有部分依赖和传递依赖,属于3NF。
- 最终答案: R最高属于1NF,分解后的3NF模式为:R1(部门编号,负责人), R2(商店编号,商品编号,数量,部门编号)。
通过以上三个典型题目的深度剖析,我们可以看到王珊题库的精髓不在于题海战术,而在于对每一个核心概念和难点的精准打击,无论是关系代数的逻辑转换、SQL查询的嵌套思维,还是范式分解的标准化步骤,都强调对原理的深刻理解而非机械记忆,吃透这些经典题型,就能举一反三,轻松应对大部分数据库考核。
本文由畅苗于2026-01-15发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/81151.html
