数据库系统概论笔记

本文最后更新于 2025年3月31日 晚上

第一章 绪论

1.1 数据库系统概述

1.1.1 数据库的四个基本概念

  1. 数据(Data):描述事务的符号记录

  2. 数据库(DB)

    • 概括地讲,数据库具有永久存储有组织可共享的三个基本特点。
    • 严格地讲,数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余、较高的数据独立性和易扩展性,并可为各种用户共享。
  3. 数据库管理系统(DBMS)位于用户和操作系统之间的一层数据管理软件。和操作系统一样是计算机的基础软件。

    主要功能:
               1,数据定义功能
               2,数据组织、存储和管理功能
               3,数据操纵功能
               4,数据库的事务管理和运行管理功能
               5,数据库的建立和维护功能
               6,其他功能(通信功能、数据转换功能、互访和互操作功能等)
    
  4. 数据库系统(DBS)

    • 是由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员(DBA)和用户组成的存储、管理、处理和维护数据的系统
    • 特点:数据结构化、数据共享性、数据独立性、DBMS的统一管理和控制
    • 数据独立性分为物理独立性和逻辑独立性。物理独立性意味着用户无需关心数据在磁盘上的存储方式,逻辑独立性指出即使数据库的逻辑结构发生变化,用户的应用程序也无需修改。

1.1.2 数据库的发展阶段

特点人工管理阶段文件系统阶段数据库系统阶段
数据管理者用户文件系统数据库管理系统
数据面向的对象某一应用程序某一应用现实世界(某组织等)
数据共享程度无共享,冗余度极大共享性差,冗余度大共享性高,冗余度小
数据独立性不独立,完全依赖于程序独立性差具有高度的物理独立性和一定的逻辑独立性
数据的结构化无结构记录内有结构,整体无结构整体结构化,用数据模型描述
数据控制能力应用程序自己控制应用程序自己控制数据库管理系统控制

1.2 数据模型

  • 对现实世界数据特征的抽象。

    第一类: 概念模型(信息模型)
    第二类: 逻辑模型,物理模型
    现实世界 —> 信息世界(概念模型)—> 机器世界
    现实世界 —-数据库设计人员—> 概念模型,逻辑模型 —-数据库管理系统—-> 物理模型

1.2.1 概念模型

也称信息模型,它是按用户观点来对数据和信息建模,主要用于数据库设计

  • 实体:客观存在并且可相互区别的事务
  • 属性:实体所具有的某一特性
  • 码:唯一标识实体的属性
  • 实体型:用实体名及其属性集合来抽象和刻画同类实体
  • 实体集:同一类型实体的集合
  • 联系:实体之间的联系通常是指不同实体集之间的联系。实体之间的联系有一对一、一对多和多对多等联系。

表示方法:E-R 图,分为实体、属性、关系三个核心部分,实体是长方形,属性是椭圆形,关系为菱形。

1.2.2 逻辑模型

按计算机系统的观点对数据建模,主要用于数据库管理系统的实现

  • 层次模型
  • 网状模型
  • 关系模型
  • 面向对象数据模型
  • 对象关系数据模型
  • 半结构化数据模型

1.2.3 物理模型

对数据最底层的抽象,它描述数据在系统内部的表示方法和存取方法,或在磁盘/磁带上的存储方式和存取方法,是面向计算机系统的。

1.2.4 数据模型的组成要素

  • 数据结构
  • 数据操作
  • 数据的完整性约束:实体完整性,参照完整性,用户定义的完整性。

1.3 常用的数据模型

1.3.1 层次模型(类似树与B树)

1.3.2 网状模型

1.3.1 关系模型(二维表)

  • 关系:一张表
  • 关系模式:表头,表示为:关系名(属性1,属性2···)
  • 元组:一行
  • 属性:一列
  • 码:唯一确定一个元组的属性组
  • 域:属性的取值范围
  • 分量:元组中的一个属性值(必须是不可分的数据项)
  • 非规范关系:表中有表

查询效率较低。

1.4 数据库系统的结构

1.4.1 模式的概念

数据库中全体数据的逻辑结构和特征的描述,它仅仅涉及型的描述,不涉及具体的值。一个具体值成为模式的一个实例。

  • 型:对某一类数据的结构和属性的说明。
  • 值:型的一个具体赋值。

模式是相对稳定的,实例是相对变动的。

1.4.2 三级模式结构

  1. 模式:也称逻辑模式/概念模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
  2. 外模式:也称子模式或用户模式,它是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
  3. 内模式:也称存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。

1.4.3 二级映像

  1. 外模式/模式映像:当模式改变时,由数据库管理员对各个外模式/模式映像作相应改变,可以使外模式保持不变,应用程序不必修改。保证了数据与程序的逻辑独立性
  2. 模式/内模式映像:当数据库的存储结构改变时,由数据库管理员对模式/内模式映像作相应改变,可以使模式保持不变,从而应用程序也不用改变。保证了数据与程序的物理独立性

1.4.4 联系

  • 应用程序:外部视图 <—> 子模式
  • DBMS:模式 <—> 子模式
  • 操作系统的存取方式:存储方式 <—-> 物理组织

1.5 数据库系统的组成

  • 硬件平台及数据
  • 软件
  • 人员
    • 数据库管理员
      • ①决定数据库中的信息内容和结构
      • ②决定数据库的存储结构和存取策略
      • ③定义数据的安全性要求和完整性约束条件
      • ④监控数据库的使用和运行
      • ⑤数据库的改进和重组、重构
    • 系统分析员:应用系统的需求分析和规范说明。
    • 数据库设计人员:数据库中数据的确定及数据库各级模式的设计。
    • 应用程序员:设计和编写应用系统的程序模块,并进行调试和安装。
    • 用户:通过用户接口使用数据库。

