第1章 数据库系统世界
数据库(DB):
- 从本质上讲
数据库
就是信息的集合。 - 一般来说,数据库是指
数据库管理系统
(DBMS)管理的数据集合。
数据库管理系统(DBMS):
- 数据定义语言(DDL)
- 数据查询和操纵语言(DML)
- 支持大容量数据的长期存储
- 具有持久性
- 支持数据共享
数据库系统(DMS):
数据库系统通常由软件、数据库和数据管理员组成。
- 数据库(DB)
- 数据库管理系统(DBMS)
- 数据库管理员(DBA)
- 数据库应用程序(APP)
数据库设计步骤:
- 需求收集和分析
- 概念结构设计
- 逻辑结构设计
- 物理结构设计
- 物理实现
- 数据库运行和维护
第2章 关系数据模型
关系模型基础
数据模型:
- 数据结构
- 数据操作
- 数据上的约束
常用的数据模型:层次模型、网状模型、关系模型。
关系:数据以一张二维表格描述。
属性:关系的列,是关系特征的描述。
模式:关系名和其属性的集合。例如movies(title, year, length, genre)。
元组:除属性行外,关系的每一行对应一个元组。例如(红海行动, 2018, 138, 动作)。
域:属性的数据类型即取值范围。
关系的性质:
- 不能出现相同的行
- 不能出现相同的列名
- 列是不可分割的最小数据项
- 可以交换任意两行的顺序
- 可以交换任意两列的顺序
- 每一列的数据类型、取值范围必须一致
关系的操作:
- 关系代数的操作对象是
关系
- 关系代数的操作
- 并、交、差
- 选择、投影
- 乘
- 重命名
R ∪ S : 属 于 R 或 属 于 S 的 所 有 元 组 构 成 的 新 关 系 。 R ∩ S : 属 于 R 也 属 于 S 的 所 有 元 组 构 成 的 新 关 系 。 R − S : 属 于 R 且 不 属 于 S 的 所 有 元 组 构 成 的 新 关 系 。 R \cup S:属于R或属于S的所有元组构成的新关系。\\ R \cap S:属于R也属于S的所有元组构成的新关系。\\ R-S:属于R且不属于S的所有元组构成的新关系。 R∪S:属于R或属于S的所有元组构成的新关系。R∩S:属于R也属于S的所有元组构成的新关系。R−S:属于R且不属于S的所有元组构成的新关系。
投影运算:
π A 1 A 2 . . . A n ( R ) : 从 关 系 R 中 取 出 A 1 A 2 . . . A n 列 生 成 一 个 新 的 关 系 。 例 : π t i t l e , y e a r , s t u d i o N a m e ( M o v i e s 1 ) \pi_{A_1A_2...A_n}(R):从关系R中取出A_1A_2...A_n列生成一个新的关系。\\ 例:\pi_{title, year, studioName}(Movies1) πA1A2...An(R):从关系R中取出A1A2...An列生成一个新的关系。例:πtitle,year,studioName(Movies1)
选择运算:
σ c ( R ) : 从 关 系 R 中 取 出 满 足 条 件 c 的 元 组 生 成 一 个 新 的 关 系 。 例 : σ l e n g t h > 100 ( M o v i e s 1 ) σ c ( R ) 中 表 达 式 c 可 以 使 用 的 运 算 符 : 比 较 运 算 符 : < , ≤ , > , ≥ , = , ≠ 逻 辑 运 算 符 : ! , o r , a n d ( 非 、 或 、 与 ) \sigma_c(R):从关系R中取出满足条件c的元组生成一个新的关系。\\ 例:\sigma_{length>100}(Movies1)\\ \sigma_c(R)中表达式c可以使用的运算符:\\ 比较运算符:\lt, \le, \gt, \ge, =, \ne 逻辑运算符:!, or, and(非、或、与) σc(R):从关系R中取出满足条件c的元组生成一个新的关系。例:σlength>100(Movies1)σc(R)中表达式c可以使用的运算符:比较运算符:<,≤,>,≥,=,=逻辑运算符:!,or,and(非、或、与)
选择和投影的组合运算:
例:查询2019年以前拍的动作片的片名和年份。
π t i t l e , y e a r ( σ y e a r < 2019 a n d g e n r e = ′ 动 作 ′ ( M o v i e s 1 ) ) \pi_{title, year}(\sigma_{year\lt2019 \, and \, genre='动作'}(Movies1)) πtitle,year(σyear<2019andgenre=′动作′(Movies1))
关系的重命名:
ρ s ( R ) : 命 名 后 的 关 系 S 与 R 有 完 全 相 同 的 元 组 , 属 性 名 也 相 同 , 只 是 关 系 的 名 称 变 为 S 。 ρ s ( A 1 , A 2 , . . . A n ) ( R ) : 命 名 后 的 关 系 S 与 R 有 完 全 相 同 的 元 组 , 不 仅 关 系 的 名 称 变 为 S , 关 系 R 中 的 属 性 在 S 中 也 依 次 改 名 为 A 1 , A 2 , . . . , A n 。 \rho_s(R):命名后的关系S与R有完全相同的元组,属性名也相同,只是关系的名称变为S。\\ \rho_s(A1,A2,...An)(R):命名后的关系S与R有完全相同的元组,不仅关系的名称变为S,关系R中的属性在S中也依次改名为A_1,A_2,...,A_n。 ρs(R):命名后的关系S与R有完全相同的元组,属性名也相同,只是关系的名称变为S。ρs(A1,A2,...An)(R):命名后的关系S与R有完全相同的元组,不仅关系的名称变为S,关系R中的属性在S中也依次改名为A1,A2,...,An。
第3章 关系数据库设计理论
BC范式
关系R是BCNF的充要条件:每个非平凡FD的左边必定是超键。
任意一个二元关系是BCNF。
分解BCNF的方法:
-
找到R中任意一个BCNF违例FD
A -> B
设A = {A1A2…An}
B = {B1B2…Bn}
C = {C1C2…Cn}
计算违例左边属性集的闭包:{A}+ = {A, B, C},其中C是推导出的属性集。
-
将关系R分解成两个关系:
R1(A, B, C),即A闭包中的所有属性
R2(A, R中除A, B, C之外的所有属性)
-
对R1和R2重复(1)、(2)的步骤,直到分解出来的
所有关系均没有违例
。
例:关系R(A, B, C, D, E),含有FD:AB -> C,DE -> C 和 B->D。
判断关系R是否BCNF,如果不是,请分解成一系列BCNF关系集合。
从违例AB -> C开始分析:
-
确定键,通过求元素的闭包,得到键{ABE}
-
找出一个违例 AB -> C,计算{AB}+ = {ABCD}
-
将关系R分解为R1 (A,B,
C,D
) 和 R2 (A,B,E
) -
对R1和R2重复上述步骤
R1的键是{AB},存在违例B -> D,将关系R1分解成R11(B,
D
),R12(B,A,C
),R11和R12都是BCNF。R2的键是{ABE},R2是BCNF。
所以,可以将关系R分解为R11(B,D),R12(B,A,C)和R2(A,B,E)三个关系。
从违例DE->C开始分析:
-
确定键,通过求元素的闭包,得到键{ABE}
-
分析违例DE -> C,计算{DE}+ = {DEC}
-
将关系R分解为R1(D,E,
C
)和R2(D,E,A,B
) -
对R1和R2重复上述步骤
R1(D,E,C)的键是{DE},不存在违例,R1是BCNF。
R2(D,E,A,B),{ABE}是键,B->D是违例,将R2分解为R21(B,
D
)、R22(B,A,E
),{BAE}是键,R22是BCNF。所以,可以将关系R分解为R21(B,D),R22(B,A,E)和R1(D,E,C)三个关系。
3NF
条件:对于关系R上的任一非平凡FD:A -> B。满足A是超键
或B由主属性
组成(候选键中的属性统称为主属性),称关系R满足第三范式。
3NF与BCNF:
- 关系R若满足BCNF也一定满足3NF
- 关系R若满足3NF不一定满足BCNF
- BCNF是基于函数依赖的最高范式,但不是数据库模式设计的最高范式
第4章 高级数据库模型
E/R模型
三要素:
- 实体集
- 属性
- 联系
第5章 代数和逻辑查询语言
第6章 数据库语言SQL
在SQL中定义关系模式
使用CREATE TABLE定义关系模式
数据类型 | 长度 | 取值范围 |
---|---|---|
NCHAR(n) | 定长字符串,字符串长度规定为n | 最多4000字符,个数由n决定 |
NVARCHAR(n) | 由字符串实际长度决定最多不超过n个字符 | 最多4000字符,个数由n决定 |
NTEXT | 存放文本,长度由字符实际个数决定 | 最多230-1个字符 |
INT | 4字节 | -230~231-1 |
SMALLINT | 2字节 | -215~215-1 |
BIT | 1字节 | 1或0 |
DATETIME | 8字节 | 1753-01-01~9999-12-31 |
SMALLDATETIME | 4字节 | 1900-01-01~2079-06-06 |
FLOAT | 8字节 | 表示近似的浮点数值 |
DECIMAL(n,m) | 允许n位十进制数,小数部分占m位 | 表示精确的浮点数值 |
NUMERIC(n,m) | 同上 | 同上 |
CREATE TABLE Movies (
id INT IDENTITY(1,1)
title NCHAR(50),
year INT,
length INT,
genre NCHAR(10),
studioName NVARCHAR(30),
producerC# INT
);
CREATE TABLE Movies_1 (
title NCHAR(50),
date DATETIME,
bookOffice DECIMAL(6,2),
length INT,
genre NCHAR(10),
studioName NVARCHAR(30),
producerC# INT
);
定义主键约束
- 有多个主键时
CREATE TABLE Movies (
title NCHAR(50),
year INT,
length INT,
genre NCHAR(10),
studioName NVARCHAR(30),
producerC# INT,
PRIMARY KEY(title, year)
);
- 只有一个主键时
CREATE TABLE MovieStars (
name NCHAR(30) PRIMARY KEY,
address NVARCHAR(255),
gender CHAR(1),
birthdate DATETIME
);
定义唯一值约束
CREATE TABLE MovieStars(
name NCHAR(30) PRIMARY KEY,
address NVARCHAR(255) UNIQUE,
gender CHAR(1),
birthdate DATETIME
);
UNIQUE约束:在该列的取值必须唯一,但可以取空值。
PRIMARY KEY约束:在该列的取值必须唯一,不能取空值。
定义空值约束NULL
CREATE TABLE MovieStars(
name NCHAR(30) PRIMARY KEY,
address NVARCHAR(255) UNIQUE NOT NULL,
gender CHAR(1),
birthdate DATETIME
);
NULL约束:除了主键外,默认都是可以取空值的。
NOT NULL约束:表示该列不能取空值。
基于属性的CHECK约束
CREATE TABLE MovieStar(
name NCHAR(30) PRIMARY KEY,
address NVARCHAR(255) UNIQUE NOT NULL,
gender CHAR(1) CHECK(gender in ('F', 'M')),
birthdate DATETIME
);
CREATE TABLE MovieStars(
name NCHAR(30) PRIMARY KEY,
address NVARCHAR(255) UNIQUE NOT NULL,
gender CHAR(1),
birthdate DATETIME,
CONSTRAINT gender_ck CHACK(gender in ('F', 'M'))
);
基于元组的CHECK约束
CREATE TABLE MovieStars(
name NCHAR(30) PRIMARY KEY,
address NVARCHAR(255),
gender CHAR(1),
birthdate DATETIME,
CONSTRAINT gender_ck CHECK(gender='F' OR address IS NOT NULL)
);
设置默认值
CREATE TABLE MovieStars(
name NCHAR(30) PRIMARY KEY,
address NVARCHAR(255),
gender CHAR(1) DEFAULT 'M',
birthdate DATETIME DEFAULT '0000-00-00'
);
修改关系模式
DROP TABLE MovieStars
ALTER TABLE MovieStars ADD mobile NCHAR(11) DEFAULT 'unlisted';
ALTER TABLE MovieStars DROP mobile;
SQL中的简单查询
SELECT…FROM…WHERE
SELECT *
FROM Movies
WHERE studioName='Disney' AND year=2019
SQL中的投影
SELECT title, length
FROM Movies
WHERE studioName='Disney' AND year=2019
投影同时更改属性名
SELECT title AS name, length duration
FROM Movies
WHERE studioName='Disney' AND year=2019
用表达式取代属性
SELECT title name, length/60 lengthInHoues
FROM Movies
WHERE studioName='Disney' AND year=2019
用常量表达式取代属性
SELECT title name, length/60.0 lengthInHoues, 'hrs' inHours
FROM Movies
WHERE studioName='Disney' AND year=2019
查询1980年到1990年间出生的男演员。
SELECT name
FROM MovieStars
WHERE gender = 'M' AND birthdate BETWEEN '1980-01-01' AND '1990-12-31'
拷贝表 SELECT INTO 和 INSERT INTO SELECT的区别
第7章 约束与触发器
第8章 视图与索引
第9章 服务器环境下的SQL
附录 中英文词汇对照
中文 | 英文 |
---|---|
键 | key |
超键 | candidate key |
主键 | primary key |
超键 | superkeys |
外键 | foreign key |
违例 | violation |
约束 | constraint |