简答题由十道变为五道,但是题量和难度都显著增大,由一道题一两句话变为一道题分点条列一整段话,考察的知识点都还可以不算很偏,比如两阶段协议是什么,以及为什么要有严格两阶段锁和强两阶段锁
-
国产数据库有哪些?
(1)OceanBase
(2)PolarDB
(3)人大金仓
(4)华为云原生数据库
-
实体:是现实世界中可区别于所有其他对象的一个“事物”或“对象”
实体集:是相同类型即具有相同性质的实体的集合
联系:是指多个实体之间的相互关联
联系集:相同类型的联系的集合
联系集的度:参与联系集的实体集的数目
-
模式:数据库的总体逻辑设计,数据库的逻辑结构,它分为物理模式、逻辑模式、子模式(视图层)
实例:特定时刻存储在数据库中的信息的集合被称作数据库的一个实例
-
数据库的三级抽象层次
物理层:描述数据实际上是怎样存储的
逻辑层:描述数据库中应该存储什么样的数据以及这些数据间的关系
视图层:计算机用户看见的是为其屏蔽了数据类型细节的一组应用程序,还提供防止用户访问数据库的某些部分的安全机制
-
文件处理系统中存储组织信息的主要弊端(7条):
数据的冗余和不一致、数据访问困难、数据孤立、完整性问题、原子性问题、并发访问异常、安全性问题
-
简述数据库系统和文件系统的主要区别:
这两个系统都包含了数据集合和一组程序。数据库协调数据的物理和逻辑访问,文件系统只能协调物理访问。
数据库系统通过确保所有程序都可以使用一块物理数据来减少数据重复的数量,而在文件系统中的一个程序的数据在写的时候可能无法被另一个程序所读取。
数据库系统被设计允许对数据进行灵活的访问(即查询),文件系统的设计目的是为了允许预先确定的访问(即编译程序)。
数据库管理系统被设计用来协调多用户管理相同的数据;文件处理系统通常被设计成允许一个或多个程序同时访问相同的数据,在文件系统中,只有当两个程序对文件操作权限都是只读的时候才可以同时访问。
-
数据管理系统(DBMS)的组成:一个相互关联的数据的集合+一组用以访问这些数据的程序数据管理系统的主要目标:提供一种方便、高效的存取数据库信息的途径
-
数据模型:一个描述数据、数据联系、数据语义以及一致性约束的概念工具的集合。
分类:
(1)关系模型
(2)实体-联系模型
(3)基于对象的数据模型(XML):允许相同类型的数据项含有不同的属性集的数据定义
(4)半结构化数据模型
-
数据库语言分类
答:
DDL:create alter drop
DML:insert delete select update
DCL:grant revoke
其中数据库操纵语言DML又分为过程化DML(指明需要的数据和如何获取这些数据)和声明式DML(不说明如何获取)
-
关系代数中,与等值连接相比,自然连接的缺点是什么(简述等值连接和自然连接的异同)
自然连接是在笛卡尔积的基础上保留相同属性下取值相同的元组进行合并,并将元组中不匹配的属性置为null
等值连接可以在笛卡尔积的基础上通过on自由选择比较的属性(显式指定连接条件)
-
Inner Join与Outer Join的区别
两种连接都自动匹配同名项
当有不匹配项目时,内连接丢弃不匹配的值,外连接则保留不匹配的项并对应地置为null
Inner Join在不指定连接条件时相当于笛卡尔积
-
数据库中,实体的完整性是如何被保证的?
答:
(1)not null
(1)Unique
(3)Check
(4)参照完整性(外键,删除/更新时级联)
-
数据库中数据值的一致性约束
(1)域约束
(2)参照完整性
(3)断言
(4)授权
-
表达数据库一致性约束的方式
主键、函数依赖、Check、断言、触发器
-
SQL基本类型
固定长度字符类型char(n); 可变长度字符类型varchar(n)
int; smallint
numeric(p, d):定点数一共p位,小数点右边d位
real; double precision:浮点数、双精度浮点数
float(n):精度至少为n的浮点数
- SQL中的日期和时间类型
答:date:年、月、日
Time:时、分、秒
Timestamp:年、月、日、时、分、秒
Interval:一段时间
-
说明SQL中drop table r和delete from r的区别
drop从数据库中删除关系r的所有信息,删除整个表
delete删除关系r中的所有元组,但是保留关系r
-
From R,(子查询)
from子句嵌套的子查询中不能使用来自from子句其它关系的相关变量
加入lateral作为前缀,可以访问from子句中在它前面的表或子查询中的属性。
-
说明select中distinct的作用
删除查询结果中的重复行
-
说明where和having的区别
(1)where是元组限定条件,作用于整个关系的元组
(2)having是分组限定条件,作用于每一个分组
(3)having不能单独使用,必须在group by语句之后,而where在group by语句之前
-
where子句后子查询的作用
(1)测试集合成员(in, not in)
(2)集合的比较(all, some)
(3)测试集合是否存在空关系(exists, not exists)
(4)测试集合是否存在重复元组(unique)
-
Group by子句后的属性:
答:出现在select中的属性(除聚集函数之外),必定出现在group by中
-
简述空值的含义
空值表达这个值不存在或未知,未知值可能是缺失或不知道
-
集合运算的条件
(1)两个关系的元数(属性数)相等
(2)属性域相容(对于所有的i,两个关系的第i个属性值均相等)
-
什么是断言
断言是一个谓词,是我们希望数据库总是满足的一个条件
-
写出一个断言,使其满足对于student关系中的每个元组,它在属性中tot_credit的取值必须等于该生所成功修完课程的学分总和
create assertion p check(
not exists ( select *
from student S
where tot_credit <> (select sum(credits)
from takes T, course C
where T.coure_id = C.course_id and T.ID = S.ID
and grade <> 'F' and grade is not null )));
-
什么是索引,常用什么实现
索引是一种用于排序的数据结构,可以加速查询、提高效率
B树或B+树
-
简述用户自定义的类型和域之间的差别。
(1)用户自定义类型是强类型检查,无法定义约束和默认值
(2)用户自定义域是弱类型检查,可以定义约束和默认值
-
clob和blob是什么,它们有什么特点
blob是二进制数据的大对象类型
clob是字符数据的大对象类型
注:它们不存放数据本身,存放的是数据地址指针
-
视图的定义
视图提供了一种隐藏某些数据不让特定用户看到的机制。任何不是概念模型的一部分,但是作为“虚拟关系”呈现给用户的关系,被称为视图
-
with as和视图的区别
with as 等同于一次性视图,只会持续到本条语句结束,之后就不能再被引用。一条语句只能有一个with,但是可以定义多个临时关系
-
视图的特点
(1)只存入视图的定义,不存储计算结果
(2)使用时,首先访问数据字典,找到视图的定义后翻译成表上的查询
(3)视图可以嵌套定义
-
什么是物化视图
创建一个物理表,存储定义视图的查询结果中的所有元组,同时保证如果用于定义视图的实际关系改变,视图也随着改变
-
视图可更新的条件
-
基于多表的视图,可以完成哪些操作,不能完成哪些操作?
答:可以查询、基于此视图定义新的视图等,但是不能更新数据库(insert, update, delete)
-
断言和check约束的区别:
答:check只能在单个关系中进行约束
断言可以在多个表之间进行约束
-
什么是触发器,有什么类型,它们之间有什么区别,何时触发?
定义:触发器是一条语句,当对数据库作修改时它自动被系统执行
分类:元组级触发器,语句级触发器
区别:语句级触发器每执行一条语句只触发一次
元组级触发器每执行一条语句触发多次
-
函数和过程有什么区别
-
数据库中常用的权限:
对于某一个表中数据的权限:
读操作(read)
修改操作(update)
插入操作(insert)
删除操作(delete)
对于数据库当中的对象的权限
Index:可以创建和删除索引
Resoutces: 将常用的权限归结在一起形成一个角色
Alteration:允许对关系当中的某一些属性进行修改
Drop:删除关系
-
SQL标准包括的权限:
答:select,insert,update,delete,all privileges
-
数据库规范化设计的含义
在数据库中减少数据冗余和定义一个规范的表间结构,以更好的实现数据完整性和一致性
-
数据库规范化设计的优点
(1)降低数据存储和维护数据一致性的成本
(2)便于设计合理的关系表间的依赖和约束关系
(3)便于设计合理的数据库结构,以提高数据库系统的整体性能
-
E-R模型的冲突
属性冲突、命名冲突、结构冲突
-
实体之间的联系有哪几种?
答:一对一 多对多 一对多 多对一
-
强实体集和弱实体集
区别:
-
范式分类
答:第一范式:强调的是列的原子性,即列不能够再分成其他几列
第二范式:首先是1NF,另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的类必须完全依赖于主键,不能只依赖主键的一部分;
第三范式:首先是2NF,另外非主键必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列A依赖于非主键B,非主键B依赖于主键的情况。
-
正则覆盖集Fc
1. 不含无关属性
2. 左部唯一
-
判断分解后的关系模式是否合理的两个重要标志
答:无损分解和保持依赖
-
无损连接分解的条件
定义:分解为多个部分后通过自然连接可以恢复的分解称为无损连接分解
判断:R1∩R2是R1或R2的超码
-
3NF范式分解能够保证函数依赖一定能够得到保持的原因
3NF分解中把正则覆盖集中的每个函数依赖作为分解的一个属性集,而正则覆盖集和原函数依赖集等价,因此可以保持函数依赖
-
多值依赖的定义
设有关系模式 R(U),U 是属性集,X, Y, Z 是 U 的子集,并且 Z = U - X - Y。多值依赖 X →→ Y 在 R 上成立,当且仅当对 R 的任意一个满足 X 的值,存在 Y 的一组值,这组值与 X 的值无关,只依赖于 Z 的值。
-
为什么要在数据库中引入事务的概念?
答:事务中的多个操作要么全部执行,要么都不执行。事务的引入可以保证数据库的一致性、完整性,处理多用户访问和故障恢复的问题
-
事务的ACDI特征
答:原子性,一致性,隔离性,持久性
原子性:事务是不可分割的,要么执行全部内容,要么根本不执行
一致性:在没有其他事务并发执行的情况下,保持数据的一致性
隔离性:每个事务都感觉不到系统中有其他事务在并发地执行
持久性:一个事务成功完成之后,它对数据库的改变必须是永久的,即使出现系统故障
-
事务的状态:
答:活动的、部分提交的、失败的、中止的、提交的
-
如果张三想通过汇款的方式转给李四200元。张三的账户已经减掉200美元后系统发生故障,并没有在李四账户中增加200美元,请问数据库出现了什么样的状态?事务现在是一种什么状态?这个问题该怎么解决?数据库通过什么手段实现该操作?
(1)数据库处于不一致的状态,事务处于失败的状态
(2)应该进行事务回滚,即将张三账户中减掉的200美元再加回来
(3)利用日志实现
-
冲突可串行化:如果调度可以经过一系列非冲突指令交换转换成串行调度,那么我们说是冲突可串行化的
视图可串行化:如果某个视图调度等价于一个串行调度
冲突可串行化和视图可串行化都是调度可串行化的充分非必要条件,
冲突可串行化调度一定是视图可串行化调度
-
为什么要对数据库调度进行可串行化判断/调度(优先图无环)
在并发执行中,通过进行可串行化判断,即保证所执行的任何调度的效果都与没有并发执行的调度效果一样,可以确保数据库的一致性
-
可恢复调度
对于每对事务Ti和Tj,若Tj读取了由Ti之前所写过的数据项,则Ti的提交操作出现在Tj的提交操作之前
无级联调度对于每对事务Ti和Tj都满足若Tj读取了先前由Ti所写的一个数据项,则Ti的提交操作必须在Tj读操作之前
-
撤销已提交的事务所造成的影响的唯一方式
执行一个补偿事务
-
两阶段锁协议的作用以及内容。
答:
作用:用来保证冲突可串行化,防止级联回滚
内容:分为两个阶段
第一阶段为增长阶段,只能对事务进行加锁操作,不能进行释放锁的操作
第二阶段为缩减阶段,只能对事务进行释放锁的操作,不能进行加锁操作
-
严格两阶段锁和强两阶段锁
答:严格两阶段锁:在两阶段锁的基础上加上在当前事务提交或回滚之前,不能够释放排他锁。
强两阶段锁:在两阶段锁的基础上加上在当前事务提交或回滚之前,不释放任何锁
-
死锁处理方法
答:死锁预防协议:不让系统进入死锁状态
(1)预声明,每个事务执行前就锁定其所有数据项
(2)预排序,对所有数据项提前部分排序,并要求事务只能按照部分排序指定的顺序锁定数据项
死锁检测+死锁恢复,允许系统进入死锁状态
-
死锁预防:
答:
Wait-die(非抢占),旧事务等待新事务
Wound-wait(抢占),新事务等待旧事务
-
死锁恢复:
答:解除死锁最通常的做法是回滚一个或多个事务。
根据“最小代价”选择牺牲者,对选择的牺牲者进行彻底或部分回滚
为了避免饿死,我们需要规定每个事务被当作牺牲者的次数上限。
-
为什么要在数据库中设置多种不同粒度的锁?
答:
(1)不同粒度的锁能满足不同事务对不同数据(表、行等)的操作需求,避免不必要的锁冲突,提高系统并发处理能力
(2)多种粒度的锁提供了权衡空间,可根据实际需求选择,来平衡系统的开销
-
如何降低数据库中数据的冗余度?
答:设计选择更小的模式;选择合适的范式
-
简述数据库中为何要进行并发控制?
答:当多个事务在数据库中并发地执行时,数据的一致性可能不再维持,系统有必要控制各事务之间的相互作用。
并发控制机制存在的目的是为了获得高度的并发性,同时保证所产生的调度是冲突可串行化或视图可串行化的、可恢复的,最好是无级联的。
-
举例说明数据库中死锁含义及其解决方法。
答:事务之间相互等待对方所占用的资源。
解决方法是两个死锁事务回滚其中的一个。