第二章 关系数据库

2.1 关系数据结构及形式化定义

2.1.1 关系

  • 目(度):属性数

  • 候选码:能唯一标识元组的最小属性组

  • 超码:候选码+其它属性

  • 主码:候选码中的一个(主关键字)

  • 主属性:候选码的诸属性(其中之一)

  • 非主属性(非码属性):不包含在任何候选码中的属性

  • 全码:所有属性都是候选码

  • 关系的类型:基本关系(基本表),查询表,视图表

      基本关系:实际存储数据的逻辑表示。
      查询表:查询结果对应的表。
      视图表:导出表,虚表,不对应实际存储的数据。
    

元组=记录

2.1.2 关系模式

R(U,D,DOM,F)

  • R 关系名
  • U 所有属性名
  • D 属性来自哪些域
  • DOM 属性和域的映射
  • F 属性间的依赖关系

一般简化为R(U)

2.2 关系操作(语言)

特点:集合操作方式,即操作的对象和结果都是集合。

  • 插入
  • 查询,基本操作:选择、投影、并、差、笛卡尔积
    • 非基本:
    • 连接:R⋈S = 先选择+笛卡尔积(再投影)
      • R(X,Y),其中Y为共有属性。
    • :R∩S = R-(R-S)
  • 删除
  • 修改

2.2.1 关系数据库基于数学上的关系代数运算和关系演算运算

  • 关系数据语言:
    • 关系代数语言
    • 关系演算语言
    • 以上双重特点(SQL)

2.2.2 SQL语言

2.3 关系的完整性

2.3.1 实体完整性:主属性非空

2.3.2 参照完整性:外码与主码之间的引用规则

  • 外码:其它关系的主码(可以是本关系)。
  • 外码取值为空值或主码值。
  • 为空表示该记录与其它关系无关。

2.3.3 用户定义的完整性(CHECK)

可选,实体完整性与参照完整性必须有。

2.4 关系代数


2.4.1 传统的集合运算(以元组为单位)

  1. 差:R-S,在R中删掉S中也有的。
  2. 笛卡尔积
  • 交并运算的两个关系都要有相同的属性
  • 差运算的两个关系属性个数和对应属性域必须相同。
  • 交并差均是以元组为单位的操作。

2.4.2 专门的关系运算

  1. 选择:在R中符合F条件的元组。

  2. 投影:R中的A列。(自动去重

  3. 连接:R与S的笛卡尔积中满足条件的元组。

    • 等值连接 —> 自然连接(合并同名属性) —保留悬浮元组–> (左/右)外连接
  4. 除:R÷S,R、S相交属性中R对应独立属性的象集包含S的独立属性值。

    • A属性的象集:除A属性外其它属性在特定A值下的不重复集合

第三章 SQL语言

3.1 SQL概述

  • SQL 是 Structed Query Language 的缩写,意思是结构化查询语言,是关系数据库的标准语言。(通用、功能极强)
  • SQL对大小写不敏感。

3.1.1 SQL的特点

  • 数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL),数据查询语言的功能于一体。
  1. 综合统一
    • 可以独立完成数据库生命周期中的全部活动:
      • 定义和修改、删除关系模式,定义和删除试图,插入数据,建立数据库。
      • 对数据库中的数据进行查询和更新。
      • 数据库重构和维护。
      • 数据库安全性、完整性控制,以及事务控制。
      • 嵌入式SQL和动态SQL定义。
    • 用户在数据库投入运行后,可根据需要随时逐步修改模式,不影响数据库的运行。
    • 数据操作府统一。
  2. 高度非过程化
    • 用户无需了解存取路径。
  3. 面向集合的操作方式(集合 = 表 / 关系)
  4. 以同一种语法结构提供多种使用方式
  5. 语言简洁,易学易用
    SQL功能动词
    数据查询SELECT
    数据定义CREATE,DROP,ALTER
    数据操纵INSERT,UPDATE,DELETE
    数据控制GRANT,REVOKE

3.2 数据定义

数据类型含义
CHAR(n)长度为n的定长字符串
VARCHAR(n)最大长度为n的变长字符串
INT长整数(4字节)
SMALLINT短整数(2字节)
BIGINT大整数(8字节)
NUMERIC(p,q)定点数,p位数字,小数点后有q位
DECIMAL(p,q)定点数,p位数字,小数点后有q位
FLOAT(n)可选精度的浮点数,精度至少为n位数字
BOOLEAN逻辑布尔量
DATE年-月-日
TIME时-分-秒
操作对象创建删除修改
模式CREATE SCHEMADROP SCHEMA|
CREATE TABLEDROP TABLEALTER TABLE
视图CREATE VIEWDROP VIEW|
索引CREATE INDEXDROP INDEXALTER INDEX

3.2.1 模式的定义与删除

1
2
3
4
5
6
7
8
-- 定义
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;
CREATE SCHEMA "S-T" AUTHORIZATION Panzhicheng;

-- 删除
DROP SCHEMA <模式名> <CASCADE | RESTRICT>;
-- CASCADE 级联:删除模式的同时也会把该模式的所有数据库对象删除。
-- RESTRICT 限制:如果该模式下有下属对象,比如表视图,就拒绝这个删除语句的执行。

3.2.2 基本表的定义、修改与删除

1.定义

