数据库|整理
第一章 绪论·
基本概念·
- 数据:描述事物的符号记录 (是数据库中存储的基本对象)
- 数据库:长期存储在计算机内、有组织的、可共享的大量数据的集合
- 数据库管理系统:位于用户与操作系统之间的一层数据管理软件
- 数据库系统:由数据库、数据库管理系统、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统
数据库系统的特点·
- 数据结构化
- 数据的共享性质、冗余度低且易扩充
- 数据独立性高
- 数据由数据管理系统统一控制管理
- 数据的安全性保护
- 数据的完整性保护
- 并发控制
- 数据库恢复
数据模型·
- 数据模型是对现实世界数据特征的抽象
- 数据模型是数据库系统的核心和基础
两类数据模型·
- 概念模型:按用户的观点来对数据和信息建模
- 逻辑模型和物理模型
- 逻辑模型:按计算机系统的观点对数据建模
- 物理模型:对数据最底层的抽象
※:数据建模与抽象
- 数据建模是抽象,抽象是理解——区分——命名——表达
概念模型·
- 实体:客观存在并可相互区别的事物称为实体 e.g:一个学生
- 属性:实体具有的某一特性 e.g:学生的性别
- 码/键:唯一标识实体的属性集 e.g:学号
- 实体型:用实体名及其属性名集合来抽象和刻画同类实体 e.g:学生(姓名,性别)
- 实体集:同一类型实体的集合 e.g:全体学生
- 联系:
- 实体内部的联系:组成实体的各属性之间的联系
- 实体之间的联系:不同实体集之间的联系
- 一对一:1:1(也可以没有)
- 一对多:1:m(也可以没有)
- 多对多:m:n(也可以没有)
- 实体——联系方法(E-R):用E-R图描述现实世界的概念模型
数据模型的组成要素·
- 数据结构
- 数据操作
- 查询
- 更新:插入、删除、修改
- 数据的完整性约束条件:用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容
常用的数据模型·
- 格式化模型
- 层次模型
- 网状模型
- 关系模型✅
- 面向对象模型
- 对象关系数据模型
- 半结构化数据模型
- 图数据模型
层次模型·
- 最早出现的数据模型,用树形结构来表示实体和实体间的联系
- 构成
- 有且只有一个根节点没有双亲结点
- 根以外其他他结点有且只有一个双亲结点
- 优点:结构简单、查询效率高
- 缺点:现实世界中很多联系是非层次性的、对具有多个双亲解点的结点难表示、查询子女结点必须通过双亲结点等
网状模型·
- 构成
- 允许一个以上结点无双亲
- 一个结点可以由多余一个的双亲
关系模型·
-
最重要的数据模型
-
逻辑结构是一张二维表
-
概念
-
关系:一个关系对应一张表
-
元组:表中的一行
-
属性:表中的一列;列头是属性名
-
码:可以唯一确定一个元组的属性组
-
域:一组具有相同数据类型的值的集合
-
分量:元组中的一个属性值
-
关系模式:对关系的描述,一般表示为:关系名(属性1,属性2,…,属性n)
e.g:学生(学号,姓名,性别)
-
-
关系是规范化的:不允许表中还有表
-
优点:建立在严格的数学概念上、数据结构结构简单、存取路径对用户透明
-
缺点:查询效率不如结构化数据模型
数据库系统的结构·
数据库系统模式的概念·
- 型:对某一类数据的结构和属性的说明
- 值:型的一个具体赋值
- 模式:数据库中全体数据的逻辑结构和特征的描述(只涉及型)
- 实例:模式的一个具体值称为一个实例
数据库系统的三级模式结构·
-
模式:也称逻辑模式,一个数据库只有一个模式。它是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图
-
外模式:也称子模式、用户模式,一个数据库可以有多个外模式。它是数据库用户能够看见和使用的
局部数据的
逻辑结构和特征的描述,是数据库用户的数据视图
- 保证数据库安全性
-
内模式:也称存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式
数据库的二级映像功能与数据独立性·
- 外模式/模式映像:定义了外模式和模式之间的相应关系
- 保证数据的逻辑独立性
- 内模式/模式映像:定义了数据全局逻辑结构与存储结构之间的对应关系
- 保证了数据的物理独立性
数据库系统的组成·
- 硬件平台及数据库
- 软件
- 人员
第二章 关系数据库·
关系数据结构及形式化定义·
关系·
域·
- 域:一组具有相同数据类型的值的集合
笛卡尔积·
-
笛卡尔积:域上的一种集合运算
- 给定的一组域,允许其中的某些域是相同的,则 的笛卡尔积为:
- 元组:笛卡尔积中每一个元素 叫作一个元组或简称元组
- 分量:笛卡尔积元素 中的每一个值 叫作一个分量
-
基数:若 为有限集,其基数为,则 的基数 为:
- 一般而言,笛卡尔积的某个子集才有实际含义
关系·
- 关系
- 的子集叫作在域 上的关系,表示为:
- :关系名
- :关系的目或度
- 的子集叫作在域 上的关系,表示为:
- 码/键
- 候选码:若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码
- 简单的情况:候选码只包含一个属性
- 全码:最极端的情况:关系模式的所有属性组是这个关系模式的候选码,称为全码
- 在关系模型中,候选键或候选码是某个关系的一组属性所组成的集合,它需要同时满足下列两个条件:
- 这个属性集合始终能够确保在关系中能唯一标识元组
- 在这个属性集合中找不出真子集能够满足条件 1
- 满足第一个条件的属性集合称为超键,因此我们也可以把候选键定义为“最小超键”,也就是不含有多余属性的超键
- 主码:若一个关系有多个候选码,则选定其中一个为主码
- 通常选择有代表性的、长度较短的候选码作为主码(主键),优先选择数字类型的候选键
- 主属性:候选码的诸属性称为主属性
- 外键:一个实体的主键被另外一个实体使用,以表达不同实体元组之间的关系
- 候选码:若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码
- 三类关系
- 基本关系(基本表):实际存在
- 查询表:查询结果对应的表
- 视图表:虚表,不对应实际存储的数据
- 基本关系的性质
- 列是同质的
- 不同的列可能出自同一个域
- 列的顺序无所谓
- 任意两个元组的候选码不能相同
- 行的顺序无所谓
- 分量必须取原子值
关系模式·
- 关系:元组的集合
- 关系模式:指出元组集合的结构
- 同一关系模式下,可有很多的关系
- 关系模式是稳定的;而关系是某一时刻的值,是随时间可能变化的
- 关系模式可以形式化地表示为:
- :关系名
- :组成该关系的属性名集合
- : 中属性所来自的域
- :属性向域的映象集合
- :属性间数据的依赖关系的集合
- 关系模式通常可以简记为
或
- :关系名
- : 属性名
- 域名及属性向域的映象常常直接说明为属性的类型、长度
关系数据库·
- 关系数据库:所有关系的集合
- 型:关系数据库模式
- 值:在某一时刻对应的关系的集合
关系操作·
基本的关系操作·
- 常用的关系操作
- 查询操作:选择、投影、连接、除、并、差、交、笛卡尔积
- 选择、投影、并、差、笛卡尔积是5种基本操作
- 数据更新:插入、删除、修改
- 查询操作:选择、投影、连接、除、并、差、交、笛卡尔积
- 关系操作的特点
- 集合操作方式:操作的对象和结果都是集合,一次一集合的方式
关系数据语言的分类·
- 关系代数语言:用对关系的运算来表达查询要求
- 代表:ISBL
- 关系演算语言:用谓词来表达查询要求
- 元组关系演算语言:谓词变元的基本对象是元组变量
- 代表:APLHA,QUEL
- 域关系演算语言:谓词变元的基本对象是域变量
- 代表:QBE
- 元组关系演算语言:谓词变元的基本对象是元组变量
- 具有关系代数和关系演算双重特点的语言
- 代表:SQL
关系的完整性·
- 实体完整性和参照完整性称为关系的两个不变性
实体完整性·
- 实体完整性规则:若属性 是基本关系 的主属性,则 不能取空值
参照完整性·
- 设 是基本关系 的一个或一组属性,但不是关系 的码。如果 与基本关系 的主码 相对应,则称 是 的外码
- 基本关系 称为参照关系
- 基本关系 称为被参照关系或目标关系
- 参照完整性规则:若属性(或属性组) 是基本关系 的外码,它与基本关系 的主码 相对应(基本关系 和 不一定是不同的关系),则对于 中每个元组在 上的值必须为:
- 或者取空值( 的每个属性值均为空值)
- 或者等于 中某个元组的主码值
用户定义的完整性·
- 某一具体应用所涉及的数据必须满足的语义要求
关系小结·
- 关系模型
- 关系——结构
- 关系操作
- 完整性
- 实体完整性:主码
- 参照完整性:外码
- 自定义完整性:属性与属性组合
关系代数·
- 关系代数是一种抽象的查询语言,它用对关系的运算来表达查询
- 基本运算符:并、差、笛卡尔积、投影、选择
- 集合运算符
运算符 | 含义 |
---|---|
∪ | 并 |
− | 差 |
∩ | 交 |
× | 笛卡尔积 |
- 专门的关系运算符
运算符 | 含义 |
---|---|
σ | 选择 |
π | 投影 |
⋈ | 链接 |
÷ | 除 |
- 比较运算符
> ; ≥;<;≤;=;≠
- 逻辑运算符
¬;∧;∨
专门的关系运算符·
一些表示·
(1)设关系模式为 ,它的一个关系设为,
表示 是 的一个元组 则表示元组 中相应于属性 的一个分量
(2)$ \mathrm{A}, \mathrm{t}[\mathrm{A}], \overline{A}$ 若 ,其中 是 中的一部分,则 称为属性列或属性组。 表示元组 在属性列 上诸分量的集合。则表示 中去掉 后剩余的属性组。
(3) 为 目关系, 为 目关系。 , 称为元组的连接。是一个 列的元组, 前 个分量为 中的一个 元组,后 个分量为 中的一个元组。
(4) 象集 给定一个关系 和 为属性组。 当 时, 在 中的象集为:
它表示 中属性组 上值为 的诸元组在 上分量的集合
选择·
- 选择又称为限制
- 选择运算符的含义
- 在关系R中选择满足给定条件的诸元组
- F: 选择条件, 是一个逻辑表达式, 取值为 "真"或 “假 ”
- 基本形式为:
- 表示比较运算符
投影·
- 从关系中选择出若干属性列组成新的关系
- : 中的属性列
- 投影操作主要是从列的角度进行运算
连接·
- 从两个关系的笛卡尔积中选取属性间满足一定条件的元组
- 两类常用的连接运算
- 等值连接:
- 自然连接:特殊的等值连接——去掉了重复的属性列
- 悬浮元组:两个关系 R 和 S 在做自然连接时被舍弃的元组
- 外连接:如果把悬浮元组也保存在结果关系中,而在其他属性上填 ,就叫做外连接
- 左外连接:只保留左边关系 中的悬浮元组
- 右外连接:只保留右边关系 中的悬浮元组
除·
给定关系 和,其中 为属性组。 中的 与 中的 可以有不同的属性名,但必须出自相同的域集。 与 的除运算得到一个新的关系 , 是 中满足下列条件的元组在 属性列上的投影:
- 元组在 上分量值 的象集 包含 在 上投影的集合
- 记作:,其中 是 在 中的象集。
- (理解:列数/属性是R-S个,元组t要求与任意的u∈S组合成的元组tu都在R中)
除法运算经常用于求解“查询…至少/全部的/所有的…”问题
第三章 关系数据库标准语言 SQL·
SQL 概述·
SQL 的特点·
- 综合统一:集 DDL,DML,DCL 功能于一体等
- 高度非过程化:SQL只要提出“做什么”,无须了解存取路径
- 面向集合的操作方式
- 以同一种语法结构提供多种使用方式:是独立的语言,也是嵌入式语言
- 语言简洁,易学易用:核心功能只用了9个动词
SQL 的基本概念·
- 模式——基本表
- 本身独立存在的表
- SQL中一个关系就对应一个基本表
- 一个(或多个)基本表对应一个存储文件
- 一个表可以带若干索引
- 内模式——存储文件
- 外模式——视图
- 从一个或几个基本表导出的表
- 数据库中只存放视图的定义而不存放视图对应的数据
- 视图是一个虚表
- 用户可以在视图上再定义视图
数据定义·
操作对象 | 创建 | 删除 | 修改 |
---|---|---|---|
模式 | CREATE SCHEMA | DROP SCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
模式的定义与删除·
定义模式·
- e.g:
1 | CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>] |
- 定义模式实际上定义了一个命名空间
删除模式·
- e.g:
1 | DROP SCHEMA <模式名> <CASCADE|RESTRICT> |
-
CASCADE
:删除模式的同时把该模式中所有的数据库对象全部删除 -
RESTRICT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
:如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行
- 仅当该模式中没有任何下属的对象时才能执行
### 基本表的定义、删除与修改
#### 定义数据表
- 基本格式:
```MYSQL
CREATE TABLE<表名>
(<列名><数据类型>[<列级完整性约束条件>]
[,<列名><数据类型>[<列级完整性约束条件>]]
…
[,<表级完整性约束条件>]);
数据类型·
- SQL 中域的概念由数据类型实现
- 定义表的属性时需要指明其数据类型及长度
CHAR
,VARCHAR
- 通常以 byte 计数
CHAR
类型数据插入数据库后,会自动补齐空格;VARCHAR
不会
NCHAR
,NVARCHAR
- 以字符计数
- 通常是 UTF-8 字符集,1 汉字=3字节
- 日期与时间
- 统一格式:方便检索、查询
- 不同的数据库,提供的函数不同
- 时区问题
- 字符串常量的界定标识
- 标准 sql 使用单引号’标识字符串常量
- 很多数据库实现,双引号”也可以标识字符串,但不同数据库有特别的含义
- 字符串中间的2个连续单引号转义为一个单引号
- 双引号”通常用来标识关键字,对象名、字段名
- Oracle中双引号标识的对象名/字段名区分大小写!
- 字符串拼接
- Oracle:||
- MySQL:空格
模式与表·
- 每一个基本表都属于某一个模式
- 一个模式包含多个基本表
修改基本表·
- <表名>是要修改的基本表
ADD
子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件DROP COLUMN
子句用于删除表中的列- 如果指定了
CASCADE
短语,则自动删除引用了该列的其他对 - 如果指定了
RESTRICT
短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列
- 如果指定了
DROP CONSTRAINT
子句用于删除指定的完整性约束条件ALTER COLUMN
子句用于修改原有的列定义,包括修改列名和数据类型
删除基本表·
-
DROP TABLE <表名>[RESTRICT | CASCADE];
1
2
3
4
5
6
7
8
9
10
11
### 索引的建立与删除
- 建立索引的目的:加快查询速度
- 建立者:建表者
- 维护者、使用者:关系数据库管理系统
#### 建立索引
```MYSQL
CREATE \[ UNIQUE \]\[ CLUSTER \] INDEX <索引名> ON <表名>(<列名>\[<次序>\]\[ ,<列名>\[<次序>\]\]…) -
<表名>:要建索引的基本表的名字
-
索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔
-
<次序>:指定索引值的排列次序,升序:
ASC
,降序:DESC
。缺省值:ASC
-
UNIQUE
:此索引的每一个索引值只对应唯一的数据记录 -
CLUSTER
:表示要建立的索引是聚簇索引(SQL Server语法)
修改索引·
1 | ALTER INDEX <旧索引名> RENAME TO <新索引名> |
删除索引·
1 | DROP INDEX <索引名> |
数据字典·
- 数据字典:是关系数据库管理系统内部的一组系统表,它记录了数据库中所有定义信息
- 关系数据库管理系统在执行 SQL 的数据定义语句时,实际上就是在更新数据字典表中的相应信息
数据查询·
单表查询·
-
定义:查询仅涉及一个表
-
选择表中的若干列
- 选择表中若干列
SELECT Sno FROM Student
- 查询全部列
SELECT * FROM Student
- 查询经过计算的值
SELECT 2014-Sage FROM Student
- 选择表中若干列
-
选择表中的若干元组
使用DISTINCT消除取值重复的行:如果没有指定DISTINCT关键词,则缺省为ALL
1
2
3SELECT Sno FROM SC;
SELECT ALL Sno FROM SC; /*两者等价*/
SELECT DISTINCT Sno FROM SC; /*去除重复行*/查询满足条件的元组:WHERE 子句
WHERE 子句常用的查询条件
查询条件 谓词 比较 =,>,<,>=,<=,!=,<>,!>,!<,NOT+上述比较运算符 确定范围 BETWEEN AND,NOT BETWEEN AND 确定集合 IN,NOT IN 字符匹配 LIKE,NOT LIKE 空值 IS NULL,IS NOT NULL 多重条件(逻辑运算) AND,OR,NOT -
ORDER BY子句
ASC
(缺省)升序;DESC
降序
-
聚集函数:
不能作为条件表达式
- 统计元组个数
COUNT(*)
- 统计一列中值的个数
COUNT([DISTINCT|ALL]<列名>)
- 计算一列值的总和(此列必须为数值型)
SUM([DISTINCT|ALL]<列名>)
- 计算一列值的平均值(此列必须为数值型)
AVG([DISTINCT|ALL]<列名>)
- 求一列中的最大值和最小值
MAX([DISTINCT|ALL]<列名>)
MIN([DISTINCT|ALL]<列名>)
- 统计元组个数
-
GROUP BY子句
将查询结果按某一列或多列的值分组,值相等的为一组
GROUP BY
,HAVING
-
连接查询·
连接查询:同时涉及两个以上的表的查询
连接条件或连接谓词:用来连接两个表的条件
查询语句:
1 | select * from table1, table2 where [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> |
连接字段:连接条件中的各连接字段类型必须是可比的,但名字不必相同
1.等值于非等值连接查询·
等值连接:连接运算符为 =
1 | SELECT Student.*, SC.* |
连接操作的执行过程:
- 嵌套循环法(NESTED-LOOP)
- 在表1中找到第一个元组,然后从头扫描表2,找到满足的元组与表1的第一个元组拼接起来
- 表2查找结束后,查找表1中的第二个元组,然后从头扫描表2
- 重复上述操作
- 排序合并法(SORT-MERGE)
- 常用于等值连接
- 首先按连接属性对表1和表2排序
- 对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组
- 当遇到表2中第一条大于表1连接字段值的元组时,对表2的查询不再继续
- 查找表1中第二条元组,从刚刚的中断点除继续扫描表2,重复上述操作
- 索引连接(INDEX-JOIN)
- 对表2按连接字段建立索引
- 对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组
非等值连接也是连接的2张表先做笛卡尔积,然后按照“非等值”的连接条件对每一条记录进行过滤:
1 | SELECT * FROM course, sc |
过滤条件:
过滤条件是在连接条件的基础上,进一步对结果集进行选择(过滤),要区分连接条件(关系代数中的θ连接条件)和过滤条件(关系代数中的选择σ条件)
1 | SELECT Student.Sno, Sname |
这里的WHERE子句是由连接谓词和选择谓词(过滤)组成的复合条件。
执行过程:
- 先从SC中挑选出Cno='2’并且Grade>85的元组形成一个中间关系
- 再和Student中满足连接条件的元组进行连接得到最终的结果关系
2.自身连接·
自身连接:一个表与其自己进行连接,需要给表起别名以示区别,由于所有属性名都是同名属性,因此必须使用别名前缀。
1 | SELECT FIRST.Cno, SECOND.Cpno |
3. 外连接·
外连接与普通连接的区别:
- 普通连接操作只输出满足连接条件的元组
- 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
- 分为:
- 左外连接:列出左边关系中所有的元组
- 右外连接:列出右边关系中所有的元组
1 | /*查询每个学生及其选修课程的情况*/ |
4. 多表连接·
1 | /*查询每个学生的学号、姓名、选修的课程名及成绩*/ |
5. Join总结·
JOIN连接类型:
- INNER JOIN
- LEFT JOIN OR LEFT OUTER JOIN
- RIGHT JOIN OR RIGHT OUTER JOIN
- FULL OUTER JOIN
- NATURAL JOIN
- CROSS JOIN
- SELF JOIN
Inner Join:
- 即关系代数中的θ连接运算
- 返回符合连接字段条件的所有记录
Outer Join:
- 即关系代数中的外连接运算
- 左连接、右连接、全连接

嵌套查询·
一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。
1 | SELECT Sname /*外层查询或父查询*/ |
子查询的限制:不能使用ORDER BY子句
嵌套查询求解方法:
-
不相关子查询:子查询的查询条件不依赖于父查询,
由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
1
2
3Select Sname from Student S
where Sno in ( select Sno from SC where Cno='2' ); -
相关子查询:子查询的查询条件依赖于父查询
首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表。然后再取外层表的下一个元组重复这一过程,直至外层表全部检查完为止。
1
2
3SELECT Sno, Cno FROM SC x
WHERE Grade >= ( SELECT AVG(Grade) FROM SC y
WHERE y.Sno=x.Sno );
带有ANY(SOME)或ALL谓词的子查询·
- > ANY:大于子查询结果中的某个值
- >ALL:大于子查询结果中的所有值(或者叫任意一个值)
- <ANY:小于子查询结果中的某个值
- <ALL:小于子查询结果中的所有值
- >=ANY:大于等于子查询结果中的某个值
- >=ALL:大于等于子查询结果中的所有值
- <=ANY:小于等于子查询结果中的某个值
- <=ALL:小于等于子查询结果中的所有值
- =ANY:等于子查询结果中的某个值
- =ALL:等于子查询结果中的所有值(通常没有实际意义,如果结果集的记录数大于1时,永为假)
- !=(或<>)ANY:不等于子查询结果中的某个值(通常没有实际意义,如果结果集的记录数大于1时,永为真)
- !=(或<>)ALL:不等于子查询结果中的所有值
查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄:
1 | SELECT Sname,Sage |
ANY、ALL 与聚集函数的对应关系如表所示。
= | <>或!= | < | <= | > | >= | |
---|---|---|---|---|---|---|
ANY | IN | – | <MAX | <=MAX | >MIN | >=MIN |
ALL | – | NOT IN | <MIN | <=MIN | >MAX | >=MAX |
事实上,用聚集函数实现子查询通常比直接用 ANY 或 ALL 查询效率要高。
- ANY: 与子查询结果/列表每一个值比较结果 OR等价
- ALL: 与子查询结果/列表每一个值比较结果 AND等价
如果被比较的值域集合中包括NULL,则NOT IN、!=ALL的最终果为UNKNOWN (==False)。
带有EXISTS谓词的子查询·
集合查询·
-
并
UNION
UNION
:合并查询结果时,去掉重复元组UNION ALL
:合并查询结果时,保留重复元组
-
交
INTERSECT
-
差
EXCEPT
基于派生表的查询·
- 子查询不仅可以出现在
WHERE
子句中,还可以出现在FROM
子句中,这时子查询生成的临时派生表成为主查询的查询对象
SELECT 语句的一般格式·
1 | SELECT [ ALL | DISTINCT ]<目标列表达式>[,<目标列表达式>]… |
SELECT的一些特别用法·
CASE WHEN
:条件返回
1 | SELECT sname, (CASE sdeptwhen 'CS' THEN '计算机' WHEN 'IS' THEN '信息' ELSE '其他' END) AS DEPT FROM student; |
TOP
,LIMIT
orROWNUM
:返回查询结果集的前 N 条记录WITH … AS
:定义一个临时作用域,便于随后的查询引用,类似临时表/视图
1 | WITH qry AS ( SELECT * FROM student NATURAL JOIN scNATURAL JOIN course) |
-
Oracle
1
CONNECT BY
层次遍历
- 如果表中包含树状层级结构数据,那么就可以使用层次查询
正序:
1 | SELECT cno, cpno, level, cnamefrom D9_COURSE |
逆序:
1 | SELECT cno, cpno, level, cnamefrom D9_COURSE |
数据更新·
插入数据·
- 两种插入数据方式
- 插入元组
- 插入子查询结果:可以一次插入多个元组
插入元组·
1 | INSERT |
插入子查询结果·
1 | INSERT |
复制表结构/数据·
-
MySQL
-
复制表结构
1
CREATE TABLE SC_2 LIKE SC
-
复制表结构和数据
1
CREATE TABLE SC_2 SELECT * FROM SC
-
复制数据
1
INSERT INTO SC_2 SELECT * FROM SC
-
修改数据·
1 | UPDATE <表名> |
删除数据·
1 | DELETE |
空值的处理·
- 空值的产生:插入元组的部分属性为空;外连接;空值的关系运算
- 空值的判断:
IS NULL
;IS NOT NULL
- 空值的约束条件
- 有
NOT NULL
约束条件的不能取空值 - 加了
UNIQUE
限制的属性不能取空值 - 码属性不能取空值
- 有
- 空值与另一个值(包括另一个空值)的算术运算的结果为空值
- 空值与另一个值(包括另一个空值)的比较运算的结果为 UNKNOWN
- 空值与另一个值(包括另一个空值)的逻辑运算时,同时考虑其可能为 True 和 False
视图·
- 视图的特点
- 虚表,是从一个或几个基本表(或视图)导出的表
- 只存放视图的定义,不存放视图对应的数据
- 基表中的数据发生变化,从视图中查询出的数据也随之改变
定义视图·
建立视图·
1 | CREATE VIEW |
WITH CHECK OPTION
表示对视图进行UPDATE
,INSERT
,DELETE
操作时要保证更新的行仍然满足视图定义中子查询的条件表达式- 行列子集视图:一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码
删除视图·
1 | DROP VIEW <视图名>[CASCADE] |
- 如果该视图上还导出了其他视图,使用
CASCADE
级联删除语句,把该视图和由它导出的所有视图一起删除 - 删除基表时,由该基表导出的所有视图定义都必须显式地使用
DROP VIEW
语句删除
查询视图·
- 用户角度:查询视图与查询基本表相同
- 关系数据库管理系统实现视图查询的方法:视图消解法
- 进行有效性检查
- 转换成等价的对基本表的查询
- 执行修正后的查询
更新视图·
- 对视图的更新同样也是通过视图消解法实现
第四章 数据库安全性·
第五章 数据库完整性·
- 数据库的完整性
- 正确性:符合现实语义
- 相容性:同一对象在不同表中符合逻辑
- 完整性不等于安全性:前者防止不正确的数据,后者防止非法操作
实体完整性·
实体完整性定义·
-
CREATE TABLE
中用PRIMARY KEY
定义 -
单属性构成的码有两种说明方法
- 定义为列级约束条件
- 定义为表级约束条件
-
对多个属性构成的码
只有一种说明方法
- 定义为表级约束条件
实体完整性检查和违约处理·
插入或对主码列进行更新操作时,关系数据库管理系统自动进行检查。包括:
- 检查主码值是否唯一,如果不唯一则拒绝插入或修改
- 全表扫描
- 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
参照完整性·
参照完整性定义·
- 在
CREATE TABLE
中用FOREIGN KEY
短语定义哪些列为外码 - 用
REFERENCES
短语指明这些外码参照哪些表的主码
参照完整性检查和违约处理·
处理策略
- 拒绝执行
- 级联操作
- 设置为空值
用户定义的完整性·
属性上的约束条件·
CREATE TABLE
时定义属性上的约束条件
- 列值非空
NOT NULL
- 列值唯一
UNIQUE
- 检查列值是否满足一个条件表达式
CHECK
- 如果不满足则操作被拒绝执行
元组上的约束条件·
在 CREATE TABLE 语句中可以用 CHECK
短语定义元组上的约束条件,即元组级的限制。同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件。
完整性约束命名子句·
- 完整性约束命名子句
1 | CONSTRAINT <完整性约束条件名><完整性约束条件> |
- <完整性约束条件>包括
NOT NULL
、UNIQUE
、PRIMARY KEY
短语、FOREIGN KEY
短语、CHECK
短语等
- 修改表中的完整性限制
-
eg:
1
ALTER TABLE Student DROP CONSTRAINT C4
断言·
- 断言:任何对断言中所涉及的关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行
创建断言·
1 | CREATE ASSERTION <断言名> <CHECK 子句> |
删除断言·
1 | DROP ASSERTION <断言名> |
触发器·
定义触发器·
1 | CREATE TRIGGER <触发器名> |
- 当特定的系统事件发生时,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则不执行该动作
- 表的拥有者才可以在表上创建触发器
- 触发器名
- 触发器名可以包含模式名,也可以不包含模式名
- 同一模式下,触发器名必须是唯一的
- 触发器名和表名必须在同一模式下
- 表名
- 触发器只能定义在基本表上,不能定义在视图上
- 当基本表的数据发生变化时,将激活定义在该表上相应触发事件的触发器
- 触发事件可以是
INSERT
、DELETE
或UPDATE
也可以是这几个事件的组合- 还可以
UPDATE OF<触发列,...>
,即进一步指明修改哪些列时激活触发器 AFTER
/BEFORE
是触发的时机AFTER
表示在触发事件的操作执行之后激活触发器BEFORE
表示在触发事件的操作执行之前激活触发器
- 还可以
- 触发器类型
- 行级触发器
FOR EACH ROW
- 语句级触发器
FOR EACH STATEMENT
- 行级触发器
- 触发条件
- 触发器被激活时,只有当触发条件为真时触发动作体才执行;否则触发动作体不执行。
- 如果省略
WHEN
触发条件,则触发动作体在触发器激活后立即执行
激活触发器·
- 触发器的执行,是由触发事件激活的,并由数据库服务器自动执行
- 顺序:
BEFORE
触发器,激活触发器的 SQL 语句,AFTER
触发器
- 顺序:
删除触发器·
1 | DROP TRIGGER <触发器名> ON <表名> |
第六章 关系数据理论·
问题的提出·
- 针对具体问题,如何构造一个适合于它的数据模式——关系数据库的规范化理论
- 关系模式由五部分组成,是一个五元组:R(U, D, DOM, F)
- 五元组 (R, U, D, DOM, F),其中各个部分的含义如下:
- R:表示关系模式的名称或标识符。它是关系模式的名称,用于唯一标识该关系模式。
- U:表示关系模式的属性集合(Attribute Set)。属性是关系模式中的列或字段,用于描述关系中的数据项。U 是属性集合的符号,它包含了关系模式中的所有属性。
- D:表示关系模式的域(Domain)。域是属性的取值范围或数据类型。D 是域的符号,它定义了关系模式中各个属性的可能取值范围。
- DOM:表示属性与域之间的映射关系(Domain Mapping)。它描述了关系模式中每个属性与其对应域之间的关系。
- F:表示关系模式的函数依赖集合(Functional Dependency Set)。函数依赖描述了属性之间的依赖关系,即一个属性的值决定了其他属性的值。F 是函数依赖集合的符号,它包含了关系模式中的所有函数依赖关系。
- 由于D、DOM与模式设计关系不大,因此在本章中把关系模式看作一个三元组:R<U,F>
- 当且仅当 U上的一个关系 r 满足 F 时,r 称为关系模式 R<U,F> 的一个关系
- 作为二维表,关系要符合一个最基本的条件:每个分量必须是不可分开的数据项
- 满足了这个条件的关系模式就属于第一范式(1NF)
- 五元组 (R, U, D, DOM, F),其中各个部分的含义如下:
- 数据依赖:是一个关系内部属性与属性之间的一种约束关系
- 通过属性间值的相等与否体现出来的数据间相互联系
- 函数依赖 FD ;多值依赖 MVD
规范化·
函数依赖·
- 对 r 上的任意 2 个元组 , 如果 ,则
- X 称为该函数依赖的决定因素
- 表示 1:n 关系
- 若,并且 , 则记为
- 表达 1:1 关系
- 若 Y 不函数依赖于 X, 则记为
- 表达 m:n 关系
- 函数依赖是语义范畴的概念,只能根据数据的语义(也就是应用需求)来确定一个函数依赖
- ,但 则称 是非平凡的函数依赖;如果 则为平凡的函数依赖
- 对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义;所以一般讨论非平凡的函数依赖
- 完全函数依赖:在R(U) 中,如果 并且对于 X 的任何一个真子集, 都有 , 则称 Y 对 X 完全函数依赖,记作
- 若 X→Y,但 Y 不完全函数依赖于 X ,则称 Y 对 X 部分函数依赖,记作
- 传递依赖:如果 则称 Z 对 X 传递函数依赖
- 但是 时,Z 直接依赖于 X
码·
- 候选码:设 K 为 R<U,F> 中的属性或属性组合。若 ,则K 称为 R 的一个候选码
- 如果,K 称为超码
- 候选码是最小的超码
- 主码是候选码中选出一个
- 主属性与非主属性
- 包含在任何一个候选码中的属性,称为主属性
- 不包含在任何码中的属性称为非主属性或非码属性
- 全码:整个属性组是码
- 外码:关系模式 R 中属性或属性组X 并非R 的码,但X 是另一个关系模式的码,则称X 是R 的外码
范式·
- 范式:符合某一种级别的关系模式的集合
- 关系数据库中的关系必须满足不同范式,记为
- 规范化:低一级范式的关系模式,通过模式分解转换为若干个高一级范式的关系模式的集合的过程
1NF·
强调的是列的原子性,即列不能够再分成其他几列。
考虑这样一个表:【联系人】(姓名,性别,电话)如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨别,但是 2NF 和 3NF 就容易搞混淆。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。
2NF·
- 首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
- 2NF:若关系模式 ,并且每一个非主属性都完全函数依赖于任何一个候选码,则
- 解决了非主属性对复合主键的部分依赖,对于单一候选键,一定符合
3NF·
- 在1NF基础上,任何非主属性不依赖于其它非主属性[在2NF基础上消除传递依赖]。
- 设关系模式 R∈1NF,若R 中不存在这样的码 X、属性组 Y 及非主属性 , 使得 , 成立, 不成立,则称R∈3NF
- 解决非主属性之间的依赖关系
BCNF·
- 设关系模式 R∈1NF,若 X→Y 且 Y⊆X 时 X 必含有码,则 R∈BCNF
- 即:每一个决定属性集都包含候选码
- BCNF 在函数依赖范畴内实现了模式的彻底分解,达到了最高的规范化程度,消除了插入异常和删除异常
多值依赖·
- 设R(U) 是属性集U 上的一个关系模式。X,Y,Z 是 U 的子集,并且 。关系模式 R(U) 中多值依赖 成立,当且仅当对 R(U) 的任一关系 r,给定的一对 (x,z) 值,有一组 Y 的值,这组值仅仅决定于 x 值而与 z 值无关。
- 若,而 Z 为空,则称 为平凡的多值依赖。
- 否则称 为非平凡的多值依赖
- 多值依赖的性质
- 多值依赖具有对称性
- 多值依赖具有传递性
- 函数依赖是多值依赖的特殊情况
4NF·
- 关系模式 ,如果对于 R 的每个非平凡多值依赖 ,X 都含有码,则
- 4NF 就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖
规范化小结·


第七章 数据库设计·
数据库设计概述·
数据库设计的特点·
- 三分技术,七分管理,十二分基础数据
- 几个常用述语
- 元数据:指公司数据资产管理的基础,是关于“数据的数据”
- 例如数据类型、数据定义、数据关系等
- 相当于数据表格中的表头信息
- 主数据:指满足跨部门业务协同需要的、反映核心业务实体状态属性的企业基础信息
- 元数据:指公司数据资产管理的基础,是关于“数据的数据”
数据库设计方法·
- 手工试凑法
- 规范设计法
- 新奥尔良(New Orleans)方法
- 基于E-R模型的数据库设计方法
- 3NF(第三范式)的设计方法
- 面向对象的数据库设计方法
- 统一建模语言(UML)方法
数据库设计的基本步骤·
- 数据库设计分6个阶段
- 需求分析
- 概念结构设计:概念模型,E-R 图(概念模式)
- 逻辑结构设计:关系,非关系(外模式)
- 物理结构设计:存储结构(内模式)
- 数据库实施
- 数据库运行和维护
需求分析·
需求分析的任务·
需求分析的方法·
- 结构化分析方法
数据字典·
- 数据字典:描述数据流、数据存储的逻辑内容
- 数据项:最小组成单位
- 数据结构:反映了数据之间的组合关系
- 数据流:数据结构在系统内传输的路径
- 数据存储:数据结构停留或保存的地方
- 处理过程:描述处理过程的说明性信息
概念结构设计·
概念模型·
-
将需求分析得到的
用户需求
抽象为概念模型
- 易于理解
- 真实反映世界
E-R 模型·
-
E-R模型的基本观点:
世界是由一组称作实体的基本对象和这些对象之间的联系构成的
- 刻画:实体、属性、联系、关键字/码
实体之间的联系·
- 两个实体型之间的联系
- 一对一联系(1∶1)
- 一对多联系(1∶n)
- 多对多联系(m∶n)
- 联系的度:参与联系的实体型的数目
E-R图·
- E-R图提供了表示实体型、属性和联系的方法:
- 实体型:用矩形表示,矩形框内写明实体名。
- 属性:用椭圆形表示,并用无向边将其与相应的实体型连接起来
- 联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标上联系的类型(1∶1,1∶n或m∶n)
- Chen ERD
- Crow’s Foot Notation
概念结构设计·
实体与属性的划分原则·
- 实体应包含描述信息
- 如果一个数据元素有描述型信息,该数据元素应被识别为实体
- 如果一个数据元素只有一个标识名,则其应被识别为属性
- 两条准则:
- 属性必须是不可分的数据项,不能包含其他属性
- 属性不能与其他实体具有联系
- 两条准则:
实体属性·
- 简单与复合属性.
- 单值与多值属性
- 多值属性通常被识别为实体
- 派生属性
- 可以从其他属性计算而来
- 属性依附
- 把属性附加在其最直接描述的实体上
E-R图的集成·
- E-R图的集成一般需要分两步
- 合并。解决各分E-R图之间的冲突,将分E-R图合并起来生成初步E-R图
- 冲突主要有三类:
- 属性冲突:属性域冲突、属性取值单位冲突
- 命名冲突:同名异义、异名同义
- 结构冲突:
- 同一对象在不同应用中具有不同的抽象
- 同一实体在不同子系统的E-R图中所包含的属性个数和属性排列次序不完全相同
- 实体间的联系在不同的E-R图中为不同的类型
- 冲突主要有三类:
- 修改和重构。消除不必要的冗余,生成基本E-R图
- 冗余的数据:指可由基本数据导出的数据
- 冗余的联系:指可由其他联系导出的联系
- 以数据字典和数据流图为依据,分析消除
- 合并。解决各分E-R图之间的冲突,将分E-R图合并起来生成初步E-R图
逻辑结构设计·
E-R图向关系模型的转换·
转换原则·
- 一个实体型转换为一个关系模式。
- 关系的属性:实体的属性
- 将每个分量属性作为复合属性所在实体的属性
- 或者,将复合属性本身作为所在实体的属性
- 关系的码:实体的码
- 多值属性的转换:将多值属性与所在实体的关键字一起组成一个新的关系
- 实体型间的联系有以下不同情况
-
1:1 联系
(1)转换为一个独立的关系模式
关系的属性:与该联系相连的各实体的码以及联系本身的属性
(2)或,与某一端实体对应的关系模式合并
合并后关系的属性:加入另一端关系的码和联系本身的属性
-
1:n 联系
(1)转换为一个独立的关系模式
关系的属性:与该联系相连的各实体的码以及联系本身的属性
关系的候选码:n端候选码
(2)与 n 端对应的关系模式合并
合并后关系的属性:在n端关系中加入1端关系的码和联系本身的属性
合并后关系的候选码:不变
倾向于用这种
-
m:n 联系
(1)转换为一个关系模式
关系的属性:与该联系相连的各实体的码以及联系本身的属性
关系的候选码:各实体码的组合
-
三个或三个以上实体间的一个多元联系转换为一个关系模式
关系的属性:与该联系相连的各实体的码以及联系本身的属性
-
具有相同码的关系模式可合并
数据模型的优化·
- 对关系模式进行必要分解
- 水平分解:把关系的元组分成若干子集合,定义每个子集合为一个子关系,以提高系统的效率
- 垂直分解:将一个属性比较多,一行数据比较大的表,将不同的属性拆分到不同的表中以降低单表大小,达到提升性能的方法
设置用户子模式·
- 使用更符合用户习惯的别名
- 针对不同级别的用户定义不同的视图,以保证系统的安全性
- 简化用户对系统的使用:复杂查询定义为视图
物理结构设计·
关系模式存取方法选择·
B+ 树索引存取方法·
- 选择索引方法从一般规则
- 一个(一组)属性经常在查询条件中出现
- 一个属性经常作为最大值和最小值等聚集函的参数
- 一个(一组)属性经常在连接操作的连接条件中出现
Hash 索引存取方法·
-
选择 hash 存取方法的规则如下:如果一个关系的属性主要出现在
等值连接条件
中或主要出现在
等值比较选择条件
中,而且满足下列两个条件之一,则该关系可以选择 hash 存取
- 一个关系的大小可预知,而且不变
- 关系的大小动态改变,但 DBMS 提供了动态 hash 存取方法
聚簇存取方法·
- 聚簇:为了提高某个属性(组)的查询速度,将这个(些)属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块中,称为聚簇
- 建立聚簇索引后,基表中数据也需要按照指定的聚簇属性值的升序或降序存放。即,聚簇索引的索引项顺序与表中元组的物理顺序一致
- 聚簇索引的使用条件
- 很少对基表进行增删操作
- 很少对其中的变长列进行修改操作