闭卷 -> 开卷,选填砍掉了,所以概念题都作雨课堂测试了。
一、关系数据理论题(共26分)
题目没变(相对于原来为闭卷出的卷子) 分值修改:10->26,6问 找几道题练练。
给出关系模式、属性全集、以及函数依赖关系。
题干很长,大半张纸。
- 确定候选键
- (什么是候选键)如何判断候选键?1个多个?
- 为什么是候选键,原因:因为它(属性或属性组)能(通过公式推导)能决定属性全集。
- 如何算:
- 函数依赖:只右(不是)、只左(必是)、既左又右(不确定);没有函数依赖的属性:必是!
- 先算一下只左的属性集闭包:如果只左的属性组合能决定全集,则这个组合是唯一候选码,停。
- 如果不能,就把既左又右的一个一个拿过来加到只左的属性集上,然后再求闭包,如果能决定全集,则是候选码。所有既左又右的都试一遍,可求出所有候选码。
- 求属性集闭包算法:
- 示例:
- 小心!F 没有函数依赖,算候选 码。
- 题目给的函数依赖满足第几范式?(只可能考第一、二范式,大概率是一)(5-20的复习课,第6章习题)
- 看看 F 中:是否满足各范式条件:
- 第一范式:每个分量是原子的 (一般题目必须满足的)
- 第二范式 :不存在部分依赖
- 第三范式:不存在传递依赖
- BC 范式:每一个决定因素都包含码,则满足Bcnf
- 示例:
- 给出的关系模式 R 达到了第几范式?候选键是 AEF 但只有一个 A 就能确定 B。 候选键是 A 但 C 和 D 并不是直接函数依赖于 A 的。
- 分解的模式R1R2各达到了第几范式?注意示例中 BC 没有函数依赖也算满足!
- 看看 F 中:是否满足各范式条件:
- 给定某一种分解,判断其是否是无损的,是否保持函数依赖的。(只可能考一分为二的)
- 是否无损 -> 是否交集决定差集:
- ![@BIW)CIM9EQX7D~U~TGOCD.png
- 示例:
- 是否保持函数依赖 -> 根据 U 写 F:
- 经验:若 F 中有项的箭头两边元素在这种分解中被拆开了,肯定无法保持函数依赖了。
- 示例:
- 是否无损 -> 是否交集决定差集:
- 对原来的F进行某种分解(6.3,6.4,6.5,三选一,肯定考6.4)
- 要求:转换成 3 NF,保持无损连接。
- 方法:合并:![AFTMFCMG7%}_$)3GTT`7V2.png
- 要求:转换成 3 NF,保持无损连接、保持函数依赖:
- 要求:转换成 3 NF,保持无损连接。
子查询
-- 查询选修课程2且成绩在90分以上的所有学生的学号和姓名 | 例 3.51
SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno = SC.Sno -- 连接谓词
AND SC.Sno ='2' -- 其它限定条件
AND SC.Grade > 90
;
-- 查询与“刘晨”在同一个系学习的学生 | 例 3.55 SELECT Sno, Sname, Sdept FROM Student WHERE Sdept IN( -- 这里也可以用`=` SELECT Sdept FROM Student WHERE Sname = '刘晨' ) ; -- 查询与“刘晨”在同一个系学习的学生 | 另解 3.55 SELECT Sname FROM Student AS s1 WHERE EXISTS ( SELECT * FROM Student AS s2 WHERE s2.Sname = '刘晨' AND s1.Sdept = s2.Sdept -- 理解每次取一个外层元组传递给内层查询 ) ;
插入删除 ```plsql — 对每一个系,求学生的平均年龄,并把结果存入数据库 | 例3.72 CREATE TABLE Dept_age ( Sdept CHAR(15) Avg_age SMALLINT ); INSERT INTO Dept_age(Sdept, Avg_age) SELECT Sdept, AVG(Sage) FROM Student GROUP BY Sdept ;
— 删除计算机科学系所有选课记录 | 例 3.78 DELETE FROM SC WHERE Sno IN( SELECT Sno FROM Student WHERE Sdept=’CS’ ) ;
- 通配符`like`
- 排序 `DESC`
- 分组
- P99:3.47、3.48。注意 `having` 的位置。(多题考到)
- where 先于 having(group by)
- P110:3.62(两种方法:第3章练习ppt最后两页,另一是这个例题的方法)
```plsql
-- 查询选修了全部课程的学生姓名。| 例 3.62
-- 没有一门课程是他不选修的
SELECT Sname
FROM Student
WHERE NOT EXISTS (
SELECT *
FROM Course
WHERE NOT EXISTS (
SELECT *
FROM SC
WHERE Sno = Course.Sno AND Sno = Student.Sno
)
)
;
-- 用连接的方法另解
SELECT Sname
FROM Student
WHERE Sno IN (
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) = (
SELECT COUNT(*) FROM Course
)
)
;
- 聚集函数 ```plsql — 求各个课程号及相应选课人数 | 例 3.46 SELECT Cno,COUNT(Sno) — 分组后聚集函数将作用于每一组 FROM SC GROUP BY Cno ;
— 查询平均成绩大于等于90的学生学号和平均成绩 | 例 3.48 SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade) >= 90 — 只输出满足条件的组 ;
- 视图
- 授权 GRANT/REVOKE(4.2.4,P142示例)
- 注意创建视图再授权!
- 书上例题照葫芦画瓢 / 实验二
```plsql
-- 建立计算机系学生的视图,王平老师拥有 SELECT 权限,张明主任拥有全部操作权限。
CREATE VIEW CS_Student AS
SELECT *
FROM Student
WHERE Sdept = 'CS'
;
GRANT SELECT ON CS_Student TO 王平;
GRANT ALL PRIVILEGES ON CS_Student TO 张明;
三、数据库设计题(共24分)
题目小改(相对于原来为闭卷出的卷子) 增加了一点难度。比复习题作业题难一点。2问 找几道题练练。
题目很长!但每一句话都不是废话,翻译成实体的联系。
- 画 E-R 图: 找到所有实体,及其相应的属性(仔细看每句话)
- 主键下划线、外键波浪线
- eg.多对多可能表述为双方一个对多再反过来一个对多。
- 转化关系(7.4.1P232)
- 主键下划线、外键波浪线
- 一对一:额外属性随便作一个转化关系的外键。注意一方主键也要成为另一方的外键。
- 多对多:单独成为转换关系,双方的主键一起作为额外转换关系的主键!而额外属性作其外键!
- 一对多:额外属性作多的一方外键。一方主键要作多方的外键。
四、日志记录分析题(共15分)
新增题型 知识看下面这些就够了;找几道题练练。 答题卡:
参考题型:P305 T4T5
- 理论依据,当系统故障时:P296 | P305 T4
- 撤销未完成事务
UNDO
:非正常结束:没有commit
或rollback
的。 - 重做已提交事务
REDO
:(检查点之后的)事务可能还在缓冲区未写入就遇到系统故障了。
- 撤销未完成事务
- 系统恢复后,对于变量值的影响: P305 T5
- 已提交的事务(检查点之前提交的事务 / 故障之后重做的事务)会影响变量的值,因为重做了。
- 未提交的事务都被撤销了,因此对变量的修改没有生效。
- 检查点 :P302底例子、P303图10.4、补充习题见下
- 检查点之前提交的:不需要重做
- 检查点之后、故障之前提交的:重做
- 故障之前还未完成:撤销(回滚)