SCAU期末笔记 - 数据库系统概念往年试卷解析

数据库搞得人一头雾水,题型太多太杂,已经准备摆烂了。就刷刷往年试卷,挂不挂听天由命。

2019年

Question 1 选择题

1. R ∩ S R∩S R∩S等于一下哪个选项?

画个文氏图秒了

所以选A. R ∩ S = R − ( R − S ) R∩S=R-(R-S) R∩S=R−(R−S)

2.哪个操作要求两个参与的关系具有相同数量的属性?

  • A.外连接(Outer join):先看定义,参见上一篇数据库的期末笔记
    • 我们以左外连接为例子。假设有两个关系表,表 A(员工表)和表 B(部门表),通过员工所属部门 ID 进行连接。表 A 有员工 ID、员工姓名、部门 ID 等字段,表 B 有部门 ID、部门名称等字段。如果使用左外连接,那么会返回表 A 中的所有员工记录,即使某些员工在表 B 中没有对应的部门信息(即部门 ID 在表 B 中不存在),这些员工记录也会被返回,只是对应的部门名称等右表字段会显示为 NULL。
  • B.自然连接(Natural join):直接举例子
  • C.笛卡尔积(Cartesian product):最复杂的一个,很常考,我们这里先举个简单的例子
  • D. 并集(Union):并集操作要求两个参与的关系具有相同数量的属性,并且对应属性的数据类型也必须相同,故选D。

3.投影(PROJECTION)操作对应下列哪一个语句?

首先我们要知道投影是啥,去查一下定义:

  • A. HAVING子句通常用于在分组查询中对分组结果进行筛选,与投影操作的功能不同。
  • B. SELECT子句用于指定要从数据库中检索的列,这与关系代数中的投影操作是类似的,都是对列的选择。例如,在关系代数中,如果有一个关系R(A,B,C),进行投影操作π_{A,B}(R),就是选择R关系中的AB列;在 SQL 中,SELECT A,B FROM R也是选择R表中的AB列。
  • C. FROM子句用于指定要查询的表或视图,它主要是确定数据的来源,而不是对列的选择,与投影操作不对应。
  • D. WHERE子句用于在查询中设置条件,对行进行筛选,而不是对列的选择,与投影操作的功能不同。

4.关系 R ( A , B , C ) R(A,B,C) R(A,B,C)包含 10 10 10个元组,关系 S ( A , D , E , F ) S(A,D,E,F) S(A,D,E,F)包含 15 15 15个元组。那么" R R R自然全外连接 S S S"的操作结果不可能是____。

自然连接是啥我们第一题刚刚讲过,观察那个例子,我们发现自然连接的结果中最少是原本元组多的那个关系的元组数,最多是原本的两个关系的元组数相加,为什么呢?还是看刚才那个例子,假如三个课程分属不同系,而两个学生不在这两个系中的任何系,最后的结果自然每个系都要占一行也就是6行;而如果每个学生所在的系都在课程表中有对应的话自然是行数最小的情况,至少每个课程要占据一行吧。

回到这一题,B选项的10个元组自然就是不可能的。

5.哪个指令用于删除一个表?

在SQL中,DROP TABLE是用于删除表的标准命令。DELETE通常用于删除表中的数据行,而不是删除整个表;REVOKE用于撤销用户的权限,与删除表无关;REMOVE不是SQL中用于删除表的正确语法。

6.哪条指令可以正确地找到所有姓氏不是"Zhang"的学生?

首先前面肯定是SELECT name FROM student WHERE,问题就是后面如何操作,首先我们要知道如何筛选姓Zhang的,姓Zhang意味着名字最前面是Zhang,按照SQL的查询规则,我们要输入'Zhang%',然后因为我们用了%表示后面接什么都算所以这是一个模糊匹配,不能使用<>(不等于)这样一个语法,必须使用like或者not like(没有is not like这种语法),然后我们要的是不姓"Zhang"的所以最后就选C.SELECT name FROM student WHERE name not like 'Zhang%'

7.下列哪个指令和NOT IN等价?

首先<>上一题我们说了是不等于,ALL就是遍历后面集合的所有元素,必须全部不相等才算,也就是和NOT IN等价,选A。而SOME则是只要不等于集合中其中一个元素就算。

8.下列哪些说法是正确的?

首先我们要知道NULL的比较规则,参考这里

所以A和B肯定是错的,C是对元组的比较,就元组而言两个元组诗完全相等的,所以选C。

9.程序员在哪个层级与数据交互?

在概念总结的第一章就有提到

你就想奥,你不是手搓数据库的话肯定不至于去物理层,视图层又是给用户用的,所以选B逻辑层。

10.如果从实体集A到实体集B的映射基数是多对一,那么A中的一个实体与B中的多少实体相关联?

这不是顾名思义?除非你看不懂题目,many to one不知道是多对一的意思,答案选A至多一个。

11.一个或多个属性的最小集合,足以唯一地区分每个实体,被称为什么?

先看定义

所以肯定选B候选码。

12.下列哪个是商业数据库系统中使用的一种非过程性语言?

你不需要知道别的,总不可能不知道SQL是一种非过程性语言吧,选C。

13.关系模式是由什么组成?

关系模式是对关系(可以简单理解为数据库中的表)结构的一种抽象描述,它是一组属性(attributes)的集合,所以选B。

说人话怎么理解呢,关系模式就是那个表的首行,就是写着每一列存什么元素的那一行,存储的是一个填表格的规则。

14.在关系数据库系统中,哪种属性被特征化了?

先看定义

然后特征化又是啥呢?专业地说就是可以理解为对某种事物(这里指属性)的典型特点、性质或表现形式进行明确的界定和描述,使其具有独特的、可识别的标志或属性,以便与其他事物区分开来。简单来说就是具有不可分割性。那么在选项中就只有简单属性满足这一条件,选A。

15.E-R 图使用什么来表示关系集?

看课本上的图6.3作为例子,左右两个矩形框是实体集,分别是老师和学生,里面标好了这两个集内的属性,中间那个advisor表示教师和学生之间具有advisor这一关系(翻译成中文就是教导关系),所以关系集是以菱形表示的,选B。