1
2
3
4
5
6
7
8
CREATE TABLE <表名> (<列名> <数据类型> [<列级完整性约束条件>]
[,(<列名> <数据类型> [<列级完整性约束条件>]]···
[,表级完整性约束条件]);
-- 关键字可忽略大小写
create table User(name varchar(20) primary key, -- 列级完整性约束条件(name为主码)
age int,
sex char(1) not null default '男', -- 列级完整性约束条件(not null,默认条件)
FOREIGN KEY (name) REFERENCES Student(name)); -- 表级完整性约束条件,name是外码,被参照表是Student

2.修改

1
2
3
4
5
6
7
ALTER TABLE <表名>
[ADD [COLUMN] <新列名> <数据类型> [完整性约束]] -- 增加新列,列级完整性约束条件
[ADD <表级完整性约束>] //增加表级完整性约束条件
[DROP [COLUMN] <列名>[<CASCADE | RESTRICT>]] //删除列
[DROP CONSTRAINT <完整性约束名>[<CASCADE | RESTRICT>]] -- 删除指定完整性约束条件
[ALTER COLUMN <列名><新的数据类型>] //修改列数据类型
[RENAME COLUMN <旧列名> TO <新列名>]; //修改列名

3.删除

1
2
3
DROP TABLE <表名>[<CASCADE | RESTRICT>];
-- CASCADE 如果表有外码,视图,触发器,也会强行删除。
-- RESTRICT 反之。

3.2.3 索引的建立、修改与删除

  • 数据量比较大的时候,查询耗时大,建立索引可以有效减少时间消耗。
  • 索引可以建立在一列或多列上。
  • 用户无法显式地选择索引。

    索引类型:

    • 顺序文件上的索引
    • B+树索引
    • 散列(hash)索引
    • 位图索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 建立
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名> (<列名>[<次序>][,<列名>[<次序>]]···);-- 升序:ASC(默认),降序:DESC

CREATE UNIQUE INDEX Stusno
ON Student(Sno);

-- UNIQUE 唯一索引
-- CLUSTER 聚簇索引:物理顺序与索引的逻辑顺序相同,比如买书。


-- 修改
ALTER INDEX <旧索引名> RENAME TO <新索引名>;

-- 删除
DROP INDEX <索引名>;

3.2.4 数据字典

  • 数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息
  • 包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。
  • 关系数据库管理系统在执行SQL 的数据定义语句时,实际上就是在更新数据字典表中的相应信息。

3.3 数据查询

1
2
3
4
5
6
7
8
9
-- 基础架构
SELECT [ALL | DISTINCT] <目标表达式> [, <目标表达式>...] ... -- DISTINCT:去重
FROM <表名或视图名> [, <表名或视图名>..] -- 或者再写个子查询
[WHERE <条件表达式>] -- 不能用聚集函数
[GROUP BY <列名 1> [HAVING <条件表达式>]] -- HAVING是分组后的筛选,WHERE是分组前
[ORDER BY <列名 2> [ASC | DESC]];

-- 常用模式
SELECT ··· FROM ··· WHERE ··· GROUP BY ··· ORDER BY ··· ;
  • 重点:顺序为 where –> group by –> having

以下查询根据这三个表:

  • 学生表:student(*sno,sname,ssex,sage,sdept)
  • 课程表:course(*cno,cname,cpno,ccredit)
  • 学生选课表:sc(*sno,cno,grade)

3.3.1 单表查询

查询条件谓词
比较=, <, > ,<=, >=, !=, NOT+比较
确定范围BETWEEN X AND Y,NOT BETWEEN X AND Y
确定集合IN,NOT IN
字符匹配LIKE,NOT LIKE
空值ISNULL,ISNOTNULL
逻辑运算AND,OR,NOT
  • between:双边闭区间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 例子
-- 起别名,表达式,处理函数
SELECT sname as '姓名',2023-sage '出生年月',LOWER(sdept) FROM student;
-- 全选
SELECT * FROM student;
-- 年龄范围 BETWEEN
SELECT sname,2023-sage,sdept FROM student WHERE sage BETWEEN 20 AND 25;
-- 集合,IN
SELECT sname,2023-sage FROM student WHERE sdept IN ('CS','IS');
-- 字符匹配,模糊查询,LIKE,查找刘姓学生
SELECT * FROM student WHERE sname LIKE '刘%'; -- %:任意长度。
-- _:单个长度任意字符
-- 不想使用%和_模糊查找可以使用\转义,\_ \%

-- ORDER BY
SELECT * FROM student WHERE sname LIKE '刘%' ORDER BY grade ASC; -- 升序,默认升序
-- 先grade排,再sage排
SELECT * FROM student ORDER BY grade ASC,sage ASC;
聚集函数含义
COUNT(*)统计元组个数
COUNT([ALL/DISTINCT]<列名>)统计列中值的个数
SUM([ALL/DISTINCT]<列名>)计算一列值的总和(必须数值型)
AVG([ALL/DISTINCT]<列名>)计算一列值的平均值(必须数值型)
MAX([ALL/DISTINCT]<列名>)求一列值中的最大值
MIN([ALL/DISTINCT]<列名>)求一列值中的最小值
  • 聚集函数不能用在WHERE子句中
1
2
3
4
5
6
7
8
9
-- 例子
-- 查询学生总人数
SELECT COUNT(*) FROM student;
-- 计算一号课程的平均成绩
SELECT AVG(grade) FROM sc WHERE cno=1;
-- 计算学号为202123学生的总成绩
SELECT SUM(grade) FROM sc WHERE sno=202123;
-- 求各个课程号的选课人数
SELECT COUNT(*) FROM sc GROUP BY cno;

3.3.2 连接查询

本质上就是FROM后有多个表,相当于引用了多表的笛卡尔积,其它操作与单表查询相同。

  • 等值连接
  • 自身连接
  • 外连接:保留不符合条件的元组
  • 多表连接:两个以上的表进行查询
1
2
3
4
5
6
7
8
9
10
11
-- 例子
-- 等值连接
SELECT * FROM student stu,sc WHERE stu.sno = sc.sno; -- 引用的两个表是笛卡尔积形式
-- 自然连接(等值连接去掉重复属性列)
SELECT stu.cno,stu.sname,sc.cno FROM student stu,sc WHERE stu.sno = sc.sno;
-- 自身连接(给同一个表起两个别名)
SELECT * FROM course f,course s WHERE f.cpno = s.cno;
-- 外连接
SELECT * FROM course f left join course s on f.cpno = s.cno; -- 左外连接(保留所有f)
SELECT * FROM course f right join course s on f.cpno = s.cno; -- 右外连接(保留所有s)

3.3.3 嵌套查询(往往可用连接查询解决)

从后往前写

  • 查询块:一个 SELECT–FROM–WHERE 语句。
  • 嵌套查询:一个查询块在另一个查询块的 WHERE 或 HAVING 语句中。
  • 父查询:上层查询块。
  • 子查询:下层查询块。(不能使用 ORDER BY 语句)
  • 不相关子查询:子查询的查询条件不依赖于父查询。
  • 相关子查询:子查询的查询条件依赖于父查询。

1.带有 IN 谓词的子查询

1
SELECT * FROM student stu WHERE sno in (SELECT sno FROM sc WHERE cno=1);

2.带有 ANY,ALL 谓词的子查询(配合比较运算符)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT sno,cno FROM sc x -- 使用聚集函数
WHERE grade >= (
SELECT AVG(grade) FROM sc y WHERE x.sno=y.sno
);

SELECT sname,sage FROM student -- 一个值
WHERE sage >=ANY(
SELECT sage FROM student WHERE sdept='CS'
) AND sdept != 'CS';

SELECT sname,sage FROM student -- 所有值
WHERE sage >=ALL(
SELECT sage FROM student WHERE sdept='CS'
) AND sdept != 'CS';

3.带有(NOT)EXISTS 谓词的子查询

1
2
3
4
5
6
7
8
9
	1.存在量词,有一个或多个记录存在于。
2.带有 EXISTS 谓词的子查询不返回任何数据,只产生逻辑值'true''false'
若内层查询结果为空,则外层的WHERE子句返回假值'false';
若内层查询结果非空,则外层的WHERE子句返回假值'TRUE';
3.目标列表达式通常是*,因为具体列名无实际意义。
SELECT sname FROM student WHERE EXISTS (
SELECT * FROM sc WHERE sno=student.sno AND cno='1'
); -- 返回sname存在子查询中的记录。

3.3.4 集合查询

  • 并操作:UNION[all]
  • 交操作:INTERSECT
  • 差操作:EXCEPT
  • 加all不去重
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 1. 并操作
SELECT * FROM student WHERE sdept='cs'
UNION
SELECT * FROM student WHERE ssge=19;

-- 2. 交操作
SELECT sno FROM sc WHERE cno='1'
INTERSECT
SELECT sno FROM sc WHERE cno='2';

-- 3. 差操作(前-后)
SELECT * FROM student WHERE sdept='cs'
EXCEPT
SELECT * FROM student WHERE ssge <= 19;

3.3.5 基于派生表的查询

子查询出现在 FROM 子句中,成为临时派生表

1
2
3
4
5
-- FROM子句中的派生表必须指定别名。
-- 派生表中的SELECT语句包含聚集函数时需要为其指定别名。
SELECT * FROM sc,(SELECT sno,AVG(grade) avg_grade FROM sc GROUP BY sno) as savg
WHERE sc.sno = savg.sno AND sc.grade > savg.avg_grade;

3.4 数据更新

3.4.1 插入

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 1. 插入元组 ------------------------------
INSERT INTO <表名> [(<属性列 1> [, <属性列 2> ...])]
VALUES (<常量 1> [, <常量 2>...]);
-- 不指明属性则必须每个属性按序都有;指明则则按照指明的顺序,少的空值。
INSERT INTO student
VALUES (201215128,'陈东','男',18,'IS');

-- 2. 插入子查询结果 ---------------------------------
INSERT INTO <表名> [(<属性列 1> [, <属性列 2> ...])]
子查询;

INSERT INTO student(sname,sage)
SELECT sname,sage FROM student WHERE sage>18;

3.4.2 修改

1
2
3
4
5
6
7
8
9
10
11
12
13
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>] ··· -- 修改属性列为什么值
[WHERE <条件>]; -- 不加条件就全部修改

