数据库系统概论
关系数据模型
关系模型基础
关系:数据以一张二维表格描述
属性:关系的列,是关系特征的描述。
模式:关系名和其属性的集合 movies(title, year,length, genre)
元组:除属性行外,关系的每一行对应一个元组。
域:属性的数据类型及取值范围。
关系的性质:
- 不能出现相同的行
- 不能出现相同的列名
- 列是不可分割的最小数据项
属性相同,属性域相同才可以进行并交差的运算,投影运算$\pi_{A_1A_2…A_n}(R)$从关系R中取出这些列生成一个新的关系(表),$\sigma_{c}(R)$从关系R中取出满足条件C的元组生成一个新的关系
关系代数
笛卡儿积运算:关系R和关系S的乘运算,记作R×S,不需要相同部分,每一行去选另一个关系的一行
关系R | 关系S | R×S | |
---|---|---|---|
属性个数 | i | j | i+j |
元组个数 | m | n | m×n |
元组 | r | s | <r,s> |
自然连接:R$\bowtie$S,需要有相同的部分
$\theta$连接:关系R和关系S满足条件c的自然连接连接表示为R$\bowtie_{c}$S
重命名:$\rho_{S}(A_1,A_2,\dots,A_n)(R)$对关系R进行重命名,拥有相同的元组,关系名字变成了S,各属性分别命名为$A_n$,如果属性名不变的话可写作$\rho_s(R)$
关系上的约束
关系中的某一属性或属性组的值能唯一标识一个元组,则称该属性或属性组为关系的键(码)
sql里的主键(id),唯一标识
一个关系中存在多个键,这些键统称为候选键,从候选键中选一个键作为关键的键,这个键被称为主键,候选键中的属性统称为主属性
完整性约束:
若属性A是关系R的主键,则属性A不能是空值NULL
外键(外码)与参照关系:
设F
是关系R
的一个或一组属性,G
是关系S
的键,F
不是关系R
的主键,如果F
与G
,则称:
F
是关系R
的外键- 关系
R
为参照关系 - 关系
S
为被参照关系
因此
F
的取值要么取空值即没有对应关系,要么等于某一个G
的值
$$
\pi_{CNAME}([\rho_{SC1}(SC)\bowtie_{SC1.S井号=SC2.S井号and SC1.C井号 > SC2.C井号 }\rho_{SC2}(SC)]\bowtie_{SC1.S井号=s.s井号}S )
$$
$$
\pi_{name}(\sigma_{major=’softwarre engineering’}(Scholarship\bowtie_{Scholarship.studentid=Student.sid} Student))
$$
$$
\pi_{amount,year}(\sigma_{name=’Hu Xia’}(Scholarship\bowtie_{Scholarship.studentid=Student.sid} Student))
$$
$$
\pi_{name}([\rho_{S1}(Scholarship)\bowtie_{S1.studentid=S2.studentid ,and,s1.year > S2.year}\rho_{S2}(Scholarship)]\bowtie_{S1.studentid=Student.sid}Student )
$$
$$
\pi_{name}Student-\pi_{name}(Student\bowtie_{Scholarship.studentid=Student.sid}Scholarship)
$$
第三章 关系数据库设计理论
函数依赖
如果关系R的两个元组在属性$A_1,A_2,\dots,A_n$上的值相同,那么它们必定在其它属性$B_1,B_2,\dots,B_n$上的值相同,记作$A_1,A_2,\dots,A_n->B_1,B_2,\dots,B_n$或$A=(A_1,A_2,\dots,A_n),B=(B_1,B_2,\dots,B_n)$,称作,A决定B,或者B依赖于A。$A->A$
A | B | A->B |
---|---|---|
相同 | 相同 | 成立 |
相同 | 不同 | 不成立 |
不同 | 相同 | 成立 |
不同 | 不同 | 成立 |
如果$C->B,C->A$,那么$C->AB,C->ABC$成立
例题:
函数依赖的规则
若两个FD集合S与T满足:
关系的每个实例在满足T中依赖关系的同时也满足S中的函数依赖关系,称S蕴含于T,如果同时T也蕴含于S,那么S和T等价
例:T={A->B},S={A->$B_1$},则S蕴含于T
T={A->B},S={A->$B_1$,A->$B_2$},则T与S等价
FD集合推导规则
- 若两个FD集合等价,用一个FD集合替换另一个FD集合
- 从原有FD集合中推断出新的FD集合
若$A_1A_2\dots A_n->B_1B_2\dots B_m$,等价于$A_1A_2\dots A_n->B_i$
传递规则:设$A=[A_1A_2\dots A_n],B=[B_1B_2\dots B_m],C=[C_1C_2\dots C_k]$为关系R的属性集,若满足FD:A->B且B->C,则A->C成立
设$A=[A_1A_2\dots A_n],B=[B_1B_2\dots B_m],C=[C_1C_2\dots C_k]$:
- 如果$B\subseteq A$,那么A->B,自反率,平凡依赖
- 如果A->B,那么AC->BC,增广率,非平凡依赖
- A->B且B->C,则A->C,传递依赖
一个FD集合S,与S等价的任何FD集合都称为S的基本集
若给定的基本集B满足:
- B中所有FD的右边都是单一属性
- 从B中任何一个FD中删除左边的一个属性或多个属性,B不再是基本集
- 从B中删除任何一个FD,B不再是基本集
则称为最小基本集(最小基)
一个关系可能存在多个最小基本集
例题:
闭包及作用
设$A=(A_1,A_2,\dots,A_n),B=(A_1,A_2,\dots,A_n,B_1,B_2,\dots,B_n)$都是关系R的属性集,S是R上的一个FD集,如果从S中可以推出A->B,称B是A的闭包,记作$A^+$
例题:
BC范式
关系模式R是BCNF的充要条件:R中每一个非平凡FD的左边是超键
如何分解BF范式
例题:
另一种分解
BC范式分解结果不唯一
无损连接:指将一个关系模式分解为多个子关系模式后,通过自然连接等操作能够恢复成原来的关系模式,且恢复后的关系与原关系相比既不丢失信息,也不增加多余信息
表格法判断无损连接
第三范式
关系R上的任一非平凡FD:A->B,满足A是超键或B由候选键中的属性组成
是BF范式一定是第三范式
例题
表格法检验
第一范式:关系的每个属性都是不能再分的
第二范式:每一个非主属性都完全函数依赖于R的候选键
范式对比
第四章 高级数据库模型
ER图
- 实体集:矩形
- 属性:椭圆形及指向实体集的连线
- 联系:棱形及指向实体集的连线
概念设计
- 忠实性
- 避免冗余
- 简单性
- 选择正确的联系
- 选择正确的元素种类
逻辑结构设计
转换规则:
- 一个实体集转化成一个关系模式
- 实体集的属性转化成关系的属性
- 实体集的键转化成关系的键
一对一的联系:
①单独转化成一个关系模式,关系的键为两个实体集的键的组合,联系的属性转化为关系的属性。
创建一个中间表,通过中间表进行相互索引
②将联系与任意一端实体集所对应的关系模式合并,需要在该关系模式的属性中加入另一端实体集的键和联系本身的属性。
外键,通过这个键去索引另一个表
多对一的联系:
通常是从多的那端添加外键去索引一,若一去索引多则会冗长
多对多的联系:
创建一个中间表进行索引
isa联系
弱实体联系转化为关系
第五章 代数和逻辑查询语言
包上的关系操作
集合:元素的一种聚集形式,不允许重复元素出现
包:元素的一种聚集形式,允许重复元素出现
包的并运算
包的交运算
包的差运算
包的投影运算
包的选择运算
包的笛卡尔积的运算
包的连接运算
关系代数的扩展操作符
消除重复
数据库语言
在SQL中定义关系模式
nvarchar
SQL中的简单查询
1 |
|
触发器
是一种特殊的数据库对象,它在指定的数据库事件(如 INSERT
、UPDATE
、DELETE
)发生时自动执行预定义的操作。触发器常用于实现数据一致性约束、审计日志记录、级联更新/删除等业务逻辑。
特性 | 说明 |
---|---|
触发事件 | INSERT 、UPDATE 、DELETE (可单独或组合使用)。 |
触发时机 | BEFORE (操作前执行)或 AFTER (操作后执行)。 |
触发粒度 | 行级触发器(每行操作触发一次)或 语句级触发器(整个语句触发一次)。 |
适用场景 | 数据校验、自动填充字段、维护业务规则、记录审计日志等。 |
1 |
|
触发器的常见应用场景
示例 1:数据校验(BEFORE INSERT)
确保插入的订单金额大于 0:
1 |
|
- 效果:插入金额 ≤ 0 的订单会抛出错误。
示例 2:自动维护审计日志(AFTER UPDATE)
记录用户信息的修改历史:
1 |
|
- 效果:每次更新用户邮箱时,自动记录到
audit_log
表。
示例 3:级联更新库存(AFTER INSERT)
插入订单后自动减少库存:
1 |
|
- 效果:新订单插入后,对应产品的库存自动减少。
例子:
假设有一个 orders
订单表和一个 audit_log
审计日志表,需求是:每次订单状态更新时,自动记录修改日志。
1 |
|
触发器代码
1 |
|
DECLARE:声明变量
1 |
|
- 作用:声明一个变量,并指定其数据类型(如
INT
、VARCHAR
、DECLIMAL
等)。 - 适用场景:存储过程、函数、触发器或批处理脚本中。
1 |
|
注意:
- 作用域:变量仅在声明它的代码块(如
BEGIN...END
)内有效。 - 默认值:若不指定
DEFAULT
,变量初始值为NULL
。
SET:变量赋值
1 |
|
- 作用:为已声明的变量赋值。
- 区别:
SET
直接赋值。SELECT INTO
从查询结果中赋值(要求结果必须为单行单列)。
1 |
|
1 |
|
DECLARE 和 SET 的完整流程
1 |
|
执行结果:
result_text |
---|
成年用户数量:5 |
t-sql
T-SQL (Transact-SQL) 是 Microsoft SQL Server 使用的 SQL 扩展语言,它在标准 SQL 基础上增加了许多功能
1 |
|
存储过程
存储过程(Stored Procedure)是预编译的 T-SQL 语句集合,存储在数据库中
1 |
|
例子:
简单查询存储过程
1 |
|
带输出参数的存储过程
1 |
|
带条件逻辑的存储过程
1 |
|
单词表
intersection 交集