数据库

概述

概念

数据:数据库中存储的基本对象

数据库(DataBase,DB):长期存储在计算机内,有组织的、可共享的大量数据的集合

数据库管理系统(DataBase Management System,DBMS):数据定义、数据组织、存储和管理

数据定义语言(Data Definition Language,DDL

数据操纵(Data Manipulation Language,DML):增删改查

数据库系统(DataBase System,DBS):数据库+数据库管理系统+应用系统+数据库管理员

数据库管理发展阶段

  1. 人工管理
    • 数据不保存
    • 应用程序管理数据
    • 数据不共享
    • 数据不具有独立性
  2. 文件系统
    • 数据可以长期保存
    • 由文件系统管理数据
    • 共享性差、独立性差
  3. 数据库系统
    • 数据结构化
    • 数据共享性高、冗余度低、易扩充
    • 数据独立性高
    • 数据由DBMS统一管理和控制

数据模型

数据模型(Data Model):对现实世界数据特征的抽象

  1. 概念模型:也称信息模型,主要用于数据库设计
  2. 逻辑模型:主要用于DBMS的实现
  3. 物理模型:数据在计算机硬件上的存储方式

组成要素:

  1. 数据结构
  2. 数据操作
  3. 完整性约束
    1. 实体完整性:主属性非空且唯一(主键)
    2. 参照完整性:关系间的引用(外键)
    3. 用户定义完整性:用户定义的取值范围

三级模式

  • 外模式(应用模式):展示给用户的数据
  • 模式(概念模式):数据库里存的数据
  • 内模式(物理模式):物理硬盘中存的数据

各个模式之间数据的转换叫映像

关系型数据库

概念

关系:二维表

域(Domain):取值范围

笛卡尔积:不同域之间所有排列组合的集合

元组(Tuple):表里的一条数据

基数:笛卡尔积里包含的组合的数量

码(键):

  • 候选码:能够唯一标识关系中每一行(元组)的最小属性集合
  • 全码:需要所有的属性才能唯一确定一条记录
  • 主码:从候选码中选出来的一个
  • 主属性:包含在任何一个候选码中的属性
  • 非主属性:不属于任何候选码
  • 关键字:唯一标识行的属性集合,包括超键、候选码、主键、外键等

✨基本操作

对行运算

  • 并:两张要有同样的属性,并后会去重

  • 差:两张要有同样的属性,在第一张表不在第二张表的数据

  • 交:两张要有同样的属性,在第一张表且在第二张表的数据

  • 笛卡尔积:

对列运算

  • 选择:选择符合条件的元组(行)

  • 投影:选出若干属性组成新的关系,会去重

  • 连接:

    • 一般连接

    • 等值连接

    • 自然连接

    • 外连接:不符合条件的元组也保留,没有的值为NULL

    • 左(右)外连接:只保留左(右)不符合条件的元组

  • 除:

    a1的像集把S中的B、C都包括了

SQL

模式

一个模式下可以包含多张表,视图和索引等数据库对象

1
2
3
4
5
6
7
# 定义模式给某个用户
create schema <模式名> authorization <用户名>;

# 删除模式
drop schema <模式名> <cascade | restrict>;
cascade: 把数据库对象也一起删了
restrict: 如果模式下有表、视图等,则不执行删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建表
create table <表名> (
<列名> <数据类型> [完整性约束],
...
);

# 修改表
alter table <表名>
[add column <列名> <数据类型> [完整性约束]]
[drop column <列名> <cascade | restrict>]
[alter column <列名> <数据类型>];

# 删除表
drop table <表名> <cascade | restrict>;
cascade: 直接删
restrict: 有被其他表约束所引用、有视图、有触发器等就不能删

数据类型

数据查询

  • distance: 消除查询出来的重复行

聚合函数

  • 除了count(*),其他聚合函数都会跳过空值
  • 聚合函数只能用于select子句和group by中的having子句
  • having用于分组后按要求对这些组进行筛选
  • order by不能在子查询的select中使用

集合查询

  • union:并
  • intersect:交
  • except:差

索引

1
2
3
4
5
6
7
8
9
# 创建索引
create [unique] [cluster] index <索引名>
on <表名>(<列名> [asc | desc], ...);
unique: 表明此索引的每一个索引值只对应唯一的数据记录
cluster: 聚簇索引
# 修改索引名
alter index <旧索引名> rename to <新索引名>;
# 删除索引
drop index <索引名>;

视图

从一个或几个基本表中导出的表

1
2
3
4
5
6
7
8
9
10
# 建立视图
create view <视图名>(列名, ...)
as <子查询>
[with check option];
with check option: 对视图的增删改也要满足子查询的条件
# 删除视图
drop view <视图名>[cascade]
cascade: 即使有视图上的视图也能删除
# 删改查视图
# 同表操作一样

数据库安全性

用户身份鉴别

  1. 静态口令(密码)
  2. 动态口令(短信验证)
  3. 生物特征(指纹)
  4. 智能卡

存取控制

  1. 自主存取控制(DAC)

    用户对于不同的数据库有不同的权限

    不同的用户对同一对象也有不同的权限

  2. 强制存取控制(MAC)

    每一个数据库对象都被标以一定的密级

    只有有相应级别的用户才能访问

1
2
3
4
5
6
7
8
9
10
11
# 自主存取控制方式
# 赋予权限
grant <select | update | insert | delete | all privileges>, ...
on <table | view | ...> <表名>
to <用户名>
# 收回权限
revoke <select | update | insert | delete | all privileges>, ...
on <table | view | ...> <表名>
from <用户名> <cascade | restrict>
cascade: 把这个用户赋给其他用户的权限也回收
restrict: 只回收这个用户的权限

数据库完整性

是指数据的正确性和相容性

  • 正确性:反映现实的实际状况
  • 相容性:同一对象在不同关系表中的数据是符合逻辑的

实体完整性

1
primary key: 定义主键

参照完整性

1
foreing key(外键名) references 表名(列名): 定义外键

用户定义完整性

1
2
3
not null: 非空
unique: 唯一
check(条件): 检查值是否符合条件

关系数据理论

范式

范式 说明 解决的异常
第一范式(1NF) 每一个分量必须是不可再分的数据项
第二范式(2NF) 非主属性没有部分依赖 消除了更新异常
第三范式(3NF) 非主属性没有传递依赖 消除了部分的插入和删除异常
BCNF 所有主属性对每一个不包含它的码也是完全函数依赖

依赖

  • 函数依赖:x值确认后,能够唯一的确认出y。记作x -> y
  • 非平凡依赖:x -> y, 但y ∉ x
  • 平凡依赖:x -> y, 但y ∈ x
  • 完全函数依赖:x -> y,且x的真子集都推不出y
  • 传递依赖:x -> y, y -> z, y 推不出 x, 则x -> z

规范化

模式可能存在的问题:

  1. 数据冗余
  2. 更新异常:没更新全部数据导致数据不一致
  3. 插入异常
  4. 删除异常

数据库设计

数据库设计6个阶段

  1. 需求分析

    最困难,最耗时,数据字典

  2. 概念结构设计

    E-R图

  3. 逻辑结构设计

    关系模式设计、表、规范化处理

  4. 物理结构设计

    设置索引

  5. 数据库实施

  6. 数据库运行和维护

各子系统的E-R图间的冲突

  1. 属性冲突

    取值范围、单位不一致

  2. 命名冲突

    同一意思在不同的表里名字不一样,或者意思不一样但名字一样

  3. 结构冲突

    一个对象在有的表里是属性,有的表里是对象;同一个对象在不同表里属性不同;实体间联系在不同的E-R图为不同类型

并发控制

ACID

  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性

数据不一致问题

  1. 丢失数据

    事务一起提交,其中一个被覆盖

  2. 读“脏”数据

    事务1修改数据后,事务2读取,事务1回滚,导致事务2读取的是脏数据

  3. 不可重复读

    事务1读取某一行后,事务2进行了修改,事务1再次读取与前一次的结果不一致

  4. 幻读

    事务1读取一些数据,事务2添加/删除了一部分数据,事务1再次读取与前一次的结果不一致

封锁

排它锁(写锁、X锁);共享锁(读锁、S锁)

  1. 一级封锁协议(解决丢失数据):修改数据前加X锁事务结束后释放
  2. 二级封锁协议(解决读脏数据):读取数据前加S锁读完后释放
  3. 三级封锁协议(解决不可重复读):读取数据前加S锁事务结束后释放

活锁死锁

活锁:加锁无限等待,可用先来先服务解决

死锁的预防:

  • 一次封锁法:将要使用的数据一次全部加锁
  • 顺序封锁发:对数据对象规定一个封锁顺序

死锁的诊断和解除:

  • 超时法:一个事务等待时间过长就认为发生死锁
  • 等待图法:事务间等待的有向图,若出现环路则为死锁

死锁的解除:

​ 撤销一个处理死锁代价最小的事务

意向锁

如果对一个节点加意向锁,说明该节点的下层节点正在被加锁

  • 意向共享锁(IS锁):拟向下层节点添加S锁
  • 意向排它锁(IX锁):拟向下层节点添加X锁
  • 共享意向排他锁(SIX锁):先加S锁,再加IX锁,表示要读整个表,并更新个别元组

意向锁作用:多粒度封锁提高了并发性,减少了加锁和解锁的开销

关系模式题型

求候选键

步骤:

  1. 分为L(仅出现在左)、R(仅出现在右)、N(都没出现)、LR(两边都出现)
  2. 令X = L ∪ N,如果X能推出全集,就是候选键(结束)
  3. 上一步推不出:从LR中选一个和X组合,若能推出全集,就是候选键
  4. 把第三步选择的去掉后:从LR选两个和X组合
  5. 一般最多只选到两个

求最小函数依赖集

步骤:

  1. 分解右侧为单属性
  2. 消除冗余函数依赖
  3. 消除左侧冗余属性

规范化程度

范式 条件
1NF 所有属性值都是原子
2NF 所有非主属性必须完全依赖候选键(部分依赖)
3NF 非主属性不能传递依赖候选键(传递依赖)
BCNF 函数依赖的左侧必须是超键

步骤:

  1. 求出候选键
  2. 判断部分依赖
  3. 判断传递依赖
  4. 左边都是候选键 –>BCNF

判断无损连接

步骤:

  1. 求出最小函数依赖集
  2. 根据最小函数依赖集推表格

分解为3NF

  1. 基于最小函数依赖集构建子关系模式
  2. 强制包含候选键的关系模式(加一个就行)
  3. 合并冗余表(把被包含的去掉)

分解为BCNF

步骤:

  1. 确定候选键
  2. 检查违反BCNF的依赖
  3. 分解关系,如果分解后仍然不满足需要继续分解

简答题

  1. 什么是数据、数据库、数据库管理系统、数据库系统

    1
    2
    3
    4
    数据(Data):数据是数据库中存储的基本对象
    数据库(Database):数据库是长期存储在计算机内、有组织的、可共享的大量数据集合
    数据库管理系统(DBMS):数据库管理系统是一种软件系统,用于管理和组织数据库,确保数据库的安全性和完整性,提供对数据的存储、访问、处理和保护等功能,支持多个用户同时或不同时刻对数据库进行操作
    数据库系统(DBS):数据库系统指在计算机系统中引入数据库的系统,由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员构成
  2. 什么是事务,事务的特征,事务和程序的区别

    1
    2
    3
    4
    5
    6
    7
    事务:事务是用户定义的数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
    事务的特征:
    原子性:要么全部成功,要么全部失败
    一致性:事务执行前后,数据库必须保持一致性状态
    隔离性:多个并发事务的执行是相互隔离的,一个事务的操作不会影响其他事务
    持久性:一旦事务提交成功,其对数据库的修改就是永久性的,即使系统发生故障也不会丢失
    事务和程序的区别:一个事务可以是一条或一组SQL语句;一个应用程序通常包含多个事务
  3. 什么是计算机系统完整性,完整性约束对象作用的对象是

    1
    2
    3
    4
    5
    完整性:数据的正确性和相容性,防止不合语义的数据进入数据库
    作用对象:
    列:对属性的取值类型、范围、精度等的约束条件
    元组:对元组各个属性列间的联系的约束
    关系:对若干元组、关系之间以及关系集合上的联系的约束
  4. 什么是封锁,什么是排它锁和共享锁

    1
    2
    3
    封锁是数据库管理系统中用于实现并发控制的一种机制,它允许事务在操作数据之前对数据对象加锁
    排它锁:排它锁是一种独占锁,当一个事务对数据对象加排它锁后,其他事务既不能读取也不能修改该数据对象,直到锁被释放
    共享锁:共享锁是一种非独占锁,当一个事务对数据对象加共享锁后,其他事务可以读取该数据对象,但不能修改它,直到锁被释放
  5. 数据库设计的基本步骤

    1
    2
    3
    4
    5
    6
    需求分析
    概念结构设计
    逻辑结构设计
    物理结构设计
    数据库实施
    数据库的运行和维护
  6. 什么是活锁和死锁

    1
    2
    活锁:某些事务可能因为优先级低或其他原因,始终无法获得资源,导致事务无法完成,处于永久等待状态
    死锁:指两个或两个以上的事务分别请求封锁对方已经封锁的数据,导致循环等待而无法继续运行下去
  7. 简述关系数据库规范化理论,并给出2NF,3MF、BCNF的定义

    1
    2
    3
    4
    规范化理论是以关系模型为背景,进行数据库逻辑设计的有力工具。其逐步消除数据依赖中不合适的部分,使关系模型中的各个关系模式达到某种程度的分离
    2NF: 所有非主属性都完全函数依赖于主码
    3NF: 所有非主属性都不传递依赖于主码
    BCNF: 对于每一个非平凡的函数依赖 X → Y,X 必须是超键
  8. 简述数据库体系结构及其数据独立性的关系

    1
    2
    3
    4
    5
    数据库体系结构可以概括为三级模式和二级映像,三级模式分别为外模式、模式和内模式,二级映像为外模式/模式映像、模式/内模式映像。
    外模式是数据库与外部应用程序对应的局部逻辑描述,一个数据库可以有多个外模式;
    模式是数据库整体逻辑结构的描述,一个数据库对应一个模式;
    内模式是数据库存储及物理环境相关的逻辑描述,一个数据库对应一个内模式;
    数据的独立性分为逻辑独立性和物理独立性。逻辑独立性是指外部的应用程序不会因为数据库逻辑结构的改变而改变,是由外模式/模式映像支持的;物理独立性是指外部应用程序不必因为数据库内部存储结构的改变而改变,是由模式/内模式映像支持的
  9. 试给出二级封锁协议的内容并举例说明其如何解决读脏数据问题

    1
    2
    一级封锁协议:事务T在修改数据R之前必须对其加X锁,直到事务结束才释放;
    二级封锁协议:在一级基础上,事务T在读取数据R之前必须先对其加S锁,读完释放
  10. 数据库系统管理数据的主要特点

    1
    2
    3
    4
    数据结构化;
    数据独立性高;
    数据共享性高、冗余度低、易扩充;
    数据由DBMS统一管理和控制
  11. 简述并发操作的可串行性

    1
    DBMS对并发事务不同的调度可能会产生不同的结果,当且仅当其结果和按某一次序串行的执行这些事务时的结果相同时,多个事务的并发执行是正确的。称这种调度策略为并发执行的可串行性,这也是判断并发调度策略正确与否的唯一标准
  12. 关系数据库管理系统的数据字典存储哪些内容

    1
    2
    数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程5个部分。
    其中,数据项是数据的最小组成单位,若干个数据项可以组成一个数据结构,数据字典通过对数据项和数据结构的定义来描述数据流、数据存储的逻辑内容
  13. 数据字典的作用是什么

    1
    数据字典是关于数据库中数据的描述,在需求分析阶段建立,是下一步进行概念设计的基础,并在数据库设计过程中不断修改、充实和完善
  14. 试描述DBMS查询优化的一般准则

    1
    2
    3
    4
    5
    6
    1.选择运算应尽可能先做
    2.把投影运算和选择运算同时进行
    3.把投影同其前或后的双目运算结合起来执行
    4.把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算
    5.找出公共子表达式
    6.选取合适的连接算法
  15. 三类完整性约束是什么

    1
    2
    3
    1.实体完整性:基本关系的所有主属性都不能取空值
    2.参照完整性:在两个关系之间建立联系时,必须满足某些条件,以保证数据的一致性和完整性
    3.用户定义完整性:用于保证数据的语义正确性,常见有唯一性、条件检查和非空性
  16. 什么是自主存取控制和强制存取控制

    1
    2
    自主存取控制方法允许拥有者自主决定哪些用户可以访问其数据,并可以将其拥有的存取权限转授给其他用户。这种控制方法相对灵活,适用于需要高度自定义权限的场景。但存在权限滥用的风险,影响数据的安全性
    强制存取控制方法由系统对数据对象的存取进行强制性的约束和控制。每一个数据对象都被标记为一定的密级,而每一个用户也被授予某个级别的许可证。只有用户的许可证级别高于或等于数据对象的密级时,才能访问该数据对象。这种控制方法相对严格,可以减少权限滥用的风险,从而提高数据的安全性。
  17. 什么是数据的完整性约束,什么是数据库的独立性

    1
    2
    3
    4
    5
    6
    	数据完整性约束可以防止无效的、不一致的或缺失的数据进入数据库,从而提高数据的质量和可靠性。数据完整性约束可以分为三类:实体完整性、参照完整性和用户定义完整性。
    数据库的独立性是指应用程序的数据独立于数据库系统中的数据,即数据的改变不会影响应用程序的正确性,包括逻辑独立性和物理独立性。
    逻辑独立性:是用户的应用程序与数据库的逻辑结构是相互独立的。
    当模式改变时,数据库管理员修改外模式/模式映像,可以使外模式保持不变,应用程序是根据外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性。
    物理独立性:是用户的应用程序与存储在磁盘上的数据库中的数据是相互独立的
    当数据库的存储结构改变时,数据库管理员修改模式/内模式映像,可以使模式保持不变,从而应用程序不必修改,保证了数据与程序的物理独立性。
  18. DBMS的五大功能

    1
    2
    3
    4
    5
    1.数据定义:提供DDL来创建、修改和删除数据库中的数据结构,如创建表、定义字段、设置约束等
    2.数据操作:提供DML进行增删改查等操作,常用的命令包括SELECT、INSERT、UPDATE和DELETE
    3.数据维护:包括数据备份、恢复优化和维护等功能
    4.数据控制:提供DCL用于管理数据库的访问权限,如GRANT和REVOKE命令
    5.事务管理:包括事务的提交、回滚和隔离等功能
  19. 为什么要有数据库数据恢复子系统

    1
    2
    因为计算机系统中硬件的故障、软件的错误、操作员的失误以及恶意的破坏是不可避免的,影响数据的正确性,因此必须有恢复子系统
    恢复子系统的功能是把数据库从错误状态恢复到某一已知的正确状态

数据库
http://xwww12.github.io/2025/02/25/考研/数据库/
作者
xw
发布于
2025年2月25日
许可协议