UPDATE student
SET sage=22 -- SET sage = sage + 1 年龄全部自增1
WHERE sno=2012158;

-- 带子查询的修改 ------
UPDATE student
SET sage=22
WHERE sno IN
(SELECT sno FROM student WHERE sage>18);

3.4.3 删除

1
2
3
4
5
6
DELETE FROM <表名> [WHERE <条件>]; -- 不加WHERE就全删,一条一条删

DELETE FROM student WHERE sno=2012145;
-- 带子查询删除 -------------
DELETE FROM student
WHERE sno IN(SELECT sno FROM student WHERE sage>18);

3.5 空值的处理

1
2
3
4
5
6
-- 1. 产生,使用NULL
-- 2. 判断,IS NULL , IS NOT NULL
-- 3. 约束条件,创建时加上
-- 4. 运算
空值与另一个(空)值的算术结果为空值,比较结果为 UNKNOWN
TRUE, FALSE, UNKNOWN
xyx AND yx OR y
TTTT
TUUT
TFFT
UTUT
UUUU
UFFU
FTFT
FUFU
FFFF

3.6 视图

  • 数据库中只存放视图的定义,不存放数据,视图是从其它1个或几个基本表导出的表,是虚表。
  • 基本表中的数据发生变化,视图中的数据也随之变化
  • 对视图的更新操作有限制
  • 作用:
    • ①视图能够简化用户从操作
    • ②视图能够使用户以多种角度看同一数据
    • ③视图对重构数据库提供了一定程度的逻辑独立性
    • ④视图能够对机密文件提供安全保护