16.观察表格内的关系,哪个函数依赖是可能的?

这种题我们就看左右关系是不是唯一地,比如A选项是A --> (D,E),那么要求是A这一列为不同值时(D,E)的组合一定不同,这一题就是选A。我们以B为反例看一看,B选项D --> A,但是我们看到表格中D这一列出现了两次d4,而且每次出现对应那一行的A还不一样,分别是a3a4,所以这一个依赖关系自然就不成立。

17.假设我们将模式 r(A,B,C) 分解为 r1(A,B) 和 r2(A,C)。哪个函数依赖能让这次分解是无损分解?

按照惯例,先看定义

那也就是说无损分解是指将一个关系模式分解为多个子模式后,通过对这些子模式进行自然连接操作可以还原到原来的关系模式,且不会产生多余的元组(信息不会丢失)。

  • A.或两边的情况是等价的,我们就看B-->A,你想一下这何止是有损,我们合并的时候先把没变动的r2抄下来,然后我们已知的AC都无法定位任何一个B,直接超级大展开,数据给我损完了都
  • B.和上面类似,我必须有(B,C)才能确定唯一地A,但是我在合并的中途上哪给你找(A,B)的组,自然也是有损
  • C.还是刚才那个流程,我们把r2抄下来,现在有A和C,我们的A刚好都可以定位唯一的一个B,那我们这个B可以尽可能不加行地塞到已有的行里面,这是无损的,选C

18.假设 R(X,Y,Z) 有三个单属性 XYZ。如果 (X,Y,Z) 是候选码,那么以下哪个陈述成立?

先看定义

然后我们还知道候选码是足以区分每个实体的最小属性集合,也就是说比(X,Y,Z)元素少的集合是必然不足以区分每个实体的,再加上这个关系R一共就这么三个属性,所以(X,Y,Z)是唯一的候选键,自然能保证所有函数依赖的左部都包含任一(也是唯一)的候选键,故 R ∈ B C N F R∈BCNF R∈BCNF,选A。

19.以下哪一性质确保事务的所有影响要么都反映在数据库中,要么都不反映?

定义位于第13章,直接秒了选A。

20.检查点的执行不进行哪一步操作?

  • 检查点(Checkpoint)的作用和执行过程 :检查点是数据库管理系统中用于恢复的一种机制。它的主要目的是减少系统故障恢复时需要处理的日志量,提高恢复效率。在执行检查点时,通常会进行以下操作:
    • A选项:将当前驻留在主存中的所有日志记录输出到稳定存储(如磁盘等非易失性存储),这样可以确保日志记录的持久性,以便在故障恢复时使用,这是检查点执行的一部分。
    • B选项:将所有已修改的缓冲块输出到磁盘,这是为了确保数据的一致性和持久性,也是检查点的重要操作之一。
    • D选项 :将形如 <checkpoint L> 的日志记录输出到稳定存储,用于标记检查点的位置,方便后续恢复操作,这是检查点执行过程中的一个关键步骤。
    • C选项:仅仅写入一个缓冲块,这并不能完成检查点的整体功能和目的,检查点需要对整个系统的状态进行记录和保存,包括日志记录和已修改的数据块等,而不是单个缓冲块的写入,所以C选项不是检查点的执行方式。
  • 所以选C。

Question 2 写关系代数表达式和SQL语句

首先题目说了我们有这么一个数据库

text 复制代码
member(no, name, age)
book(isbn, title, author, publisher)
borrowed(mem_no, isbn, date)

那就是说有这么个图书馆的数据库,有三个表分别记录了用户信息(id,姓名,年龄),书籍信息(isbn,书名,作者,出版商)和借书信息(借书人的id,书的isbn,借书时间)

1.写关系代数表达式查询'2019-12-25'借出的所有书的isbn

先看看这个关系代数表达式详细教程吧家人们,写出来长这样 π i s b n ( σ d a t e = ′ 2019 − 12 − 2 5 ′ ( b o r r o w e d ) ) \pi_{isbn}(\sigma_{date = '2019-12-25'}(borrowed)) πisbn(σdate=′2019−12−25′(borrowed))简单解释一下,先是我们选择题遇到过的投影操作也就是 π \pi π,下标表示选择的是哪一列,我们要看isbn所以肯定选择isbn那一列嘛。然后是要选择日期为'2019-12-25'的元组,选择就是 σ \sigma σ,下标表示要求date = '2019-12-25'也就是日期这一项得等于'2019-12-25',最后那个括号表示我们是在borrowed这个表里面去查询的。

2.写关系代数表达式和SQL语句查询所有借过'Database System'这本书的用户的名字

首先我们先理清楚思路,因为书名人名和借书信息分属三个表,所以我们肯定要先连接一下子,然后我们直接查询书名为Database System的元组的人名就行了对吧,但是现在还有一个问题,同样是用户id,borrowed表里面存的叫mem_id,member里面直接存的就叫id,为了解决这个不同名的情况,我们可以用笛卡尔积,然后选择时加一个mem_id=id的条件

关系代数表达式

