原文筆記
本課程筆記資料庫系統 · 30 篇
Day 08 - 数据库70题:综合题 1-8
参考重点:教材第 1 章数据库系统组成,第 2 章关系代数。
1. DBA 的职责是什么?
答案:
DBA 即数据库管理员,主要职责包括:
- 参与数据库设计,定义数据库模式、外模式和存储结构。
- 定义安全性规则,进行用户授权和权限管理。
- 定义完整性约束,保证数据正确、有效、相容。
- 制定备份和恢复策略,处理故障恢复。
- 监视数据库运行状态,进行性能调优、重组和空间管理。
- 维护数据字典和相关文档,协调不同用户和应用对数据库的使用。
讲解:DBA 不是普通程序员,而是数据库系统运行和数据资源管理的负责人。教材第 1 章把 DBA 列为数据库系统组成部分之一。
2. 什么是数据字典?数据字典包含哪些基本内容?
答案:
数据字典是 DBMS 维护的关于数据库中数据的描述信息,也称元数据仓库。
基本内容包括:
- 数据库、模式、表、视图、索引等对象定义。
- 属性名、数据类型、长度、取值范围、默认值。
- 主键、外键、唯一、检查等完整性约束。
- 用户、角色、权限等安全信息。
- 存储结构、统计信息、访问路径等系统管理信息。
讲解:数据字典保存“关于数据的数据”。用户数据是业务内容,数据字典描述这些业务内容如何组织和受哪些规则约束。
3. 叙述数据字典的主要任务和作用。
答案:
数据字典的主要任务是集中存储、维护和提供数据库元数据。
作用包括:
- 支持 DDL 执行和数据库对象管理。
- 支持查询优化器了解表结构、索引和统计信息。
- 支持完整性检查和安全性检查。
- 支持 DBA 进行监控、维护和文档管理。
- 为应用开发人员理解数据库结构提供依据。
讲解:如果没有数据字典,DBMS 就无法知道表有哪些列、列是什么类型、谁有权限访问、哪些约束需要检查。
4. 叙述模型、模式、具体值三者之间的联系和区别。
答案:
- 数据模型:描述数据、联系、操作和约束的抽象工具,例如关系模型。
- 模式:用某种数据模型定义出来的数据库结构,是相对稳定的“型”。
- 具体值:某一时刻数据库中的实际数据,也称实例或当前值,是不断变化的“值”。
联系:数据模型规定能怎样建模;模式是在该模型下对某个数据库结构的定义;具体值必须符合模式及其约束。
讲解:类比编程:数据模型像语言规则,模式像类或表结构,具体值像运行时对象或表中的行。
5. 叙述等值连接与自然连接的区别和联系。
答案:
等值连接是在两个关系的属性之间用等号条件进行连接;自然连接是一种特殊等值连接,它自动比较两个关系中同名属性,并在结果中只保留一份同名属性列。
区别:
- 等值连接需要明确连接条件,可连接不同名属性。
- 自然连接按同名属性自动连接。
- 等值连接结果中通常保留两个被比较属性;自然连接会去掉重复同名属性。
讲解:若 R(A,B) 与 S(B,C) 自然连接,结果属性是 (A,B,C);若做等值连接 R.B=S.B,结果可能是 (R.A,R.B,S.B,S.C)。
6. 举例说明关系参照完整性的含义。
答案:
参照完整性要求一个关系中的外键值,必须为空或等于被参照关系中某个主键值。
例子:
Student(Sno, Sname)中Sno是主键。SC(Sno, Cno, Grade)中Sno是外键,引用Student(Sno)。
则 SC 中每一条选课记录的 Sno 必须在 Student 表中存在,不能出现一个不存在学生的选课记录。
讲解:参照完整性用于维护表之间联系的正确性。SQL Server 中用 FOREIGN KEY ... REFERENCES ... 定义。
7. 将关系代数中的五种基本运算用元组关系演算表达式表示。
答案:
设关系谓词为 R(t)、S(t),元组变量为 t、u、v。
- 并:
R ∪ S = { t | R(t) OR S(t) } - 差:
R - S = { t | R(t) AND NOT S(t) } - 选择:
σF(R) = { t | R(t) AND F(t) } - 投影:
πA(R) = { u | EXISTS t (R(t) AND u[A] = t[A]) } - 笛卡尔积:
R × S = { v | EXISTS r EXISTS s (R(r) AND S(s) AND v = r ∘ s) }
讲解:关系代数是过程性更强的表达,关系演算是声明性表达。元组演算的核心是“用谓词描述结果元组应满足什么条件”。
8. 有三个关系 S、C 和 SC,试用关系代数表达式表示查询。
题面关系:
S
| S# | SNAME | AGE | SEX |
|---|---|---|---|
| 1 | 李强 | 23 | 男 |
| 2 | 刘丽 | 22 | 女 |
| 5 | 张友 | 22 | 男 |
C
| C# | CNAME | TEACHER |
|---|---|---|
| K1 | C语言 | 王华 |
| K5 | 数据库原理 | 程军 |
| K8 | 编译原理 | 程军 |
SC
| S# | C# | GRADE |
|---|---|---|
| 1 | K1 | 83 |
| 2 | K1 | 85 |
| 5 | K1 | 92 |
| 2 | K5 | 90 |
| 5 | K5 | 84 |
| 5 | K8 | 80 |
为避免歧义,下面使用 SNAME、CNAME 作为姓名和课程名。
8.1 检索“程军”老师所授课程的课程号和课程名。
答案:
πC#,CNAME(σTEACHER='程军'(C))
讲解:先选择教师为程军的课程,再投影课程号和课程名。
8.2 检索年龄大于 21 的男学生学号和姓名。
答案:
πS#,SNAME(σAGE>21 AND SEX='男'(S))
8.3 检索至少选修“程军”老师所授全部课程的学生姓名。
答案:
πSNAME(S ⋈ ((πS#,C#(SC)) ÷ (πC#(σTEACHER='程军'(C)))))
讲解:这是除法。被除数是学生选课对 (S#, C#),除数是程军老师讲授的全部课程号。结果是选了这些全部课程的学生号,再连接 S 取姓名。
8.4 检索“李强”同学不学课程的课程号。
答案:
πC#(C) - πC#(σSNAME='李强'(S) ⋈ SC)
讲解:所有课程号减去李强已选课程号,就是李强未选课程。
8.5 检索至少选修两门课程的学生学号。
答案:
πSC1.S#(σSC1.S#=SC2.S# AND SC1.C#<>SC2.C#(ρSC1(SC) × ρSC2(SC)))
讲解:把 SC 改名成两份,找同一学生对应不同课程的配对。原题括号中写成 C# 应为 S#。
8.6 检索全部学生都选修的课程的课程号和课程名。
答案:
πC#,CNAME(C ⋈ ((πS#,C#(SC)) ÷ (πS#(S))))
讲解:除数是全部学生号,结果是被所有学生都选过的课程号。
8.7 检索选修课程包含“程军”老师所授课程之一的学生学号。
答案:
πS#(SC ⋈ πC#(σTEACHER='程军'(C)))
讲解:“之一”表示至少选一门,所以用连接即可,不用除法。
8.8 检索选修课程号为 K1 和 K5 的学生学号。
答案:
πS#(σC#='K1'(SC)) ∩ πS#(σC#='K5'(SC))
讲解:同时满足两个课程条件,用交集表达最清楚。
8.9 检索选修全部课程的学生姓名。
答案:
πSNAME(S ⋈ ((πS#,C#(SC)) ÷ (πC#(C))))
8.10 检索选修课程包含学号为 2 的学生所修课程的学生学号。
答案:
πS#((πS#,C#(SC)) ÷ (πC#(σS#='2'(SC))))
讲解:结果学生的选课集合必须覆盖 2 号学生的选课集合。这也是除法题。
8.11 检索选修课程名为“C语言”的学生学号和姓名。
答案:
πS#,SNAME(S ⋈ SC ⋈ σCNAME='C语言'(C))
讲解:先找到课程名为 C语言 的课程,再通过 SC 找选修学生,最后连接 S 取学号和姓名。