3.6.1 定义和删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 定义
CREATE VIEW <视图名>[(<列名>[,<列名>]···)]
AS 子查询
[WITH CHECK OPTION];

CREATE VIEW is_student
AS select sno,sname,sage from student where sdept = 'IS';

CREATE VIEW is_student -- 不写属性名就是查询的属性名
AS select sno,sname,sage from student where sdept = 'IS'
WITH CHECK OPTION; -- 保证后续对视图进行操作仍需满足子查询中的条件

-- 分组视图:带有聚集函数和 GROUP BY 子句定义的视图

-- 删除
DROP VIEW <视图名> [CASCADE];
-- CASCADE 如果该视图有基于其导出的视图,也会强行删除。

3.6.1 查询

  • 视图消解:从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换为等价的对基本表的查询,然后再执行修正了的查询。
1
和之前的一样

3.6.1 更新

更新视图—->更新基本表

  • 不可更新的视图:例如更改平均值
  • 不允许更新的视图
    • 由两个以上基本表导出的(包含嵌套查询里的表)视图
    • 视图的字段来自字段表达式或常数,只允许DELETE
    • 视图的字段来自聚集函数
    • 视图定义中含有GROUP BY子句
    • 视图定义中含有DISTINCT短语
    • 不允许更新的视图上定义的视图

3.6.1 作用

  • 简化用户的操作
  • 使用户能以多种角度看待同一数据
  • 对重构数据库提供了一定程度的逻辑独立性
  • 能够对机密数据提供安全保护
  • 可以更清晰的表达查询

3.7 存储过程(类似函数FUNCTION,但是函数固定返回一个值)

1
2
3
4
5
6
create Procedure GetUserAccount
(a INT,b char(8)) -- 参数
as
BIGIN
select * from UserAccount
END;

第四章 数据库安全性

  • 定义:数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏
  • 一般保护方法:设置用户标识、存取权限控制
  • 五级安全措施:用户标识鉴定、存取控制、视图机制、审计、数据加密。

4.1 用户标识鉴别

  • 唯一用户标识:用户名,用户标识号
    • 静态口令鉴别
    • 动态口令鉴别
    • 生物特征鉴别
    • 智能卡鉴别

4.2 存取控制(授权)

  • 定义用户权限,并将用户权限登记到数据字典中。
  • 合法权限检查:用户发出请求,DBMS查询数据字典确认。
  • 内容
  • 1.要存取的数据对象
  • 2.对此数据对象进行操作的类型

4.2.1 自主存取控制方法(MAC)

  • 用户对不同的数据对象有不同的存取权限

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

  • 用户还可将其拥有的存取权限转授给其他用户

  • 通过 GRANT 和 REVOKE 语句实现(授权)

4.2.2 授权(访问数据的权限)

1.权限授予

1
2
3
4
5
6
7
8
9
10
11
12
GRANT <权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
TO <用户>[,<用户>]...
[WITH GRANT OPTION]; -- 指定该子句可以再转授权限,不允许循环授权即授权给祖先

GRANT SELECT
ON TABLE student
TO U1;

GRANT UPDATE(sno),SELECT -- 对属性列的授权必须指明列名
ON TABLE student
TO U1;

2.权限回收

1
2
3
4
5
6
7
8
9
10
11
REVOKE <权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
FROM <用户>[,<用户>]...
[RESTRICT|CASCADE];
-- CASCADE 级联:该用户传播出去的权限也回收。
-- RESTRICT 限制:如果该用户传播过权限,就拒绝这个语句的执行。
-- 不指明就按照缺省值,不同系统缺省值不同。

REVOKE SELECT
ON TABLE student
FROM PUBLIC; -- 所有用户权限

4.2.3 数据库角色

  • 角色是指一类人,比如说 CEO、总监、普通职员,可以给一类人授权

1.角色创建

1
2
3
CREATE ROLE <角色名>;

CREATE ROLE CEO;

2.角色授权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
GRANT <权限> ON <对象类型> <对象名>[列名]  [WHEN 条件]  TO <角色> [WITH GRANT OPTION];
-- 如果加上 WITH ADMIN OPTION,意味着,这个用户还可以吧这权限授予给其他角色或者用户。

GRANT SELECT ON TABLE Employee TO CEO ; -- 查询
UPDATE -- 更新
UPDATE(属性名) -- 更新某一属性
ALTER TABLE -- 修改表结构
ALL PRIVILIGES -- 所有权限
PUBLIC -- 所有人

-- 对于很复杂的,先建立视图在给予权限
CREATE VIEW DS(Sname,Smax,Smin,Savg)
AS
SELECT DepartmentId,max(Employee.Salary),min(Employee.Salary),avg(Employee.Salary)
FROM Employee,Department
WHERE DepartmentId=Department.ID
GROUP BY DepartmentId;

GRANT SELECT
ON VIEW DS
TO 杨兰

3.把角色授权给其他用户或角色

1
2
3
GRANT <角色> TO <其他角色或用户> [WITH ADMIN OPTION];

GRANT CEO TO Panzhicheng WITH ADMIN OPTION;

4.角色权限收回

1
2
3
REVOKE <权限> ON <表名> FROM <角色>;

REVOKE SELECT ON Employee FROM CEO;
  • 可能无意泄露数据

