目录
- 1. 关系数据结构与定义
- 1.1. 核心概念图
- 1.2. 详细内容解析
- 1.2.1. 关系模型三要素
- 1.2.2. 关系
- 1.2.2.1. 关系的数学定义
- 1.2.2.2. 键的类型对比
- 1.2.2.3. 关系的三种类型
- 1.2.2.4. 基本关系的六条性质
- 1.2.3. 关系模式
- 1.2.3.1. 关系模式的定义
- 1.2.4. 关系数据库
- 1.2.4.1. 定义与特点
- 1.2.4.2. 关系数据库的组成
- 1.2.4.3. 典型应用场景
- 1.2.5. 关系模型的存储结构
- 1.2.5.1. 逻辑存储 vs 物理存储
- 1.2.5.2. 物理存储结构
- 1.2.5.3. 存储结构示例
- 1.2.5.4. 存储模型图
- 1.3. 关键总结
- 1.4. 常见误区
- 2. 关系操作
- 2.1. 关系操作与关系数据语言分类
- 2.1.1. 基本关系操作
- 2.1.2. 关系操作的核心特点
- 2.1.3. 关系数据语言分类
- 2.1.3.1. 关系代数(Relational Algebra)
- 2.1.3.2. 关系演算(Relational Calculus)
- 2.1.3.3. SQL(Structured Query Language,结构化查询语言)
- 2.1.3.4. 对比表格
- 3. 关系的完整性
- 3.1. 关系完整性概述
- 3.2. 完整性分类详解
- 3.2.1. 实体完整性
- 3.2.2. 参照完整性
- 3.2.3. 用户定义的完整性
- 3.2.4. 对比表格
- 3.3. 案例分析
- 3.3.1. 案例1:违反参照完整性
- 3.3.2. 案例2:用户定义约束冲突
- 3.4. 常见问题与解决方案
- 3.5. 知识扩展
- 4. 关系代数
- 4.1. 关系代数概览
- 4.2. 传统集合运算
- 1. 并(Union)
- 2. 差(Difference)
- 3. 交(Intersection)
- 4. 广义笛卡尔积(Extended Cartesian Product)
- 4.3. 专门关系运算
- 1. 选择(Selection)
- 2. 投影(Projection)
- 3. 连接(Join)
- a. θ \theta θ-连接 (Theta Join)
- b. 等值连接 (Equijoin)
- c. 自然连接 (Natural Join)
- d. 外连接 (Outer Join)
- 4. 除(Division)
- 4.4. 综合应用案例:学生选课系统
- 4.4.1. 场景描述
- 4.4.2. 查询需求与关系代数表达
- 4.4.3. 对比表格
- 4.4.4. 流程图
- 4.5. 重点总结
- 5. 关系演算
- 5.1. 元组关系演算语言ALPHA
- 5.1.1. ALPHA 语言概览
- 5.1.2. ALPHA 语法核心元素
- 5.1.2.1. 元组变量声明
- 5.1.2.2. 检索操作(GET)
- 5.1.2.3. 量词应用
- 5.1.3. ALPHA 核心操作符
- 5.1.4. 综合应用案例
- 5.1.4.1. 场景描述
- 5.1.4.2. 查询需求与 ALPHA 表达
- 5.1.5. ALPHA 与 SQL 的对应关系
- 5.1.6. 重点总结
- 5.2. ALPHA 数据操作语句
- 5.2.1. 数据操作语句概览
- 5.2.2. 语法详解与案例
- 5.2.2.1. PUT 语句(插入数据)
- 5.2.2.2. HOLD 语句(锁定元组)
- 5.2.2.3. UPDATE 语句(更新数据)
- 5.2.2.4. DELETE 语句(删除数据)
- 5.2.2.5. DROP 语句(删除结构)
- 5.2.3. 事务与并发控制
- 5.2.4.3. 对比表格
- 5.2.4.4. 事务流程图
- 5.2.5. 关键注意事项
- 5.3. 元组关系演算
- 5.3.1. 关系演算概览
- 5.3.2. 元组关系演算(Tuple Relational Calculus)
- 5.3.2.1. 基本语法
- 5.3.2.2. 核心元素
- 5.3.2.3. 示例
- 5.3.3. 域关系演算(Domain Relational Calculus)
- 5.3.3.1. 基本语法
- 5.3.3.2. 示例
- 5.3.4. 关系演算 vs 关系代数
- 5.3.5. 综合应用案例
- 5.3.5.1. 场景描述
- 5.3.5.2. 查询需求与关系演算表达
- 5.3.6.3. 对比表格
- 5.3.7. 重点总结
1. 关系数据结构与定义
1.1. 核心概念图
1.2. 详细内容解析
1.2.1. 关系模型三要素
关系模型是数据库的核心,它通过以下三点管理数据:
- 数据结构:数据以二维表(行是元组,列是属性)的形式组织。每个单元格的值都必须是原子性的,即不可再分。
- 数据操作:对表进行操作(如增删改查),输入是表,输出也是表(封闭性)。用户只需说明“做什么”,不用管“怎么做”(非过程性)。
- 完整性约束:保证数据正确性。
- 实体完整性:主键必须非空且唯一。
- 参照完整性:外键要么指向存在的主键,要么为 NULL。
- 用户自定义完整性:根据业务规则设置的额外限制(如年龄范围)。
1.2.2. 关系
1.2.2.1. 关系的数学定义
理解关系模型,先从数学定义入手:
- 域(Domain)
- 定义:一组相同数据类型和取值范围的值的集合。属性的值必须来自其域。
- 示例:性别域 = {男, 女}。
- 笛卡尔积(Cartesian Product)
- 定义: n n n 个域 D 1 , . . . , D n D_1, ..., D_n D1,...,Dn 中所有可能元组的组合。每个元组包含从每个域取出的一个值。
- 公式: D 1 × ⋯ × D n = { ( d 1 , … , d n ) ∣ d i ∈ D i } D_1 \times \dots \times D_n = \{ (d_1, \dots, d_n) \mid d_i \in D_i \} D1×⋯×Dn={(d1,…,dn)∣di∈Di}
- 关键点:
- 元组:笛卡尔积中的一个元素,对应表中的一行。
- 分量:元组中的一个值,对应表中的一个单元格。
- 基数:域的不同取值数。笛卡尔积的基数是各域基数的乘积。
- 实际意义:一个实际的关系(表)是笛卡尔积的有限子集,只包含有意义的组合。
- 关系的数学表示
- 定义:关系 R R R 是笛卡儿积 D 1 × ⋯ × D n D_1 \times \dots \times D_n D1×⋯×Dn 的一个有限子集,表示为 R ( A 1 , … , A n ) R(A_1, \dots, A_n) R(A1,…,An)。
- n n n 是关系的目或度(属性数量)。
- n = 1 n=1 n=1时,是单元关系(一元关系); n = 2 n=2 n=2时,是二元关系。
- 关系也是一张二维表,每行对应一个元组,每列对应一个域。
- 示例表:
(Sno) 姓名(Sname) 年龄(Sage) 23001 张三 18 23002 李四 19
1.2.2.2. 键的类型对比
键是唯一标识元组和连接关系的重要概念。
键类型 | 定义 | 特性 | 示例 |
---|---|---|---|
候选键 | 能唯一标识元组的最小属性集。 | 可能有多个。 | (学号) 或 (身份证号) |
主键 | 被选中的唯一一个候选键。 | 非空 + 唯一。 | 选定学号为主键 |
外键 | 引用其他关系主键的属性。 | 保证参照完整性。 | 选课表中的"学号"字段 |
超键 | 能唯一标识元组的属性集(不要求最小)。 | 可能包含冗余属性。 | (学号, 姓名) |
1.2.2.3. 关系的三种类型
关系(表)按用途和存储方式分为:
- 基本关系(基本表/Base Table)
- 定义:实际存储数据的表,独立存在,持久化存储。
- 示例:
学生表(学号, 姓名, 专业)
。
- 查询表(Query Result Table)
- 定义:查询后的临时结果集,动态生成,不实际存储。
- 示例:
SELECT 姓名 FROM 学生表 WHERE 专业='计算机'
的结果。
- 视图表(View)
- 定义:通过基本表或其他视图导出的虚表,只存定义,不存数据。
- 特点:提供数据抽象和安全性。
- 示例:
视图_计算机学生 AS SELECT 学号, 姓名 FROM 学生表 WHERE 专业='计算机'
。
1.2.2.4. 基本关系的六条性质
基本关系(二维表)必须满足六条性质:
性质 | 说明 | 示例 |
---|---|---|
1. 列的同质性 | 每列的值必须来自同一域(类型和范围一致)。 | “年龄”列只存整数。 |
2. 属性名的唯一性 | 不同列必须有不同名称。 | 必修课程 和 选修课程 。 |
3. 列的无序性 | 列的顺序不影响数据含义。 | “姓名”或“学号”在前无影响。 |
4. 元组的唯一性 | 任意两行候选码不能完全相同。 | 不能有两条学号相同的学生记录。 |
5. 行的无序性 | 行的顺序不影响数据含义。 | 学生记录存储顺序不影响查询。 |
6. 分量的原子性 | 每个值都必须是不可再分的原子值(第一范式)。 | 联系方式 不能存“电话:123,邮箱:abc”。 |
1.2.3. 关系模式
1.2.3.1. 关系模式的定义
-
概念解析
- 关系模式(Relation Schema):关系的逻辑结构,定义了表的“蓝图”或“模板”。包括属性名、域和完整性约束。
- 数学表示: R ( U , D , D O M , F ) R(U, D, DOM, F) R(U,D,DOM,F),代表属性、域、映射和依赖关系。
-
关系模式 vs 关系实例
对比项 | 关系模式(Schema) | 关系实例(Instance) |
---|---|---|
本质 | 静态结构(表的定义/表头) | 动态数据(表的内容/表体) |
变化 | 设计时确定,修改少。 | 随数据增删改频繁变化。 |
示例 | Student(Sno CHAR(10)) | ('2023001', '张三') |
存储 | 数据字典中。 | 数据文件中。 |
注意:关系模式是“型”,关系实例是“值”。
1.2.4. 关系数据库
1.2.4.1. 定义与特点
- 定义:基于关系模型建立的数据库系统,由相互关联的二维表组成,并通过关系操作管理数据。
- 核心特点:
- 结构化:数据统一为二维表。
- 数据独立性:逻辑与物理存储分离。
- 集合操作:支持强大的 SQL 查询和关系代数运算。
1.2.4.2. 关系数据库的组成
关系数据库由多张通过外键关联的表组成。
1.2.4.3. 典型应用场景
关系数据库广泛应用于:
- 事务型系统(OLTP):如银行、电商订单。依赖 ACID 特性(原子性、一致性、隔离性、持久性)。
- 数据分析(OLAP):进行复杂查询、聚合和报表。
- 案例:学生管理系统、电商平台。
1.2.5. 关系模型的存储结构
关系模型逻辑上是二维表,物理上以文件存储在磁盘上。
1.2.5.1. 逻辑存储 vs 物理存储
层次 | 逻辑存储(用户视角) | 物理存储(系统视角) |
---|---|---|
表现形式 | 二维表。 | 文件、块、页。 |
操作对象 | 表、行、列。 | 磁盘块、索引文件。 |
管理方式 | SQL 语言。 | 存储引擎管理。 |
1.2.5.2. 物理存储结构
- 堆文件(Heap File):数据按插入顺序存储,查询效率低。
- 索引结构:
- B+ 树索引:最常见,适合范围查询和快速检索。
- 哈希索引:适合等值查询。
- 行存储 vs 列存储:
类型 | 行存储 | 列存储 |
---|---|---|
存储单元 | 按行存记录的所有属性值。 | 按列存所有记录的某一属性值。 |
适用场景 | OLTP(事务处理)。 | OLAP(大数据分析)。 |
优点 | 写入快,适合小事务。 | 读取特定列高效,压缩比高。 |
缺点 | 读取部分列效率略低。 | 写入性能低,不适合频繁更新。 |
示例 | MySQL (InnoDB), PostgreSQL。 | ClickHouse, Amazon Redshift。 |
1.2.5.3. 存储结构示例
- 学生表的物理存储(堆文件):
磁盘块1:[学号:2023001, 姓名:张三, 年龄:20][学号:2023002, 姓名:李四, 年龄:21]
- 索引文件(B+树索引):
B+树索引(按学号):根节点 → 中间节点 → 叶子节点(指向磁盘块上的具体元组)
1.2.5.4. 存储模型图
1.3. 关键总结
概念 | 核心要点 |
---|---|
关系模式 | 定义表的结构(属性、域、约束),是“型”。 |
关系数据库 | 由多关系组成,支持查询与事务。 |
存储结构 | 逻辑表映射到物理文件,依赖索引优化。 |
1.4. 常见误区
- 误区1:关系是笛卡尔积。
- 正解:关系是笛卡尔积的有限子集,只包含有意义的元组。
- 误区2:混淆超键与候选键。
- 正解:候选键是能唯一标识元组的最小属性集;超键只要能唯一标识元组即可,可能包含冗余属性。
- 误区3:空值(NULL)处理不当。
- 注意:空值表示未知或不适用,
NULL > 18
或NULL = NULL
都返回未知。SQL 查询需用IS NULL
/IS NOT NULL
。
- 注意:空值表示未知或不适用,
2. 关系操作
2.1. 关系操作与关系数据语言分类
2.1.1. 基本关系操作
关系模型提供了一套封闭、非过程化的操作集,输入和输出都是关系。
- 核心操作类型:
- 传统集合运算:针对行的操作,要求关系同构或相容(属性数相同,域兼容)。
- 并 ( ∪ \cup ∪)
- 差 ( − - −)
- 交 ( ∩ \cap ∩)
- 笛卡尔积 ( × \times ×)
- 专门关系运算:关系模型独有,处理行和列。
- 选择 ( σ \sigma σ)
- 投影 ( π \pi π)
- 连接 ( ⋈ \bowtie ⋈)
- 除 ( ÷ \div ÷)
- 传统集合运算:针对行的操作,要求关系同构或相容(属性数相同,域兼容)。
2.1.2. 关系操作的核心特点
- 集合操作特性:
- 封闭性:输入输出皆为关系,允许嵌套组合查询。
- 操作的对象和结果都是集合,非单个元组。
- 非过程化特性:用户只需声明“做什么”,无需指定“怎么做”。
- 抽象层级:逻辑层操作,独立于物理存储结构。
2.1.3. 关系数据语言分类
关系数据语言根据过程化程度分为几类:
2.1.3.1. 关系代数(Relational Algebra)
- 特点:过程化语言。通过运算符组合和序列表达查询步骤。
2.1.3.2. 关系演算(Relational Calculus)
- 特点:非过程化语言。基于谓词逻辑,描述结果应满足的条件。
- 子类:
- 元组关系演算:以元组变量为核心 (如 ALPHA, QUEL)。
- 域关系演算:以域变量为核心 (如 QBE)。
2.1.3.3. SQL(Structured Query Language,结构化查询语言)
- 定位:融合关系代数和关系演算特点的混合式语言,最广泛使用。
SELECT
偏向演算,FROM
/JOIN
偏向代数。 - 核心能力:
- 数据查询(DQL):
SELECT
。 - 数据定义语言(DDL):
CREATE TABLE
,ALTER TABLE
,DROP TABLE
。 - 数据操作语言(DML):
INSERT
,UPDATE
,DELETE
。 - 数据控制语言(DCL):
GRANT
,REVOKE
。
- 数据查询(DQL):
2.1.3.4. 对比表格
语言类型 | 范式 | 典型代表 | 用户友好性 |
---|---|---|---|
关系代数 | 过程化 | 理论模型 | 低 |
关系演算 | 非过程化 | 逻辑表达式 | 中 |
SQL | 混合式 | 实际应用语言 | 高 |
3. 关系的完整性
3.1. 关系完整性概述
- 目标:确保数据库数据正确性、一致性、可靠性。
- 三大约束:
- 实体完整性:关于主键。
- 参照完整性:关于外键。
- 用户定义完整性:业务逻辑约束。
3.2. 完整性分类详解
3.2.1. 实体完整性
- 定义:主键必须唯一且非空,确保每行都有唯一标识。
- SQL 实现:
CREATE TABLE Student (Sno CHAR(10) PRIMARY KEY, -- 隐含非空且唯一Sname VARCHAR(20) NOT NULL );
- 案例:不允许插入两条学号相同的记录。
3.2.2. 参照完整性
- 定义:外键值必须是其引用关系中主键的有效值,或为
NULL
。维护表间关联性。 - SQL 实现:
CREATE TABLE SC (Sno CHAR(10),Cno CHAR(5),FOREIGN KEY (Sno) REFERENCES Student(Sno),FOREIGN KEY (Cno) REFERENCES Course(Cno) );
- 级联操作(可选):定义主表主键变化时从表外键的响应:
ON DELETE CASCADE
:主表删除,从表相关记录也删除。ON UPDATE SET NULL
:主表更新,从表外键设为NULL
。ON DELETE RESTRICT
/NO ACTION
:默认,存在引用时阻止操作。
3.2.3. 用户定义的完整性
- 定义:根据业务需求定义的非标准约束,补充实体和参照完整性。
- 常见类型:
- 列级约束:单个列的范围/格式限制(如
Age >= 18
)。 - 表级约束:多列间的关系(如
EndDate >= StartDate
)。
- 列级约束:单个列的范围/格式限制(如
- SQL 实现:
CREATE TABLE Employee (ID INT PRIMARY KEY,Age INT CHECK (Age >= 18),StartDate DATE,EndDate DATE,CONSTRAINT DateCheck CHECK (EndDate >= StartDate) );
3.2.4. 对比表格
约束类型 | 作用范围 | SQL 关键字 | 示例 |
---|---|---|---|
实体完整性 | 主键字段 | PRIMARY KEY | Sno PRIMARY KEY |
参照完整性 | 外键字段 | FOREIGN KEY | FOREIGN KEY (Sno) REFERENCES Student |
用户定义完整性 | 任意字段/表 | CHECK | CHECK (Age >= 18) |
3.3. 案例分析
3.3.1. 案例1:违反参照完整性
- 场景:向
SC
表插入学号999
的记录,但Student
表中无此学号。 - 错误:提示外键约束冲突,因为主表无该学号。
- 解决方法:先在
Student
表插入999
,或允许外键为NULL
。
3.3.2. 案例2:用户定义约束冲突
- 场景:向
Employee
表插入年龄为15
的记录(假设Age >= 18
)。 - 错误:提示
CHECK
约束冲突。 - 解决方法:修正
Age
值以符合约束。
3.4. 常见问题与解决方案
问题 | 原因 | 解决方案 |
---|---|---|
主键重复 | 违反实体完整性 | 检查主键生成逻辑或插入前检查。 |
外键引用无效值 | 违反参照完整性 | 确保先插入主表记录,或设级联操作。 |
字段值超出范围/格式错 | 违反用户定义完整性 | 校验输入数据,或修改约束。 |
多表关联删除导致数据丢失 | 未合理设置级联规则 | 根据业务需求使用 RESTRICT , SET NULL , 或 CASCADE 。 |
3.5. 知识扩展
- 域完整性(Domain Integrity):确保字段值符合其定义域规范(如
性别
只能是男
或女
)。是用户定义完整性的一种。 - 触发器(Trigger):数据库事件(增删改)发生时自动执行的特殊存储过程,可实现更复杂的跨表校验、审计日志等。
4. 关系代数
4.1. 关系代数概览
- 定义:一种过程化的查询语言,通过抽象运算符对关系操作,产生新关系。SQL 的理论基础。
- 核心特性:
- 封闭性:输入输出皆为关系,操作可嵌套。
- 过程化:需明确指定操作步骤和顺序。
- 数学基础:基于集合论。
- 学习目标:掌握运算符,表达复杂查询,理解与 SQL 对应关系。
4.2. 传统集合运算
参与集合运算的两个关系 R R R 和 S S S 必须是相容的(Compatible)。相容意味着:
- 度相同:关系 R R R 和 S S S 的属性(列)数量必须相同。
- 域相同:对于任意 i i i, R R R 的第 i i i 个属性的域必须与 S S S 的第 i i i 个属性的域相同或兼容。
1. 并(Union)
- 定义:关系 R R R 与 S S S 的并是由所有属于 R R R 或属于 S S S 的元组构成的集合。结果中重复的元组会自动被去除。
R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R \cup S = \{ t \mid t \in R \lor t \in S \} R∪S={t∣t∈R∨t∈S} - 示例:查询选修’C1’或’C2’的学生学号(
Sno
)。- 设 R 1 R_1 R1 为选修’C1’的学生的学号集合: R 1 = π S n o ( σ C n o = ′ C 1 ′ ( S C ) ) R_1 = \pi_{Sno}(\sigma_{Cno='C1'}(SC)) R1=πSno(σCno=′C1′(SC))
- 设 R 2 R_2 R2 为选修’C2’的学生的学号集合: R 2 = π S n o ( σ C n o = ′ C 2 ′ ( S C ) ) R_2 = \pi_{Sno}(\sigma_{Cno='C2'}(SC)) R2=πSno(σCno=′C2′(SC))
- 关系代数:
π S n o ( σ C n o = ′ C 1 ′ ( S C ) ) ∪ π S n o ( σ C n o = ′ C 2 ′ ( S C ) ) \pi_{Sno}(\sigma_{Cno='C1'}(SC)) \cup \pi_{Sno}(\sigma_{Cno='C2'}(SC)) πSno(σCno=′C1′(SC))∪πSno(σCno=′C2′(SC))
2. 差(Difference)
- 定义:关系 R R R 与 S S S 的差是由所有属于 R R R 但不属于 S S S 的元组构成的集合。
R − S = { t ∣ t ∈ R ∧ t ∉ S } R - S = \{ t \mid t \in R \land t \notin S \} R−S={t∣t∈R∧t∈/S} - 示例:查询选修’C1’但未选修’C2’的学生学号。
- 关系代数:
π S n o ( σ C n o = ′ C 1 ′ ( S C ) ) − π S n o ( σ C n o = ′ C 2 ′ ( S C ) ) \pi_{Sno}(\sigma_{Cno='C1'}(SC)) - \pi_{Sno}(\sigma_{Cno='C2'}(SC)) πSno(σCno=′C1′(SC))−πSno(σCno=′C2′(SC))
- 关系代数:
3. 交(Intersection)
- 定义:关系 R R R 与 S S S 的交是由同时属于 R R R 和 S S S 的元组构成的集合。
R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R \cap S = \{ t \mid t \in R \land t \in S \} R∩S={t∣t∈R∧t∈S} - 说明:交运算不是一个基础运算,它可以由差运算来表示: R ∩ S = R − ( R − S ) R \cap S = R - (R - S) R∩S=R−(R−S)。
- 示例:查询同时选修’C1’和’C2’的学生学号。
- 关系代数:
π S n o ( σ C n o = ′ C 1 ′ ( S C ) ) ∩ π S n o ( σ C n o = ′ C 2 ′ ( S C ) ) \pi_{Sno}(\sigma_{Cno='C1'}(SC)) \cap \pi_{Sno}(\sigma_{Cno='C2'}(SC)) πSno(σCno=′C1′(SC))∩πSno(σCno=′C2′(SC))
- 关系代数:
4. 广义笛卡尔积(Extended Cartesian Product)
- 定义:关系 R R R(度为 k 1 k_1 k1)和 S S S(度为 k 2 k_2 k2)的广义笛卡尔积是一个新的关系,其度为 k 1 + k 2 k_1 + k_2 k1+k2。新关系的元组由 R R R 中的每个元组与 S S S 中的每个元组拼接而成。
R × S = { t ∣ t = ⟨ t r , t s ⟩ ∧ t r ∈ R ∧ t s ∈ S } R \times S = \{ t \mid t = \langle t_r, t_s \rangle \land t_r \in R \land t_s \in S \} R×S={t∣t=⟨tr,ts⟩∧tr∈R∧ts∈S}- 结果属性:前 k 1 k_1 k1 个属性来自 R R R,后 k 2 k_2 k2 个属性来自 S S S。如果存在同名属性,通常需要重命名。
- 结果基数: ∣ R × S ∣ = ∣ R ∣ × ∣ S ∣ |R \times S| = |R| \times |S| ∣R×S∣=∣R∣×∣S∣。
- 警告:此运算可能导致结果中的元组数量急剧增加(数据爆炸)。因此,它在实际中很少独立使用,通常与选择( σ \sigma σ)运算结合形成连接( ⋈ \bowtie ⋈)运算。例如, θ \theta θ-连接的定义就是:
R ⋈ θ S = σ θ ( R × S ) R \bowtie_\theta S = \sigma_\theta (R \times S) R⋈θS=σθ(R×S)
4.3. 专门关系运算
这些是关系模型特有的运算,通过对关系的行和列进行操作,极大地增强了数据查询能力。
1. 选择(Selection)
- 定义:从关系 R R R 中筛选出满足给定条件的所有元组。它对关系进行水平过滤,不改变关系的度(属性数量)。
- 符号: σ F ( R ) \sigma_F(R) σF(R)
- 说明:条件 F F F 是一个布尔表达式,可以由属性、常量、比较运算符(
=
,<
,>
,≠
等)和逻辑运算符(∧
(与),∨
(或),¬
(非))组成。
- 示例:查询计算机系(‘CS’)的所有学生信息。
- 关系代数: σ S d e p t = ′ C S ′ ( S t u d e n t ) \sigma_{Sdept='CS'}(Student) σSdept=′CS′(Student)
- SQL 等价:
SELECT * FROM Student WHERE Sdept='CS';
2. 投影(Projection)
- 定义:从关系 R R R 中选择出指定的属性列,并构成一个新的关系。它对关系进行垂直裁剪。
- 符号: π A 1 , A 2 , . . . , A k ( R ) \pi_{A_1, A_2, ..., A_k}(R) πA1,A2,...,Ak(R)
- 说明:结果关系中会自动去除重复的元组。这是与 SQL 中默认
SELECT
行为的核心区别。
- 示例:获取所有学生的姓名(
Sname
)与专业(Sdept
)。- 关系代数: π S n a m e , S d e p t ( S t u d e n t ) \pi_{Sname, Sdept}(Student) πSname,Sdept(Student)
- SQL 等价:
SELECT DISTINCT Sname, Sdept FROM Student;
3. 连接(Join)
连接运算是关系代数中最重要的操作之一,用于合并来自两个或多个关系的信息。
a. θ \theta θ-连接 (Theta Join)
- 定义: θ \theta θ-连接是连接的最一般形式。它从两个关系 R R R 和 S S S 的笛卡尔积中,选取满足条件 θ \theta θ 的元组。
R ⋈ θ S = σ θ ( R × S ) R \bowtie_\theta S = \sigma_\theta(R \times S) R⋈θS=σθ(R×S)- 说明: θ \theta θ 是由 R R R 的属性和 S S S 的属性之间进行比较的布尔表达式。
b. 等值连接 (Equijoin)
- 定义:当 θ \theta θ-连接中的条件 θ \theta θ 全部为**等号(
=
)**比较时,称之为等值连接。 - 示例:在学生和选课关系中,基于学号相等进行连接。
S t u d e n t ⋈ S t u d e n t . S n o = S C . S n o S C Student \bowtie_{Student.Sno = SC.Sno} SC Student⋈Student.Sno=SC.SnoSC
c. 自然连接 (Natural Join)
- 定义:自然连接是一种特殊的等值连接。它要求两个关系具有一个或多个同名属性,并自动在这些同名属性上进行等值连接,最后在结果中去除重复的同名列。
- 符号: R ⋈ S R \bowtie S R⋈S
- 示例:自然连接学生表
Student
与选课表SC
(假设它们都有Sno
属性)。- 关系代数: S t u d e n t ⋈ S C Student \bowtie SC Student⋈SC
- SQL 等价:
SELECT ... FROM Student NATURAL JOIN SC;
或SELECT ... FROM Student INNER JOIN SC ON Student.Sno = SC.Sno;
d. 外连接 (Outer Join)
- 定义:外连接是连接的扩展,它会保留在一个关系中而无法在另一个关系中找到匹配的元组,并在结果的对应位置填充
NULL
。- 左外连接 (Left Outer Join, R ⋈ L S R \bowtie_L S R⋈LS 或 R ⟕ S R \text{ ⟕ } S R ⟕ S):保留左侧关系 R R R 的所有元组。
- 右外连接 (Right Outer Join, R ⋈ R S R \bowtie_R S R⋈RS 或 R ⟖ S R \text{ ⟖ } S R ⟖ S):保留右侧关系 S S S 的所有元组。
- 全外连接 (Full Outer Join, R ⋈ F S R \bowtie_F S R⋈FS 或 R ⟗ S R \text{ ⟗ } S R ⟗ S):保留两侧关系的所有元组。
4. 除(Division)
- 定义:除法运算通常用于解决“查询…了所有…”类型的问题。设关系 R R R 的属性集包含关系 S S S 的属性集,即 A t t r s ( S ) ⊂ A t t r s ( R ) Attrs(S) \subset Attrs(R) Attrs(S)⊂Attrs(R)。 R ÷ S R \div S R÷S 的结果是一个新关系,其属性为 A t t r s ( R ) − A t t r s ( S ) Attrs(R) - Attrs(S) Attrs(R)−Attrs(S)。
- 符号: R ÷ S R \div S R÷S
- 形式化:结果元组 t t t 由 R R R 中不属于 S S S 的那部分属性构成。 t t t 被包含在 R ÷ S R \div S R÷S 的结果中,当且仅当对于 S S S 中的每一个元组 s s s,元组 t s ts ts( t t t 与 s s s 的拼接)都在 R R R 中。
- 示例:查询选修了课程表(
Course
)中所有课程的学生学号。- 设 R = π S n o , C n o ( S C ) R = \pi_{Sno, Cno}(SC) R=πSno,Cno(SC)
- 设 S = π C n o ( C o u r s e ) S = \pi_{Cno}(Course) S=πCno(Course)
- 关系代数: R ÷ S R \div S R÷S
- SQL 等价:无直接对应的操作符。通常需要使用
GROUP BY ... HAVING COUNT(...)
或双重NOT EXISTS
来模拟实现。
4.4. 综合应用案例:学生选课系统
4.4.1. 场景描述
- 学生表: S t u d e n t ( S n o , S n a m e , S d e p t ) Student(Sno, Sname, Sdept) Student(Sno,Sname,Sdept)
- 课程表: C o u r s e ( C n o , C n a m e , C r e d i t ) Course(Cno, Cname, Credit) Course(Cno,Cname,Credit)
- 选课表: S C ( S n o , C n o , G r a d e ) SC(Sno, Cno, Grade) SC(Sno,Cno,Grade)
4.4.2. 查询需求与关系代数表达
-
查询选修“数据库”课程的学生姓名
π S n a m e ( σ C n a m e = ′ 数 据 库 ′ ( S t u d e n t ⋈ S C ⋈ C o u r s e ) ) \pi_{Sname}\left( \sigma_{Cname='数据库'}(Student \bowtie SC \bowtie Course) \right) πSname(σCname=′数据库′(Student⋈SC⋈Course))- 分解:先连接三张表,再筛选课程名为“数据库”的记录,最后投影出学生姓名。
-
查询至少选修学号“2023001”所选全部课程的学生学号
π S n o , C n o ( S C ) ÷ π C n o ( σ S n o = ′ 202300 1 ′ ( S C ) ) \pi_{Sno,Cno}(SC) \div \pi_{Cno}(\sigma_{Sno='2023001'}(SC)) πSno,Cno(SC)÷πCno(σSno=′2023001′(SC))- 分解:得到所有学生选课 ( π S n o , C n o ( S C ) \pi_{Sno,Cno}(SC) πSno,Cno(SC)),找出学号“2023001”选的所有课程 ( π C n o ( σ S n o = ′ 202300 1 ′ ( S C ) ) \pi_{Cno}(\sigma_{Sno='2023001'}(SC)) πCno(σSno=′2023001′(SC))),然后执行除运算。
4.4.3. 对比表格
运算 | 操作维度 | SQL 对应 | 常见误用/注意点 |
---|---|---|---|
选择 ( σ \sigma σ) | 横向过滤行 | WHERE 子句 | 条件逻辑错误。 |
投影 ( π \pi π) | 纵向选择列 | SELECT 列, DISTINCT | SQL 需 DISTINCT 去重。 |
连接 ( ⋈ \bowtie ⋈) | 表间关联 | JOIN | 未指定条件导致笛卡尔积。 |
除 ( ÷ \div ÷) | 包含性匹配 | NOT EXISTS 或 GROUP BY + HAVING COUNT | 语义复杂,属性划分要正确。 |
4.4.4. 流程图
4.5. 重点总结
- 运算符优先级:选择、投影高于连接,连接高于集合运算。建议用括号明确顺序。
- 等价转换:自然连接 = 等值连接 + 去重投影。
- 注意:
- 笛卡尔积:单独使用无意义,需与选择结合。
- 除运算:语义复杂,SQL 中需模拟实现。
5. 关系演算
5.1. 元组关系演算语言ALPHA
5.1.1. ALPHA 语言概览
- 提出者:E.F. Codd。
- 定位:基于元组关系演算的理论查询语言,第一个提出非过程化查询思想。
- 核心特点:
- 非过程化:只需描述结果特征,无需指定步骤。
- 数学严谨性:基于一阶谓词逻辑,使用存在量词 ( ∃ \exists ∃) 和全称量词 ( ∀ \forall ∀)。
- 变量绑定:通过元组变量遍历关系记录。
5.1.2. ALPHA 语法核心元素
5.1.2.1. 元组变量声明
- 语法:
RANGE OF <变量> IS <关系名>
- 作用:声明元组变量,绑定到关系,使其能遍历关系中的元组。
- 示例:
RANGE OF S IS Student
5.1.2.2. 检索操作(GET)
- 语法:
GET <目标属性列表> [WHERE <条件表达式>]
- 作用:检索满足条件的数据。
- 示例:查询计算机系学生姓名。
GET S.Sname WHERE S.Sdept = 'CS'
5.1.2.3. 量词应用
- 存在量词( ∃ \exists ∃):表示“至少存在一个”元组满足条件。
- 示例:查询选修’C1’的学生的姓名。
GET S.Sname WHERE ∃ SC (SC.Sno = S.Sno ∧ SC.Cno = 'C1')
- 示例:查询选修’C1’的学生的姓名。
- 全称量词( ∀ \forall ∀):表示“所有”元组都满足条件。
- 示例:查询选修了所有课程的学生学号。
GET S.Sno WHERE ∀ C (Course(C) → ∃ SC (SC.Sno = S.Sno ∧ SC.Cno = C.Cno))
- 示例:查询选修了所有课程的学生学号。
5.1.3. ALPHA 核心操作符
操作符 | 符号 | 说明 | 示例 |
---|---|---|---|
逻辑与 | ∧ \land ∧ | 同时满足。 | S.Age > 20 ∧ S.Dept = 'CS' |
逻辑或 | ∨ \lor ∨ | 满足任一。 | S.Grade > 90 ∨ S.Grade < 60 |
否定 | ¬ \neg ¬ | 取反条件。 | ¬∃ SC (SC.Sno = S.Sno) (未选任何课) |
存在量词 | ∃ \exists ∃ | 至少存在一个。 | ∃ C (C.Cno = SC.Cno ∧ C.Name='DB') |
全称量词 | ∀ \forall ∀ | 所有均满足。 | ∀ SC (SC.Sno = S.Sno → SC.Grade>60) |
5.1.4. 综合应用案例
5.1.4.1. 场景描述
- 学生表: S t u d e n t ( S n o , S n a m e , S d e p t ) Student(Sno, Sname, Sdept) Student(Sno,Sname,Sdept)
- 选课表: S C ( S n o , C n o , G r a d e ) SC(Sno, Cno, Grade) SC(Sno,Cno,Grade)
- 课程表: C o u r s e ( C n o , C n a m e ) Course(Cno, Cname) Course(Cno,Cname)
5.1.4.2. 查询需求与 ALPHA 表达
- 查询选修了“数据库”课程的学生姓名:
RANGE OF S IS Student RANGE OF SC IS SC RANGE OF C IS Course GET S.Sname WHERE ∃ SC ∃ C (SC.Sno = S.Sno ∧ SC.Cno = C.Cno ∧ C.Cname = '数据库')
- 查询未选修任何课程的学生学号:
RANGE OF S IS Student GET S.Sno WHERE ¬∃ SC (SC.Sno = S.Sno)
- 查询选修了所有课程的学生学号:
RANGE OF S IS Student RANGE OF C IS Course GET S.Sno WHERE ∀ C ∃ SC (SC.Sno = S.Sno ∧ SC.Cno = C.Cno)
5.1.5. ALPHA 与 SQL 的对应关系
ALPHA 操作 | SQL 等效 |
---|---|
RANGE OF S IS Student | FROM Student AS S |
GET S.Sname WHERE ... | SELECT Sname FROM Student S WHERE ... |
∃ SC (SC.Sno = S.Sno ...) | EXISTS (SELECT 1 FROM SC WHERE ...) 或 INNER JOIN |
∀ C (... → ...) (全称量词蕴含) | NOT EXISTS (SELECT 1 FROM C WHERE NOT EXISTS (...)) |
5.1.6. 重点总结
- 变量作用域:
RANGE OF
显式声明元组变量。 - 量词嵌套:复杂查询常需组合使用存在和全称量词。
- 安全性约束:全称量词必须限定在有限域内,保证查询结果有限。
5.2. ALPHA 数据操作语句
除了检索,ALPHA 也定义了数据修改和控制语句。
5.2.1. 数据操作语句概览
语句 | 功能 | 类比 SQL | 理论定位 |
---|---|---|---|
PUT | 插入新元组。 | INSERT INTO | 基于逻辑表达式生成并添加新元组。 |
HOLD | 锁定元组防止并发修改。 | SELECT FOR UPDATE | 事务管理中的临时控制。 |
UPDATE | 修改满足条件的元组。 | UPDATE | 通过逻辑条件定位并修改数据。 |
DELETE | 删除满足条件的元组。 | DELETE FROM | 基于谓词逻辑删除数据。 |
DROP | 删除关系或视图。 | DROP TABLE/VIEW | 元数据操作,影响数据库结构,需谨慎。 |
5.2.2. 语法详解与案例
5.2.2.1. PUT 语句(插入数据)
- 语法:
PUT <关系名> (属性1: 值1, ...)
- 作用:插入新元组。
- 示例:
PUT Student (Sno: '2023001', Sname: '张三')
SQL:INSERT INTO Student (Sno, Sname) VALUES ('2023001', '张三');
5.2.2.2. HOLD 语句(锁定元组)
- 语法:
HOLD <目标属性> [WHERE <条件>]
- 作用:显式锁定元组,防止并发修改,保证一致性。
- 示例:
HOLD SC WHERE Sno='2023001' AND Cno='C1'
SQL:SELECT * FROM SC WHERE Sno='2023001' AND Cno='C1' FOR UPDATE;
5.2.2.3. UPDATE 语句(更新数据)
- 语法:
UPDATE <关系名> SET 属性=新值 [WHERE <条件>]
- 作用:修改满足条件的元组属性值。
- 示例:
UPDATE Student SET Sdept='AI' WHERE Sno='2023001'
SQL:UPDATE Student SET Sdept='AI' WHERE Sno='2023001';
5.2.2.4. DELETE 语句(删除数据)
- 语法:
DELETE <关系名> [WHERE <条件>]
- 作用:删除满足条件的元组。
- 示例:
DELETE SC WHERE Grade < 60
SQL:DELETE FROM SC WHERE Grade < 60;
5.2.2.5. DROP 语句(删除结构)
- 语法:
DROP <关系/视图名>
- 作用:删除数据库中的表或视图。
- 示例:
DROP VIEW CS_Student
SQL:DROP VIEW CS_Student;
5.2.3. 事务与并发控制
- ALPHA 中的事务逻辑:
HOLD
语句是实现并发控制和事务隔离的关键,需与COMMIT
和ROLLBACK
配合使用。 - 示例流程:
HOLD Student WHERE Sno='2023001' UPDATE Student SET Sdept='AI' WHERE Sno='2023001' COMMIT
5.2.4.3. 对比表格
操作 | ALPHA 语法 | SQL 语法 |
---|---|---|
插入数据 | PUT R (A1:V1, A2:V2) | INSERT INTO R (A1,A2) VALUES (V1,V2) |
锁定数据 | HOLD R WHERE ... | SELECT * FROM R WHERE ... FOR UPDATE |
更新数据 | UPDATE R SET A1=V1 WHERE ... | UPDATE R SET A1=V1 WHERE ... |
删除数据 | DELETE R WHERE ... | DELETE FROM R WHERE ... |
删除结构 | DROP R | DROP TABLE R 或 DROP VIEW R |
5.2.4.4. 事务流程图
5.2.5. 关键注意事项
- 理论局限性:ALPHA 数据操作多用于理论理解,实际 SQL 实现细节可能不同。
- 事务完整性:
HOLD
需与COMMIT
/ROLLBACK
配合,防止死锁。 - 数据安全性:
DROP
是高风险操作,需严格权限控制和数据备份。
5.3. 元组关系演算
5.3.1. 关系演算概览
- 定义:基于谓词逻辑的非过程化查询语言。用户通过描述结果应满足的逻辑条件来查询。
- 核心特性:
- 非过程化:只需“找什么”,不需“如何找”。
- 数学基础:基于一阶谓词逻辑,用量词 ( ∃ \exists ∃, ∀ \forall ∀)。
- 与关系代数等价:表达能力相同。
- 分类:
5.3.2. 元组关系演算(Tuple Relational Calculus)
以元组变量为核心,通过约束元组变量来描述查询结果。
5.3.2.1. 基本语法
- 表达式形式: { t ∣ P ( t ) } \{ t \mid P(t) \} {t∣P(t)}
- t t t:元组变量,代表一行记录。
- P ( t ) P(t) P(t):谓词,定义 t t t 需满足的逻辑条件。
5.3.2.2. 核心元素
- 原子公式:
t ∈ R
(t 属于关系 R);t[A] θ s[B]
(t 的属性 A 与 s 的属性 B 比较);t[A] θ c
(t 的属性 A 与常量 c 比较)。 - 量词:
- 存在量词( ∃ \exists ∃): ∃ t ( P ( t ) ) \exists t (P(t)) ∃t(P(t))。
- 全称量词( ∀ \forall ∀): ∀ t ( P ( t ) ) \forall t (P(t)) ∀t(P(t))。
5.3.2.3. 示例
假设 Student(Sno, Sname, Sage, Sdept)
和 SC(Sno, Cno, Grade)
。
- 查询年龄大于20的计算机系学生的所有信息
{ t ∣ S t u d e n t ( t ) ∧ t . S a g e > 20 ∧ t . S d e p t = ′ C S ′ } \{ t \mid Student(t) \land t.Sage > 20 \land t.Sdept = 'CS' \} {t∣Student(t)∧t.Sage>20∧t.Sdept=′CS′} - 查询选修了课程C1的学生姓名
{ t . S n a m e ∣ ∃ s ∈ S t u d e n t ( s . S n a m e = t . S n a m e ∧ ∃ s c ∈ S C ( s c . S n o = s . S n o ∧ s c . C n o = ′ C 1 ′ ) ) } \{ t.Sname \mid \exists s \in Student (s.Sname = t.Sname \land \exists sc \in SC (sc.Sno = s.Sno \land sc.Cno = 'C1')) \} {t.Sname∣∃s∈Student(s.Sname=t.Sname∧∃sc∈SC(sc.Sno=s.Sno∧sc.Cno=′C1′))}
5.3.3. 域关系演算(Domain Relational Calculus)
以域变量为核心,通过约束单个属性值来描述查询结果。
5.3.3.1. 基本语法
- 表达式形式: { < x 1 , … , x n > ∣ P ( x 1 , … , x n ) } \{ <x_1, \dots, x_n> \mid P(x_1, \dots, x_n) \} {<x1,…,xn>∣P(x1,…,xn)}
- < x 1 , … , x n > <x_1, \dots, x_n> <x1,…,xn>:由域变量组成的元组,代表结果所需属性值。
- P ( x 1 , … , x n ) P(x_1, \dots, x_n) P(x1,…,xn):谓词,定义域变量需满足的条件。
5.3.3.2. 示例
假设 Student(Sno, Sname, Sdept)
和 SC(Sno, Cno, Grade)
。
- 查询计算机系学生的学号和姓名
{ < s n o , s n a m e > ∣ ∃ s d e p t ( S t u d e n t ( s n o , s n a m e , s d e p t ) ∧ s d e p t = ′ C S ′ ) } \{ <sno, sname> \mid \exists sdept (Student(sno, sname, sdept) \land sdept = 'CS') \} {<sno,sname>∣∃sdept(Student(sno,sname,sdept)∧sdept=′CS′)} - 查询选修了所有课程的学生学号
{ < s n o > ∣ ∀ c n o ( C o u r s e ( c n o ) → ∃ g r a d e ( S C ( s n o , c n o , g r a d e ) ) ) } \{ <sno> \mid \forall cno (Course(cno) \to \exists grade (SC(sno, cno, grade))) \} {<sno>∣∀cno(Course(cno)→∃grade(SC(sno,cno,grade)))}
5.3.4. 关系演算 vs 关系代数
对比维度 | 关系演算 | 关系代数 |
---|---|---|
表达方式 | 逻辑表达式(声明“找什么”) | 运算符组合(声明“怎么找”) |
用户友好性 | 更接近自然语言。 | 需明确操作步骤。 |
抽象层级 | 更高(隐藏实现细节)。 | 较低(暴露操作流程)。 |
典型应用 | 理论研究、查询优化。 | 实际查询实现的基础。 |
等价性 | 表达能力相同。 |
5.3.5. 综合应用案例
5.3.5.1. 场景描述
- 学生表: S t u d e n t ( S n o , S n a m e , S d e p t ) Student(Sno, Sname, Sdept) Student(Sno,Sname,Sdept)
- 选课表: S C ( S n o , C n o , G r a d e ) SC(Sno, Cno, Grade) SC(Sno,Cno,Grade)
5.3.5.2. 查询需求与关系演算表达
-
查询至少选修一门课程的学生姓名
{ t . S n a m e ∣ ∃ s ∈ S t u d e n t ( s . S n a m e = t . S n a m e ∧ ∃ s c ∈ S C ( s c . S n o = s . S n o ) ) } \{ t.Sname \mid \exists s \in Student (s.Sname = t.Sname \land \exists sc \in SC (sc.Sno = s.Sno)) \} {t.Sname∣∃s∈Student(s.Sname=t.Sname∧∃sc∈SC(sc.Sno=s.Sno))} -
查询未选修课程C1的学生学号
{ t . S n o ∣ ∀ s c ∈ S C ( s c . S n o ≠ t . S n o ∨ s c . C n o ≠ ′ C 1 ′ ) } \{ t.Sno \mid \forall sc \in SC (sc.Sno \neq t.Sno \lor sc.Cno \neq 'C1') \} {t.Sno∣∀sc∈SC(sc.Sno=t.Sno∨sc.Cno=′C1′)}
5.3.6.3. 对比表格
特性 | 元组关系演算 | 域关系演算 |
---|---|---|
变量类型 | 元组变量(整条记录) | 域变量(属性值) |
表达式复杂度 | 易表达跨表关联。 | 适合单表深度过滤。 |
典型场景 | 多表联合查询。 | 属性级条件组合。 |
5.3.7. 重点总结
- 量词嵌套:复杂查询常需嵌套使用量词。
- 安全性:关系演算查询必须安全(结果有限),变量需被限定范围。
- 与 SQL 的映射:SQL 的
WHERE
子句和EXISTS
/NOT EXISTS
直接体现关系演算中的量词逻辑。