π n a m e ( σ n o = m e m n o ⋀ t i t l e = ′ D a t a b a s e S y s t e m ′ ( m e m b e r × ( b o r r o w e d ⋈ b o o k ) ) \pi_{name}(σ_{no=mem_no⋀ title='Database System'}(member×(borrowed⋈book)) πname(σno=memno⋀title=′DatabaseSystem′(member×(borrowed⋈book))

SQL语句
sql 复制代码
select name
from member, borrowed natural join book
where no=mem_no and title='database system'

3.写关系代数表达式和SQL语句查询每个出版商出版作者为'Lu Xun'的书籍的数量

先选取所有鲁迅写的书作为一个集合,然后根据isbn去给每个出版商计数,不按书名是因为书名可能会重,可能两家出版社出版了两种不同的《呐喊》这种情况

关系代数表达式

π p u b l i s h e r , c o u n t ( i s b n ) ( σ a u t h o r = ′ L u X u n ′ ( b o o k ) ) \pi_{publisher, count(isbn)}(\sigma_{author = 'Lu Xun'}(book) ) πpublisher,count(isbn)(σauthor=′LuXun′(book))

SQL语句
sql 复制代码
SELECT publisher, COUNT(isbn)
FROM book
WHERE author = 'Lu Xun'
GROUP BY publisher;

4.写SQL语句查询所有借书数量比编号1001的用户多的用户的编号

sql 复制代码
select mem_no
from borrowed
group by mem_no
having count(isbn)>(select count(isbn) 
from borrowed
where mem_no='1001')

5.用SQL语句查询所有借过'SCAU Press'出版的书的用户的名字

sql 复制代码
select name
from member as m
where not exist ( (select isbn 
from book 
where publisher='SCAU press')
except
(select isbn 
from borrowed 	
where mem_no=m.no) )

Question 3 画E-R图以及写关系模式

1.为以下情况绘制 E-R 图:一部小说由且仅由一位作者撰写。小说写完后,由且仅由一家出版商出版。每部小说可以在许多不同的书店以不同的价格出售。一部小说具有诸如 ID、名称、字数、类型等属性。一位作者具有诸如 ID、姓名、国籍、生日等属性。一家出版商具有诸如 ID、名称、资产、电话号码等属性。一家书店具有诸如 ID、名称、位置、电话号码等属性。

上面选择题的时候我们已经简单聊过了E-R图,当时说的内容基本足以画出这一题的E-R图了,值得注意的几个点包括

  • 每个书店会以不同的价格出售同一本书,所以有价格这样一个标签连在出售关系上
  • 关系集有的时候要有箭头,还有就是被连接的两个属性集的关联项要加下划线

2.将你的 E-R 图转换为关系模式。指定每个模式的主键和外键。你可以按照以下格式书写答案:"R (a1, a2, a3, a4), 外键: a4"。

主要难处理的就是price那一片嘛,其实就比较自由,只要能把整个关系弄清楚就行,答案上这一部分他就直接开了一个新的Sold表连到Bookstore和Novel上面,还加了bookstore_ID之类的属性

text 复制代码
Novel(ID, name, words, type, publisherID, writerID), foreign key: publisherID (reference publisher(ID)), writerID (reference writer(ID))
Writer(ID, name, nationality, birthday)
Publisher(ID, name, asset, phone)
Bookstore(ID, name, location, phone)
Sold(novel_ID, bookstore_ID, price), foreign key: novel_ID(reference novel(ID)), bookstore_ID(reference bookstore(ID))

Question 4 关系模式的操作

考虑关系模式 R (A,B,C,D) 上的以下函数依赖集 F:

A → C

C → A

B → AC

D → AC

1.计算 ( A D ) + {(AD)}^{+} (AD)+

首先我们要知道 ( A D ) + {(AD)}^{+} (AD)+是个什么东西,如果你对离散数学还有印象,这个东西叫闭包,那我们怎么算呢?

就是首先一个集合,把A和D先放进去,然后去上面那个依赖集里面找,A都指向谁了,指向了C那把C也放进来,再看D指向AC了,已经都在里面了就别管,然后新加进来的也要再找,这里C是指向A已经在里面了,所以最后的答案就是 { A , C , D } \{A,C,D\} {A,C,D}

2.为上述函数依赖集F计算一个规范覆盖;给出推导的每一步并加以解释

首先,老问题,规范覆盖是个什么东西,其实就是对我们的依赖集进行一波简化。举个例子A-->C,A-->B,B-->C,这三个关系同时出现的前提下,你会发现A-->C这句话毫无意义;再举个例子AB-->C,A-->C里面这个AB-->C也同样是多余的,这些多余的内容我们就可以直接删掉

这题答案就是这样的

答案把依赖写的方方正正的很好看,但是实际考试的时候写个集合的大括号然后全部往里一丢也是可以的

3.列出R的候选键

候选键总不用解释了吧,就是你这个ABCD最少要确定几个元素或组能够确定一个元组的所有内容

那怎么写呢,我们就从小往大试,先看ABCD只选一个能不能确定元组,发现都不行就再试两个的,发现BD能确定,那就不要再往更大的找了,答案就是BD

4.使用原始的函数依赖集,给出仅进行一次BCNF分解的R的分解

对于函数依赖 A → C,A 不是候选键,这就意味着存在以非候选键作为决定因素的函数依赖,不符合 BCNF 要求,所以需要基于此进行分解。那就把AC分成一组,另外一组现在是BD,但是他们没有直接的关系,我们再加一个A进去他们就满足BCNF了,所以就可以将ABCD分解为AC和ABD。

5.基于规范覆盖给出R的3NF分解

BCNF我们选择题遇到了,但是3NF还是第一次遇到,所以先看定义

对于 F c = { A C , C A , B A , D A } F_c=\{ A C, C A, B A, D A\} Fc={AC,CA,BA,DA},我们这样考虑

  • 对于 A → C A\rightarrow C A→C和 C → A C\rightarrow A C→A
    • 这两个函数依赖表明 A A A和 C C C之间是相互决定的关系。所以将它们组合成一个关系模式 A C AC AC,在这个关系模式中, A A A和 C C C都是主属性,因为它们都能相互决定对方,不存在非主属性对候选键(在这里 A A A和 C C C都可以看作候选键)的传递函数依赖,满足3NF。
  • 对于 B → A B\rightarrow A B→A
    • 根据这个函数依赖,创建关系模式 B A BA BA。在这个关系模式中, B B B是决定因素, A A A是被决定因素。 B B B可以看作主属性, A A A在这里是非主属性,但不存在通过其他非主属性来间接决定 A A A的情况,所以满足3NF。
  • 对于 D → A D\rightarrow A D→A
    • 同理,由这个函数依赖得到关系模式 D A DA DA。 D D D是主属性, A A A是非主属性,不存在传递函数依赖,满足3NF。
  • 添加 B D BD BD
    • 回顾候选键相关知识,为了确保不丢失候选键相关的信息(虽然在题目描述中没有详细提及如何确定需要添加 B D BD BD,但一般是为了完整地通过候选键来关联各个关系模式),添加关系模式 B D BD BD。在这个关系模式中, B B B和 D D D可以看作主属性,不存在非主属性对候选键的传递函数依赖,满足3NF。而且通过 B D BD BD与其他关系模式(如 B A BA BA和 D A DA DA)的关联,可以更好地保证数据的完整性和一致性。

Question 5 事务管理

有以下两个事务

sql 复制代码
T1: read(A)
    read(B)
    If A=1 then B:=B*2;
    write(B)
sql 复制代码
T2: read(B)
    read(A)
    If B=1 then A:=A*2;
    write(A)

设一致性要求为 A = 1 或 B = 1 A = 1 或 B = 1 A=1或B=1,初始值为 A = B = 1 A = B = 1 A=B=1。

1.证明涉及这两个事务的每一个串行执行都能保持数据库的一致性,并计算A和B的最终结果

按照惯例,先查定义

那也就是说两个轮流进行吗,简单盘一下不难知道如果T1先进行的话那最后A=1,B=2,反之是A=2,B=1,都是满足一致性要求的

2.向事务T1和T2添加加锁和解锁指令,使它们遵循两阶段锁协议。这些事务的执行会导致死锁吗?

上锁解锁其实就是用前用后加一行代码而已

T1加锁解锁就是这样

sql 复制代码
lock-S(A)
read(A)
lock-X(B)
read(B)
if A = 1
then B := B*2
write(B)
unlock(A)
unlock(B)

T2是这样的

sql 复制代码
lock-S(B)
read(B)
lock-X(A)
read(A)
if B = 1
then A := A *2
write(A)
unlock(B)
unlock(A)

都这么问了肯定是会出现死锁的,万一两个一起运行,T1把B锁了,然后T2想读就等着T1给他解锁,大概就像这样

3.展示T1和T2的一个并发执行,产生一个不可串行化的调度

简单来说就是如果两个同时执行,在一个特定的情况下

B在更新之后还没有写会数据库,所以在T2里面B还是1,就导致最后A和B都变成2了,就破坏了一致性

4.解释术语串行调度和可串行化调度之间的区别

一个其中所有属于单个事务的指令都连续出现的调度被称为串行调度。可串行化调度是一种并发调度,它具有一个较弱的限制,即它应该与某个串行调度等价。

具体的看定义

2020年

Question 1 选择题

1.数据库系统是________。

选B.等同于DBMS和被管理的数据库。

2.在特定时刻存储在数据库中的信息集合被称为________。

第一章最前面就有的概念,选A。

3.________是商业数据库系统中使用的非过程性语言。

上张试卷有原题,选C。

4.关于表的键的数量,以下哪项是正确的?

上张卷子科普过了,选B。

5.在以下术语中,________是正确的。

整本书最前面四个定义就是他们了

所以选A。

6.在数据库系统中使用函数和过程有利于________。

选D,全都有

  • 模块化:函数和过程可将复杂业务逻辑分解为独立模块,便于管理、理解、维护与复用。
  • 性能:能减少代码重复执行,借助系统优化提升执行效率,节省资源。
  • 安全性:可限制访问权限,内部进行数据验证与权限检查,保障数据安全与完整。

7.关于视图,以下哪项陈述不正确?

视图虽然是虚拟关系,但它并不是一个没有记录的空表,选C。

8.________不是E-R模型中的三个基本概念之一。

上定义

四个选项只有模式俩字没在这个定义里出现过,所以选D。

9.以下哪项陈述是错误的?

  • A.在函数依赖理论中,最严格的范式是BCNF(巴斯 - 科德范式),而不是4NF(第四范式)。4NF主要是处理多值依赖的问题,BCNF则是在函数依赖的基础上对关系模式进行更严格的约束,要求关系模式中每一个函数依赖的决定因素都包含候选键,选A。
  • B.3NF(第三范式)是在1NF(第一范式)的基础上进一步满足一定条件的范式,所以满足3NF的关系一定满足1NF。
  • C.如果一个关系满足4NF,那么它必然满足3NF,因为4NF是比3NF更高级的范式,对关系模式的要求更严格,满足更严格要求的关系自然也满足相对宽松的要求。
  • D.BCNF比3NF更严格,如前面所说,BCNF要求函数依赖的决定因素都包含候选键,而3NF允许存在主属性对候选键的传递依赖(但不允许非主属性对候选键的传递依赖)。

10._______不是事务的属性。

之前丢过的图再丢一遍,很明显选B,剩下三个明显都是好词儿嘛。

11.如果事务T已经获得了数据项A的共享锁,那么 T 可以_____。

共享锁的特点就是只读不写,选A。想读写的话你得用排他锁(Exclusive Lock),给了一个事务权限别的就都不能访问了,这么设计是为了保证一致性。还记得上张试卷的Question 5吗?lock-S(A)就是给数据项A加共享锁,lock-X(B)就是给B加排他锁。

12.在从E-R模型映射到关系模型时,一个关系可以被映射为______。

还记得上张试卷上让我们画的E-R图吗,当时我们有的关系是通过关联的两个属性集里面的同名属性连接,也就是标下划线,反映在数据库上就是一列;也有那个出售价格我们单开了一个表,记录价格和书籍以及书店的ID,这就是用一个表存。所以这一题选D,两种存法都可以。

13.在数据库物理设计阶段,必须给出______。

直接上定义,选B。

14.在 SQL 中,以下哪个谓词可以在 where 子句中用于测试 "amount" 是否为空值?

上张试卷已经详细介绍过空值了,选B。

15.SQL 语句 "Select count (*) From employee left outer join works" 在以下表上运行,那么查询的输出是______?

  • SELECT count(*) 是用于统计结果集中的行数。
  • FROM employee left outer join works 表示对 employee 表和 works 表进行左外连接。左外连接会返回左表(这里是 employee 表)中的所有行,以及右表(works 表)中与左表连接条件匹配的行,如果右表中没有匹配的行,则用 NULL 填充。

在给定的示例中,employee 表有 4 行数据,左外连接后结果集的行数仍然是 4 行(即使 works 表中可能没有与 employee 表中某些行完全匹配的数据,但左外连接会保证 employee 表的所有行都在结果集中)。

所以,查询的输出是 4,答案选 C。

16.表EMP中插入了多少行?

sql 复制代码
INSERT INTO EMP(ID, Age) VALUES ('001',25);
INSERT INTO EMP(ID, Age) VALUES ('002',35);
INSERT INTO EMP(ID, Age) VALUES ('003',15);
INSERT INTO EMP VALUES ('004', 40);
COMMIT;

注意看题目的要求,age必须大于18小于60,所以第三条就没法成功插入,然后第四条没有指定字段名所以也会插入失败,选C。

17.在以下关于函数依赖的规则中,________是正确的。

  • A.仅根据 X ∩ Y = ∅ 不能得出 X → Y 的函数依赖关系。
  • B.已知 X → Y ,那么 WX → WY(根据增广律),又因为 WY → Z ,所以可以由传递律推出 WX → Z ,选B。
  • C.XY → Z 不能直接推出 X → ZY → Z
  • D.X ⊆ Y 也不能得出 X → Y 的函数依赖关系。

18.设A、B、C和D为属性,在以下关系代数表达式中,________不是一个关系。

× \times ×是笛卡尔积的符号,所以连接的必须是两个关系,A选项拿这玩意儿连接属性肯定是语法错误,选A就行。

19.关于触发器,以下哪句话是错误的?

选D,书上没翻到滚去问老师了。

20.如果实体集A和B之间存在一对多关系,那么______。

在实体集A和B之间存在一对多关系时,意味着对于B中的一个实体,在A中可以有多个与之相关联的实体;而对于A中的一个实体,在B中只有一个与之相关联的实体。

从函数依赖的角度来看,由于B中的一个主键值能唯一确定A中的主键值(因为B中的一个实体对应A中的多个实体,所以可以根据B的主键找到A中与之相关的主键),即存在从B的主键到A的主键的函数依赖,也就是PK(B) → PK(A)。

而选项B中说从A的主键到B的主键的函数依赖是不正确的,因为A中的一个主键值可能对应B中的多个主键值,不满足函数依赖的唯一性要求。

所以答案是A。

Question 2 写关系代数表达式和SQL语句

给定数据库

text 复制代码
Teacher(TId, TName, office, age)
Equipment(EId, Ename, serial_number, price)
Own(TId, EId, date)

1.用关系代数表达式查询没有任何设备的老师的编号

非常人性化的是我们的Own表里面就存了老师的Id,所以直接选取Teacher内的所有老师Id,把出现在Own表内过的Id剪掉就可以了 π T I d ( T e a c h e r ) − π T I d ( O w n ) \pi_{TId}(Teacher)-\pi_{TId}(Own) πTId(Teacher)−πTId(Own)

2.用关系代数表达式和SQL语句查询拥有价格低于1000的设备的老师的的名字

设备的价格,老师的名字和拥有情况分属三个表,那又要全部先连接一下子然后再查询了

关系代数表达式

π T N a m e ( σ p r i c e < 1000 ( T e a c h e r ⋈ E q u i p m e n t ⋈ O w n ) ) \pi_{TName}(\sigma_{price<1000}(Teacher⋈Equipment⋈Own)) πTName(σprice<1000(Teacher⋈Equipment⋈Own))

SQL语句
sql 复制代码
select TName
from Teacher natural join Own natural join Equipment
where price<1000

3.用关系代数表达式和SQL语句查询拥有价格最高的设备的教师姓名

关系代数表达式

π n a m e ( T e a c h e r ⋈ O w n ⋈ ( E q u i p m e n t ⋈ p r i c e = max ⁡ ( p r i c e ) ( E q u i p m e n t ) ) ) \pi_{name}(Teacher\bowtie Own\bowtie(Equipment\bowtie_{price=\max(price)}(Equipment))) πname(Teacher⋈Own⋈(Equipment⋈price=max(price)(Equipment)))先看里面这个 E q u i p m e n t ⋈ p r i c e = max ⁡ ( p r i c e ) ( E q u i p m e n t ) Equipment\bowtie_{price=\max(price)}(Equipment) Equipment⋈price=max(price)(Equipment),这个操作得到的是一个集合,只包括价格=最贵设备的设备,再拿这个表和Teacher以及Own自然连接,后面的操作就很明了了。

SQL语句
sql 复制代码
select TName
from Teacher
where TId in (
    select TId
    from Own
    where EId in (
        select EId
        from Equipment
        where price = (select max(price) from Equipment)
    )
);

4.用SQL语句查询每位教师的姓名以及所拥有设备的总价

主要的点就是通过这个Group by依据其中一个元素分组,还有就是sum求和

sql 复制代码
select TName, sum_price
from teacher natural join (
    Select TId, sum(price) as sum_price
    From Own natural join Equipment
    Group by TId
);

5.用SQL语句对所有价格高于10000的设备进行10%的贬值

最基础的更新数据的命令

sql 复制代码
Update Equipment
Set price=price*0.9
Where price>10000;

Question 3 画E-R图以及写关系模式

一家医院具有如编号、名称、位置、等级、容量等属性。一家医院有许多用于病人的病房,一个病房可以用房间编号、建筑物、病床数量等属性来描述。一位医生可以用编号、姓名、年龄、专业和职称来描述。一位病人具有如编号、姓名、年龄、性别、地址等属性。上述对象必须满足一些约束条件:每位医生可以失业或受雇于一家医院。如果一位医生受雇,其薪水需要记录在数据库中。一位病人可以去多家医院。住院病人是住在某个病房并由住院医生(住院医生是医生的一种职称)管理的病人。一个病房只属于一家医院,并且每家医院配备多个病房。

1.绘制E-R图表示上述模式

画了半天的图被我不小心删了,还是丢标答吧

2.将E-R图转换为关系数据库模式,并指出主键和外键

一如既往地,我们要额外加一些连接用的键值属性

text 复制代码
Hospital(ID, name, location, rank, capacity )  primary key: ID
Ward(roomID, building, HospitalID, BedNumber) primary key: roomID, building, HospitalID  foreign key: HospitalID
Doctor(id, name, specialty, title, HospitalID, salary)  primary key: ID foreign key: HospitalID
Inpatient(patientID, DoctorID, roomID, building, HospitalID, InDate, OutDate) primary key: patientID, DoctorID, roomID, building, HospitalID foreign key: patientID from patient(ID), DoctorID from doctor(id), roomID, building, HospitalID from ward

3.给出一个例子说明外键的作用

以病房关系Ward中的HospitalID外键为例。假设在Ward表中有一条记录(101, A 楼, 1, 20),其中HospitalID为 1。这就表示这个病房属于Hospital表中ID为 1 的医院。如果在插入或更新这条记录时,HospitalID的值在Hospital表中不存在,那么数据库系统会根据外键约束拒绝这个操作,从而保证了数据的一致性,即病房一定是属于某个已存在的医院,不会出现孤立的病房记录。

Question 4 关系模式的操作

一整道大题都和上一张试卷的完全一样,跳过

Question 5 事务管理

假设使用即时数据库修改方法和检查点技术。下图描绘了并发事务、检查点时间和系统故障时间。

1.根据上图写下日志目录。

记录开始结束和检查点即可

bash 复制代码
<T1,start>
<T2 start>
<T1 commit>
<T3 start>
<checkpoint>
<T4 start>
<T5 start>
<T4 commit>

2.说明哪些事务需要进行撤销(undo)操作,哪些事务需要进行重做(redo)操作,并解释原因。

事务 T3 和 T5 需要撤销,因为这两个事务已开始但尚未提交。

事务 T2 和 T4 需要重做,因为它们在检查点(Tc)之后且在系统故障(Tf)之前已提交,但结果可能尚未写入数据库。

3.使用检查点技术的优点。

检查点技术的优点在于,在系统恢复时,不需要从最早的事务开始进行重做(redo)和撤销(undo)操作。所有在检查点之前已经提交的事务,其对数据库的修改已经被保证是持久化的,不需要再次进行处理。在进行恢复操作时,可以从检查点之后开始处理那些未完成的事务(如本题中的 T3 和 T5 需要撤销,因为它们在系统故障时还未提交)以及重新执行在检查点之后提交但可能结果尚未写入数据库的事务(如本题中的 T2 和 T4 需要重做)。这样可以大大缩短恢复过程所需的时间和资源消耗,提高系统的可用性和恢复效率。

4.绘制事务的状态图。

2021年

Question 1 选择题

1.下列那句是错误的?

选B,一列怎么可能有多个名称呢?

2.哪项可以拥有属性?

实体集有描述其特征的属性,关系集在某些情况下也可以有属性来描述关系的一些特性,选C。

3.如果实体集 "经理(manager)" 和 "项目(project)" 之间的 "负责(in_charge_of)" 关系集的主键是 {project_id},那么 "in_charge_of" 的映射基数是什么?

题目没说那就不知道,除非明确说了一个经理只管一个项目或者一个项目只有一个经理,选D。

4.当一个实体转换为关系模式时,_____属性会被放置在一个新的关系模式中,而不是该实体的关系模式中。

多值属性在转换时通常会单独处理,放在新的关系模式中,而复合属性、派生属性和简单属性一般直接放在实体对应的关系模式中,所以选B。

5._____将具有相同特征的实体集组合成一个更高层次的实体集。

上定义

所以选B概化。

6.SQL语言使用______语句从表中删除一列。

在 SQL 中,使用 Alter 语句的相关语法来删除表中的列,Delete 用于删除行,Drop 用于删除表或其他数据库对象,Update 用于更新数据,选A。

7.在 SQL 中,______是与 "IN" 等价的运算符。

前面有解释,选D。

8.______会从 Stud 表中删除在 SC 表中有课程的行?

和上题差不多,选C。

9.下列语句中错误的是?

在关系数据库中,一列中的值必须来自相同的域,而不是不同的域,所以选D。A 选项,投影运算符∏在功能上与 SQL 中的 "Select" 子句有相似之处,是正确的;B 选项,关系中列的顺序确实是可以改变的,不影响关系的本质,是正确的;C 选项,一个视图可以在定义另一个视图的表达式中使用,是正确的。

10.____确保一旦一个事务已提交,即使发生系统故障,该事务的更新也不会丢失。

再丢这个图,这次加个英文

所以选Duration持久性也就是D。

11.调度必须是_______,以确保如果事务 Ti 看到事务 Tj 的影响,而 Tj 随后中止,那么 Ti 也会中止。

可恢复的调度才能保证在这种情况下 Ti 也会中止,无级联调度主要是防止级联回滚;可串行化调度强调与串行执行结果的等价性;冲突可串行化调度是可串行化调度的一种更严格的形式,选A。

12._____仅在事务结束时释放排它锁,不要求共享锁仅在事务结束时释放。

先看课本

没说共享锁相关的事情啊,再去查wiki,wiki这么说

所以选C。

13.关于两段锁协议确保无死锁的说法哪个是正确的?

上面课本上说了

所以选B。

14.当________时,一个事务被认为已提交。

当事务的最后一条日志记录已输出到稳定存储时,事务被认为已提交,因为这样能保证即使系统出现故障,提交的信息也不会丢失。所有更新记录在日志中、所有写操作完成都不能完全确定事务已成功提交,所有更新回滚则是事务失败的情况,三短一长选最长嘛答案选A。

15.如果应用程序不依赖于数据库的物理模式,并且在物理模式更改时不需要重写,那么它们被称为具有______

顾名思义,不依赖域物理模式那就是具有物理独立性呗,选C。

16.数据字典是______

数据字典是包含数据库元数据的特殊类型的表,它不是用于存储用户数据或 DML 输出的,虽然由 DBA 管理但不是简单的包含元数据且可更新,它有特定的结构和用途,选A。

17.授权语句:'grant select on department to Amit, Satoshi;'成功执行后,_______。

语句授予了 Amit 和 Satoshi 对 department 表的查询权限,所以他们可以读取表中的所有记录,不能进行更新、删除或修改模式等操作,所以选D。

18.插入语句 "insert into instructor (id, name, dept_name, salary) values ('12123','Kate',' ', 32767)" 会向表 takes 中插入_____。

根据触发器的定义,当插入的 dept_name 为空时,会将其设置为 null,所以插入的值会变为'12123','Kate', null, 32767,所以选B。

19.以下哪个语句是错误的?

如果一个关系在 3NF 中,不一定在 BCNF 中,BCNF 是比 3NF 更严格的范式,A 选项关系模式 R 满足所有属性域为原子则在 1NF 是正确的;B 选项 3NF 和 BCNF 的关系都在 1NF 是正确的;C 选项在 BCNF 中的关系一定在 3NF 是正确的,所以选D。

20.在以下关于函数依赖的规则中,______是正确的。

跟上面的推法一致,选C。

Question 2 写关系代数表达式和SQL语句

已知下面这样一个数据库

text 复制代码
Person(driver_id, name, address);
Car(license_plate, model, year);
Accident(report_no, year, location);
Owns(driver_id, license_plate);
Participated(report_no, license_plate, driver_id, damage_amount);

1.写关系代数表达式和SQL语句查询所有拥有2010年或之后生产的汽车且居住在"New York"的客户的姓名。

关系代数表达式

π n a m e ( σ y e a r > = 2010 , a d d r e s s = ′ N e w Y o r k ′ ( P e r s o n ⋈ O w n s ⋈ C a r ) ) \pi_name(\sigma_{year>=2010,address='New York'}(Person⋈Owns⋈Car)) πname(σyear>=2010,address=′NewYork′(Person⋈Owns⋈Car))

SQL语句
sql 复制代码
SELECT name
WHERE year>=2010 and address='New York'
FROM Person natural join Own natural join Car;

2.写关系代数表达式和SQL语句查询名为"Smith"的司机所拥有的汽车的车牌。

关系代数表达式

π l i c e n s e p l a t e ( σ n a m e = ′ S m i t h ′ ( P e r s o n ⋈ O w n s ) ) \pi_{license_plate}(\sigma_{name='Smith'}(Person⋈Owns)) πlicenseplate(σname=′Smith′(Person⋈Owns))

SQL语句
sql 复制代码
SELECT license_plate
WHERE name='Smith'
FROM Person natural join Owns;

3.写关系代数表达式和SQL语句查询2021年从未发生过任何事故的这些人员的姓名和司机编号。

先取所有的司机,再减去2021年出过事故的司机的信息。

关系代数表达式

π n a m e , d r i v e r i d ( P e r s o n ) − π n a m e , d r i v e r i d ( σ y e a r = 2021 ( P e r s o n ⋈ P a r t i c i p a t e d ⋈ A c c i d e n t ) ) \pi_{name,driver_id}(Person)-\pi_{name,driver_id}(\sigma_{year=2021}(Person⋈Participated⋈Accident)) πname,driverid(Person)−πname,driverid(σyear=2021(Person⋈Participated⋈Accident))

SQL语句
sql 复制代码
SELECT name,driver_id
FROM Person
WHERE driver_id not in(
	SELECT driver_id
	WHERE year=2021
	FROM Participated natural join Accident
	);

4.用SQL语句找出2021年事故发生次数最多的地点

sql 复制代码
Select location
From accident 
Where year=2021
Group by location
Having count(report_no) >=all
(select count(report_no) from accident group by location);

5.用SQL语句查询2021年至少发生两次事故的司机编号和人员姓名

sql 复制代码
Select driver_id, name
From Person as S
Where not unique
 (select report_no 
from Accident as A natural join Participated as P 
where P.driver_id=S.driver_id and A.year=2021);

6.用SQL语句将2021年在"Wushan"发生的事故中车牌为"SCAU888"的汽车的损坏金额增加10%

sql 复制代码
Update Participated
Set damage_amount=damage_amount*1.1
Where license_plate="SCAU888" and report_no in 
(select report_no from Accident where year=2021 and location="Wushan");

7.用SQL语句查询拥有2015年之前生产的汽车且地址中包含"New"的司机的姓名和地址

主要关注模糊匹配用%代表任意字符串而且不能用=要用like

sql 复制代码
SELECT name,address
WHERE year<2015 and address like '%New%'
FROM Person natural join Owns natural join Car;

8.用SQL语句将所有在"Beijing"发生的事故的损坏金额更新为原来的两倍,但如果损坏金额超过5000元,则只更新为5000元

主要关注条件判断的语法

sql 复制代码
UPDATE Participated
SET damage_amount = CASE 
    WHEN damage_amount * 2 <= 5000 THEN damage_amount * 2
    ELSE 5000
    END
WHERE license_plate = 'SCAU888' AND report_no IN (
    SELECT report_no
    FROM Accident
    WHERE location = 'Beijing' AND year = 2021
);

Question 3 画E-R图以及写关系模式

一篇论文具有属性:ID(编号)和标题(title)。一本期刊具有属性:ID(编号)、名称(name)、影响因子(factor)和类别(category)。一位作者具有属性:ID(编号)、名字(first name)、姓氏(last name)、头衔(title)和电子邮件(email)。一项资助具有属性:ID(编号)、标题(title)、机构(agency)和年份(year)。一篇论文可以由多位作者撰写,一篇论文必须至少有一位作者。一篇论文只能在一本期刊上发表。如果一篇论文被发表,那么像年份(year)、卷(volume)、期(issue)、页码(page)等出版信息必须记录在数据库中。一位作者可以得到多项资助,而一项资助必须恰好支持一位作者。

1.绘制E-R图来说明上述数据库要求

之前好像忘记丢了,丢一个图例在这里

2.将你的E-R图转换为关系数据库模式,并指出主键和外键。

text 复制代码
Journal (id, name, factor, category) primary key:id
Paper (id, title) primary key:id
Publish (J_id, P_id, volume, issue, page) primary key:J_id,foreign key: J_id reference Journal:id, P_id reference paper:id
Author (id, first_name, last_name, title, email) primary key:id
Funding (id, title, agency, year, sup_author_id)  primary key:id foreign key: sup_author_id reference author:id,
write(P_id, Au_id)  primary key:P_id, Au_id, foreign key: P_id reference paper:id, Au_id reference author:id

Question 4 关系模式的操作

设 R = A B C D E F R = ABCDEF R=ABCDEF 是一个关系,函数依赖集 F = { A B → C D , D → C , D E F → A B , D E → B , A C → D C } F = \{AB \to CD, D \to C, DEF \to AB, DE \to B, AC \to DC\} F={AB→CD,D→C,DEF→AB,DE→B,AC→DC} 在 R R R 上成立。

1.列出关系R的所有候选键

候选键就是要找尽可能少的字母,使得这些字母根据上面给定的函数依赖能推出剩下的所有字母

这一题的所有候选键就是DEF, ABEF, ACEF

2.函数依赖 A C → B AC \to B AC→B 在 R R R 上是否成立,解释原因。

就看嘛,AC能推出D,其他的字母都没法通过上面的函数依赖推出来,所以这个B也不成立

说的更正式一点的话就说 { A C } + \{AC\}^{+} {AC}+计算出来为 { A C D } \{ACD\} {ACD}, B B B不在这个集合内所以不成立。

3.给出仅进行一次BCNF分解的 R R R的分解。

AB→CD是导致违反BCNF的一个函数依赖,因为它不是平凡函数依赖,而且AB并非候选键。因此,关系R可分解为{R1(ABCD),R2(ABEF)}这两个关系。

4.给出关系R的第三范式(3NF)分解,并列出计算其正则覆盖的主要步骤

F = {AB→CDD→CDEF→ABDE→BAC→DC}

AB→CD中,C是冗余的,因此F等价于{AB→DD→CDEF→ABDE→BAC→DC}。

DEF→AB中,鉴于DE→BB是冗余的,所以F等价于{AB→DD→CDEF→ADE→BAC→DC}。

AC→DC中,由于D→CC是冗余的,于是F等价于{AB→DD→CDEF→ADE→BAC→D}。

那么一个正则覆盖可以是F_C = {AB→DD→CDEF→ADE→BAC→D}。

然后关系R的第三范式分解可以是:

{ABDACDBDEADEF}

Question 5 事务管理

Part 1

考虑如下具有三个事务( T 0 T_0 T0、 T 1 T_1 T1、 T 2 T_2 T2)的调度,这些事务在数据库中对四个数据项(A、B、C、D)进行操作,初始值分别为:A = 1000,B = 2000,C = 600,D = 200。

事务 操作
T 0 T_0 T0 Read(A); Read(B); Read(C)
T 1 T_1 T1 Read(B); Read(C); C : = C − 100 C := C - 100 C:=C−100; D : = D + 100 D := D + 100 D:=D+100
T 2 T_2 T2 A : = A − 50 A := A - 50 A:=A−50; B : = B − 500 B := B - 500 B:=B−500; Write(C)
T 3 T_3 T3 B : = B + 50 B := B + 50 B:=B+50; C : = C + 500 C := C + 500 C:=C+500; Write(A); Write(B); Write(B); Write(C)
1.解释串行调度和可串行化调度之间的区别

2019年最后一题

2.给出一种并发执行产生可串行化调度的场景,且事务提交顺序不同于串行化顺序

Part 2

现在假设在上述调度执行过程中,系统在执行完事务 T 1 T_1 T1的操作后崩溃了,并且在崩溃前刚刚完成了一个检查点(checkpoint)操作,同时假设在崩溃前日志(log)包含了以下记录:

事务 操作
T 0 T_0 T0 start
T 0 T_0 T0 Read(A)
T 0 T_0 T0 Read(B)
T 0 T_0 T0 Read(C )
T 1 T_1 T1 start
T 1 T_1 T1 Read(B)
T 1 T_1 T1 Read(C)
T 1 T_1 T1 C : = C − 100 C := C - 100 C:=C−100
T 1 T_1 T1 D : = D + 100 D := D + 100 D:=D+100
T 2 T_2 T2 start
T 2 T_2 T2 A : = A − 50 A := A - 50 A:=A−50
T 2 T_2 T2 B : = B − 500 B := B - 500 B:=B−500
3.解释检查点技术(checkpoint technology)
  • 将当前驻留在主内存中的所有日志记录输出到稳定存储中。
  • 将所有已修改的缓冲区块输出到磁盘。
  • 将形如的日志记录输出到稳定存储中,其中L是检查点时处于活动状态的事务列表。
4.描述在重做阶段(Redo Pass)中撤销列表(Undo List)的变化

在重做阶段,撤销列表最初包含事务T1和T2;当找到T2的提交日志记录时,将T2从撤销列表中移除,而当找到T3的开始日志记录时,将T3添加到撤销列表中。当找到事务T1的中止日志记录时,将T1从撤销列表中移除,最终撤销列表中仅剩下T3。

5.展示在恢复过程中应该添加的日志记录。
text 复制代码
<T3, D,300>
<T3, abort>
6.列出完成恢复后B、C和D的最终值。

B = 2050,C = 600,D = 300 。

相关推荐
m0_748252231 分钟前
万字详解 MySQL MGR 高可用集群搭建
android·mysql·adb
Aimin20227 分钟前
Kali系统(Debian 10.3) 遇到的问题
数据库·mysql·debian
Run Out Of Brain10 分钟前
使用systemd管理MySQL服务器
服务器·数据库·mysql
老大白菜34 分钟前
掌握机器学习与MySQL集成实战Ruby和JavaScript辅助Redis缓存策略
mysql·机器学习·缓存
小怪兽ysl38 分钟前
【Oceanbase数据库常用巡检SQL】
数据库·sql·oceanbase
qq_420482631 小时前
飞书机器人告警实现
服务器·数据库·飞书
东方未明01081 小时前
Redis(三)单线程架构介绍
数据库·redis·数据库架构·单线程架构
代码的奴隶(艾伦·耶格尔)1 小时前
redis(1)
数据库·redis·缓存
q567315231 小时前
Django外键模型未保存引用
数据库·django·sqlite
꧁坚持很酷꧂1 小时前
Qt天气预报系统界面关闭
开发语言·数据库·qt