4.2.4 强制存取控制方法(MAC)

  • 主体:活动实体,如用户
  • 客体:被动实体,如基本表
  • 敏感度标记:绝密TS >= 机密S >= 可信C >= 公开P
    • 为每个主体与客体指派一个敏感度标记
  • 规则
    • 仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体。
    • 仅当主体的许可证级别小于或等于客体的密级时,该主体才能相应的客体。
  • 标记与数据是不可分的整体,复制仍然在。

4.2.3 总结

  • 先DAC检查再MAC检查,
  • 自主存取控制方法(DAC)与强制存取控制方法(MAC)共同构成数据库管理系统的安全机制。

4.3 视图机制

  • 为不同的用户定义不同的视图,把不需要的数据给隐藏起来,这样用户就不会误操作。
    • 服务器事件
    • 系统权限
    • 语句事件
    • 模式对象事件
1
2
3
4
5
6
7
8
9
10
-- 1. 创建视图
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept =IS’;

-- 2. 授权角色
GRANT SELECT ON CS_Student TO Panzhicheng;
GRANT ALL_PRIVILEGES ON CS_Student TO Panzhicheng;

4.4 审计(事后监控措施)

  • 任何操作都记录到审计日志,然后看日志,里面是否有非法行为。
1
2
3
4
5
-- 对修改 SC 数据的操作进行审计(AUDIT)
AUDIT UPDATE ON SC;

-- 取消对 SC 表的一切审计(NOAUDIT)
NOAUDIT UPDATE ON SC;

4.5 数据加密

  • 通过一些加密算法,把明文变成密文,这样别人就无法查看。
    • 存储加密
    • 传输加密
      • 链路加密
      • 端到端加密

4.5 其它安全性保护

  • 推理控制:避免用户利用其能够访问的数据推知更高密级的数据
  • 隐蔽信道
  • 数据隐私保护:控制个人数据

第五章 数据库完整性

  • 主要任务:保障数据的正确性、有效性、协调性,提高数据对用户的可用性。
  • 的约束和结构的约束
  • 措施
    • 适时检查完整性约束条件,保证语义完整。
    • 控制并发操作,使其不破坏完整性。
    • 在系统发生故障后,即时恢复系统。

5.1 完整性定义

  • 正确性:符合现实世界的描述(正确性、相容性

  • 相容性:同一个对象在不同表里面是符合逻辑,比如我的地址、年龄,在不同的表里应该一致

  • 维护数据库完整性(措施):

    • 提供完整性约束条件的机制
    • 提供完整性检查的方法
    • 进行违约处理

5.2 实体完整性

  • 主码值唯一,且非空
    • 主键一般自带索引,查找速度极快。
      1
      2
      CREATE TABLE Course (id NOT NULL PRIMARY KEY,
      name VARCHAR(255));

5.3 参照完整性

  • 外码可以是空值或另一个关系主码的有效值
  • 对参照表和被参照表增删改操作时有可能破坏参照完整性,必须进行检查。
1
2
3
4
5
6
7
CREATE TABLE Course (id NOT NULL,
name VARCHAR(255),
teacher_id INT,
PRIMARY KEY(id),
FOREIGN KEY(ID) REFERENCES Course_description(Course_id));
-- FOREIGN 定义外码
-- REFERENCES 指明外码参照哪些表的主码

5.4 用户定义的完整性

  • 非空 NOT NULL

  • 列值唯一 UNIQUE

  • 属性满足某一个条件表达式 CHECK

    1
    2
    3
    4
    CREATE TABLE SC (Sno CHAR(9) PRIMARY KEY,
    Sname CHAR(8) NOT NULL,
    Ssex CHAR(2) CHECK (Ssex IN ('男', '女'))
    Grade SMALLINT CHECK (Grade>60);
  • 元组满足某一个条件表达式 CHECK

    1
    2
    3
    4
    5
    CREATE TABLE SC (Sno CHAR(9) PRIMARY KEY,
    Sname CHAR(8) NOT NULL,
    Ssex CHAR(2)
    Grade SMALLINT
    CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%');
  • 属性上的约束条件检查和违约处理

  • 元组上的约束条件检查和违约处理

5.5 断言

  • 通过声明性断言来指定更具一般性的约束。
  • 可以定义涉及多个表或聚集操作的比较复杂的完整性约束。
  • 断言创建以后,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。
1
2
3
4
5
6
7
8
9
10
11
-- 创建断言
CREATE ASSERTION <断言名> <CHECK子句>;

CREATE ASSERTION ASSE_SC_CNUM1
CHECK(60>=ALL(SELECT count(*)
FROM SC
GROUP BY cno)
);

-- 删除断言
DROP ASSERTION <断言名>;

5.6 触发器

  • 触发器也叫做 事件 -> 条件 -> 动作 规则。
  • 当对一个表增删改的时候,对触发器里面的条件进行检查,如果成立就会执行触发器里的动作,否则不执行里面的动作。

5.6.1 定义触发器

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TRIGGER <触发器名>  -- 同一模式下唯一
{BEFORE|AFTER} <触发事件> ON <表名> -- 只能定义在基本表上,触发器名和表名必须在同一模式下

REFERENCING NEW|OLD ROW AS <变量> -- 只在行级触发器中有用
REFERENCING NEW|OLD TABLE AS <变量> -- 只在语句级触发器中有用

FOR EACH {ROW|STATEMENT} -- 行级触发器/语句级触发器

[WHEN(触发条件)]

BEGIN
<触发动作体> -- 注意缩进
END

5.6.2 激活触发器

  • 数据操纵会自动执行触发器所定义的SQL语句
  • 由触发事件激活,并由数据库服务器自动执行
  • 执行顺序:
    • 1.执行BEFORE触发器
    • 2.执行触发器的SQL语句
    • 3.执行AFTER触发器

5.6.3 删除触发器

1
DROP TRIGGER <触发器名> ON <表名>;

第六章 关系数据理论

6.1 问题的提出

  • 第一范式(1NF):每个分量是不可分的数据项。
  • 数据依赖(难):
    • 是一个关系内部属性与属性之间的约束关系
    • 是现实世界属性间相互联系的抽象
    • 是数据内在的性质
    • 是语义的体现
      • 函数依赖:一 一对应
      • 多值依赖

举个例子:(学号,所在系,系主任,课程号,成绩)

  • 学号 –> 所在系
  • 所在系 –> 系主任
  • 学号+课程号 –> 成绩
    存在多个依赖,数据有很大的冗余
    (学号,所在系)
    (学号,课程号,成绩)
    (所在系,系主任)

6.2 规范化

  • 函数依赖:(多对一映射)所有元组中都满足的,例如,学号 –> 所在系。

    • Y函数依赖于X
    • 平凡函数依赖:X –> Y, Y属于X(废话,自己决定自己)
    • 不平凡函数依赖:X –> Y, Y不属于X(这才是我们讨论的)
  • 若 X –> Y,则称X为这个函数依赖的决定因素

  • 若 X –> Y,Y –> X,则记作 X <–> Y

  • 完全函数依赖:X —-F—-> Y,当 X –> Y,且对任意的X真子集XX(多个主属性中的几个),都没有 XX –> Y。

  • 部分函数依赖:X —-P—-> Y, 完全依赖+其它属性=部分依赖(只依赖主码中的部分属性)

  • 传递函数依赖:X –> Y,Y –> Z,则 Z 传递依赖于 X 。(默认非平凡,不能主属性之间互推)

  • 超码(见2.1.1):候选码+其它属性

  • 闭包就是通过这些属性能够直接推出或间接推出的属性集的集合。

  • 无损连接性:如果R1∩R2是R1或R2的超码,则R上的分解(R1,R2)是无损分解。

  • 保持函数依赖性:F上的每一个函数依赖都在其分解后的某一个关系上成立(充分条件),则原关系必满足3NF。

6.3 范式

  • 符合某一种级别的关系模式的集合。
  • 1NF 包含于 2NF 包含于 3NF 包含于 BCNF 包含于 4NF 包含于 5NF
  • 规范化:一个低一级范式的关系模式,通过模式分解,转化为若干个高一级范式的关系模式的集合。

6.3.1 第一范式(1NF)

  • 每个分量是不可分的数据项。
  • 问题:数据冗余度大,插入异常,删除异常,修改异常

6.3.2 第二范式(2NF)

  • 在满足1NF的基础上,且非主属性完全依赖于主码。

6.3.3 第三范式(3NF)

  • 在满足2NF的基础上,且每个非主属性都不传递函数依赖于主码。

6.3.4 BCNF(修正的 3NF)

  • 消除每一个主属性候选码部分或传递依赖(主属性很多,候选码内部传递依赖)。
  • 满足BCNF,则实现了模式的彻底分解,消除了插入异常(该插没插)和删除异常(不该删被删)

6.3.5 多值依赖(一对几个多,多中的相互独立,可独立变化)

  • 对于R(U),X,Y,Z是U的子集,并且X+Y+Z=U。U的任何子集及其组合都不重复。X,Y,Z互相多值依赖。
  • X –>–> Y
  • 对称性
  • 传递性

6.3.6 第四范式(4NF)

  • 在满足BCNF的基础上,属性之间不允许有非平凡且非函数依赖的多值依赖,只允许函数依赖。
  • 二目关系都属于4NF

6.4 数据依赖的公理系统

  • 模式分解算法的理论基础。
  • Armstrong公理系统:函数依赖的一个有效而完备的公理系统。

6.5 模式分解(规范化)

找主码,(检查完全依赖、检查传递依赖)–找所有函数依赖

  1. 1NF到2NF:拆主码,其中一个主码不变。
  2. 2NF到3NF:传递拆开,X->Y->Z,拆成X,Y ; Y,Z。
  3. 3NF到BCNF:拆主属性

6.6 解题

  • 闭包:必包含自身。
  • 候选码
    • ①只在F右部出现的属性,不属于候选码
    • ②只在F左部出现的属性,一定存在于某候选码当中
    • ③两边都没有出现的属性,一定存在于候选码中
    • ④其他属性逐个与②③的属性结合,求属性闭包 ,直至X的闭包等于U。若等于U,则X为候选码
  • 极小函数依赖集
    • ①单一化,右边只有一个属性
    • ②去掉左边多余属性
    • ③去掉多余依赖

第七章 数据库设计

7.1 数据库设计概念

  • 基本步骤:
    1.需求分析
    2.概念结构设计:E-R图或者设计数据字典
    3.逻辑结构设计:E-R图 -> 逻辑模型
    4.物理结构设计:逻辑模型 -> 物理模型
    5.数据库实施:写SQL代码
    6.数据库运维:性能检测

7.2 需求分析

  • 产生数据字典,是全系统中数据项、数据结构、数据流、数据存储的描述。
  • 工具:数据流程图、数据字典

7.3 概念结构设计

7.3.1 E-R图

  • 实体间的联系

    • 一对一联系(1:1)
    • 一对多联系(1:n)
    • 多对多联系(m:n)
  • 二元联系:两个实体型之间的联系,度为2。

  • 三元联系:三个实体型之间的联系,度为3。

  • N元联系:N个实体型之间的联系,度为N。

  • 实体:矩形

  • 属性:椭圆形

  • 联系:菱形

7.3.2 合并E-R图

1.属性冲突

  • 属性域
  • 属性单位

2.命名冲突

  • 同名异义
  • 异名同义

3.结构冲突

  • 又当实体又当属性
  • 同一实体的属性个数与属性排列次序不完全相同
  • 实体间的联系在不同E-R图中为不同类型

7.4 逻辑结构设计

1.一个实体型转换为一个关系模式

  • 关系的属性:实体的属性
  • 关系的码:实体的码

2.一个1:m联系,在 M 端添加另一端的主键。
3.一个m:n联系,将联系转换为实体,然后在该实体上加上另外两个实体的主键。
4.一个多元联系转换,和二元类似。
5.具有相同码的关系模式可合并。

7.5 物理结构设计

  • B+树索引
  • hash索引
  • 聚簇方法(在物理上连续,同一页)

7.6 数据库的实施与维护

7.6.1 数据的载入和应用程序的调试

  • 数据库应用程序的设计应该与数据库设计同时进行。

7.6.2 数据库的试运行

  • 先输入小批量数据做调式用,运行合格再逐步增加数据量。
  • 要做好数据库的转储和恢复工作。

7.6.3 数据库的运行和维护

第八章 事务

8.1 事务的概念

  • 用户定义的一个数据库操作序列,具有原子性。类比原语。
  • 是恢复和并发控制的基本单位。
1
2
3
4
5
6
7
BEGIN TRANSACTION
SQL 语句1
SQL 语句2
......
[COMMIT|ROLLBACK];
-- COMMIT:提交,提交事务的所有操作。(默认)
-- ROLLBACK:回滚,系统将事务中对数据库的所有已完成操作撤销,回滚到事务开始时的状态。

8.2 事务的特性(ACID)

  • 原子性Atomicity:所有操作要么都做要么都不做。
  • 一致性Consistency:事务执行结果必须使数据库从一个一致状态变到另一个一致性状态。
  • 隔离性Isolation:并发执行的各个事务之间不能互相干扰。
  • 持续性Durability:一个事务一旦提交,它对数据库的改变是永久的。

8.3 事务的故障

  1. 事务(内部)故障:事务未完成,强行回滚。rollback;

  2. 系统故障:造成系统停转的任何事件。

  3. 介质故障:硬件损坏

  4. 计算机病毒

8.4 数据库恢复—利用冗余数据

  • 将数据库从错误状态恢复到某一已知的正确状态

  • 技术:

    • 数据转储(静态与动态)
    • 登记日志文件
      • 登记的次序严格按并发事务执行的顺序
      • 必须先写日志文件,后写数据库
  • 策略:

    • 事务故障:反向扫描日志文件,查找该事务的更新操作,依次进行逆操作。
    • 系统故障:正向扫描日志文件,故障前发生的事务加入重做队列,故障时未发生的事务加入撤销队列,对重做队列中的事务进行重做处理,对撤销队列中的事务进行撤销(UNDO)处理。
    • 介质故障:重装数据库,然后重做已完成的事务。

8.4.1 后援副本

8.4.2 日志文件

日志文件是用来记录事务对数据库更新操作的文件。日志文件主要有以下两种格式:

  • 记录为单位的日志文件包括:
    • 各个事务开始的标记;
    • 各个事务的结束标记;
    • 各个事务的所有更新操作。
    • 每个事务的开始标记、结束标记和每个更新操作构成一个日志记录。
  • 数据块为单位的日志文件包括:
    • 事务标识(标明是哪个事务)
    • 操作的类型(插入、删除或修改)
    • 操作对象(记录内部标识)
    • 更新前数据的旧值(对插入操作而言此项为空值)
    • 更新后数据的新值(对删除操作而言此项为空值)

作用:
(1)事务故障恢复和系统故障恢复必须用日志文件;
(2)在动态转储方式中必须建立日志文件,后备副本和日志文件结合起来才能有效地恢复数据库;
(3)在静态转储方式中也可以建立日志文件。

登记原则:
(1)登记的次序严格按照并发事务执行的时间次序。
(2)必须先写日志文件,后写数据库。

第九章 并发控制

  • 事务是并发控制的基本单位,保证事务ACID特性是事务处理的重要任务。
  • 事务的ACID可能遭到破坏的原因是多个事务对数据库的并发操作造成的。
  • 为了保证事务的隔离性和一致性,DBMS需要读并发操作进行正确调度。

9.1 并发带来的问题(数据不一致)

  • 丢失修改

  • 脏读

  • 不可重复读:读后被修改,无法再次重现读

  • 原因:并发操作破坏了事务的隔离性。

9.2 方法:封锁以及封锁协议

9.2.1 封锁(实现并发控制)

基本的锁有两类:

  • 排他锁(X锁),写锁:只允许加锁事务进行读写。
  • 共享锁(S锁),读锁:只允许加锁事务进行读,其它事务加读锁。

9.2.2 封锁协议

  • 一级封锁协议:修改前必须加X锁,直到事务结束才释放
    • 防止丢失修改
  • 二级封锁协议:在一级封锁协议上,读取前必须加S锁,读完后即可释放。
    • 防止丢失修改,防止脏读
  • 三级封锁协议:在一级封锁协议上,读取前必须加S锁,直到事务结束才释放。
    • 防止丢失修改,防止脏读,防止不可重复读
  • 两段封锁协议:加锁统一加,然后统一解锁。

9.3 活锁与死锁

9.3.1 活锁

事务串行等待,有可能永远等待。

  • 避免活锁:采用FCFS先来先服务

9.3.2 死锁

多个事务互相等待,永远不能结束。

  • 预防死锁
    • 一次封锁法
    • 顺序封锁法
  • 诊断与解除死锁
    • 超时法
    • 等待图法

数据库系统概论笔记
https://jimes.cn/2025/01/11/数据库/
作者
Jimes
发布于
2025年1月11日
许可协议