欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 数据库核心概念 (二):关系模型精解——结构、操作与完整性

数据库核心概念 (二):关系模型精解——结构、操作与完整性

2025/6/23 11:43:36 来源:https://blog.csdn.net/2301_80115847/article/details/148818346  浏览:    关键词:数据库核心概念 (二):关系模型精解——结构、操作与完整性

目录

    • 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. 核心概念图

关系数据结构
关系模型三要素
关系的数学定义
键的类型
关系模式 vs 实例
数据结构
数据操作
完整性约束
域 Domain
笛卡尔积
关系的数学表示
候选键
主键
外键

1.2. 详细内容解析

1.2.1. 关系模型三要素

关系模型是数据库的核心,它通过以下三点管理数据:

  • 数据结构:数据以二维表元组属性)的形式组织。每个单元格的值都必须是原子性的,即不可再分。
  • 数据操作:对表进行操作(如增删改查),输入是表,输出也是表(封闭性)。用户只需说明“做什么”,不用管“怎么做”(非过程性)。
  • 完整性约束:保证数据正确性。
    • 实体完整性主键必须非空且唯一
    • 参照完整性外键要么指向存在的主键,要么为 NULL
    • 用户自定义完整性:根据业务规则设置的额外限制(如年龄范围)。

1.2.2. 关系
1.2.2.1. 关系的数学定义

理解关系模型,先从数学定义入手:

  1. 域(Domain)
    • 定义:一组相同数据类型和取值范围的值的集合。属性的值必须来自其域。
    • 示例:性别域 = {男, 女}。
  2. 笛卡尔积(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)diDi}
    • 关键点
      • 元组:笛卡尔积中的一个元素,对应表中的一行
      • 分量:元组中的一个值,对应表中的一个单元格
      • 基数:域的不同取值数。笛卡尔积的基数是各域基数的乘积。
    • 实际意义:一个实际的关系(表)是笛卡尔积的有限子集,只包含有意义的组合。
  3. 关系的数学表示
    • 定义:关系 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. 关系的三种类型

关系(表)按用途和存储方式分为:

  1. 基本关系(基本表/Base Table)
    • 定义:实际存储数据的表,独立存在,持久化存储
    • 示例学生表(学号, 姓名, 专业)
  2. 查询表(Query Result Table)
    • 定义:查询后的临时结果集,动态生成,不实际存储。
    • 示例SELECT 姓名 FROM 学生表 WHERE 专业='计算机' 的结果。
  3. 视图表(View)
    • 定义:通过基本表或其他视图导出的虚表,只存定义,不存数据。
    • 特点:提供数据抽象安全性
    • 示例视图_计算机学生 AS SELECT 学号, 姓名 FROM 学生表 WHERE 专业='计算机'

1.2.2.4. 基本关系的六条性质

基本关系(二维表)必须满足六条性质:

性质说明示例
1. 列的同质性每列的值必须来自同一域(类型和范围一致)。“年龄”列只存整数。
2. 属性名的唯一性不同列必须有不同名称必修课程选修课程
3. 列的无序性列的顺序不影响数据含义。“姓名”或“学号”在前无影响。
4. 元组的唯一性任意两行候选码不能完全相同不能有两条学号相同的学生记录。
5. 行的无序性行的顺序不影响数据含义。学生记录存储顺序不影响查询。
6. 分量的原子性每个值都必须是不可再分的原子值第一范式)。联系方式 不能存“电话:123,邮箱:abc”。

1.2.3. 关系模式
1.2.3.1. 关系模式的定义
  1. 概念解析

    • 关系模式(Relation Schema):关系的逻辑结构,定义了表的“蓝图”或“模板”。包括属性名完整性约束
    • 数学表示 R ( U , D , D O M , F ) R(U, D, DOM, F) R(U,D,DOM,F),代表属性、域、映射和依赖关系。
  2. 关系模式 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. 存储模型图
关系数据库
逻辑层 - 表视图
物理层 - 文件存储
学生表
课程表
堆文件/数据文件
B+树索引文件
日志文件 (WAL)

1.3. 关键总结

概念核心要点
关系模式定义表的结构(属性、域、约束),是“型”。
关系数据库由多关系组成,支持查询与事务。
存储结构逻辑表映射到物理文件,依赖索引优化。

1.4. 常见误区

  • 误区1:关系是笛卡尔积。
    • 正解关系是笛卡尔积的有限子集,只包含有意义的元组。
  • 误区2:混淆超键候选键
    • 正解候选键是能唯一标识元组的最小属性集;超键只要能唯一标识元组即可,可能包含冗余属性。
  • 误区3:空值(NULL)处理不当。
    • 注意空值表示未知或不适用,NULL > 18NULL = 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
关系数据语言
关系代数语言(如ISBL)
关系演算语言
具有双重特点的语言:如SQL
元组关系演算(如ALPHA、QUEL)
域关系演算(如QBE)

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 KEYSno PRIMARY KEY
参照完整性外键字段FOREIGN KEYFOREIGN KEY (Sno) REFERENCES Student
用户定义完整性任意字段/表CHECKCHECK (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)。相容意味着:

  1. 度相同:关系 R R R S S S 的属性(列)数量必须相同。
  2. 域相同:对于任意 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 \} RS={ttRtS}
  • 示例:查询选修’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 \} RS={ttRt/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 \} RS={ttRtS}
  • 说明:交运算不是一个基础运算,它可以由差运算来表示: R ∩ S = R − ( R − S ) R \cap S = R - (R - S) RS=R(RS)
  • 示例:查询同时选修’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={tt=tr,tstrRtsS}
    • 结果属性:前 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 StudentStudent.Sno=SC.SnoSC
c. 自然连接 (Natural Join)
  • 定义:自然连接是一种特殊的等值连接。它要求两个关系具有一个或多个同名属性,并自动在这些同名属性上进行等值连接,最后在结果中去除重复的同名列
    • 符号 R ⋈ S R \bowtie S RS
  • 示例:自然连接学生表 Student 与选课表 SC(假设它们都有 Sno 属性)。
    • 关系代数 S t u d e n t ⋈ S C Student \bowtie SC StudentSC
    • 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 RLS R ⟕  S R \text{ ⟕ } S R ⟕ S):保留左侧关系 R R R 的所有元组。
    • 右外连接 (Right Outer Join, R ⋈ R S R \bowtie_R S RRS R ⟖  S R \text{ ⟖ } S R ⟖ S):保留右侧关系 S S S 的所有元组。
    • 全外连接 (Full Outer Join, R ⋈ F S R \bowtie_F S RFS 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. 查询需求与关系代数表达
  1. 查询选修“数据库”课程的学生姓名
    π 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=(StudentSCCourse))

    • 分解:先连接三张表,再筛选课程名为“数据库”的记录,最后投影出学生姓名。
  2. 查询至少选修学号“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 列, DISTINCTSQL 需 DISTINCT 去重。
连接 ( ⋈ \bowtie )表间关联JOIN未指定条件导致笛卡尔积。
除 ( ÷ \div ÷)包含性匹配NOT EXISTSGROUP 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')
      
  • 全称量词( ∀ \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 表达
  1. 查询选修了“数据库”课程的学生姓名
    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 = '数据库')
    
  2. 查询未选修任何课程的学生学号
    RANGE OF S IS Student
    GET S.Sno WHERE ¬∃ SC (SC.Sno = S.Sno)
    
  3. 查询选修了所有课程的学生学号
    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 StudentFROM 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: '张三')
    SQLINSERT INTO Student (Sno, Sname) VALUES ('2023001', '张三');
5.2.2.2. HOLD 语句(锁定元组)
  • 语法HOLD <目标属性> [WHERE <条件>]
  • 作用:显式锁定元组,防止并发修改,保证一致性。
  • 示例HOLD SC WHERE Sno='2023001' AND Cno='C1'
    SQLSELECT * 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'
    SQLUPDATE Student SET Sdept='AI' WHERE Sno='2023001';
5.2.2.4. DELETE 语句(删除数据)
  • 语法DELETE <关系名> [WHERE <条件>]
  • 作用:删除满足条件的元组。
  • 示例DELETE SC WHERE Grade < 60
    SQLDELETE FROM SC WHERE Grade < 60;
5.2.2.5. DROP 语句(删除结构)
  • 语法DROP <关系/视图名>
  • 作用:删除数据库中的表或视图。
  • 示例DROP VIEW CS_Student
    SQLDROP VIEW CS_Student;

5.2.3. 事务与并发控制
  • ALPHA 中的事务逻辑HOLD 语句是实现并发控制事务隔离的关键,需与 COMMITROLLBACK 配合使用。
  • 示例流程
    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 RDROP TABLE RDROP VIEW R
5.2.4.4. 事务流程图
User DB HOLD Student WHERE Sno='2023001' 数据库系统锁定目标元组 UPDATE Student SET Sdept='AI' 执行数据修改 COMMIT (提交事务) 释放锁并永久保存修改 User DB

5.2.5. 关键注意事项
  1. 理论局限性:ALPHA 数据操作多用于理论理解,实际 SQL 实现细节可能不同。
  2. 事务完整性HOLD 需与 COMMIT/ROLLBACK 配合,防止死锁
  3. 数据安全性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) \} {tP(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' \} {tStudent(t)t.Sage>20t.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.SnamesStudent(s.Sname=t.SnamescSC(sc.Sno=s.Snosc.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. 查询需求与关系演算表达
  1. 查询至少选修一门课程的学生姓名
    { 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.SnamesStudent(s.Sname=t.SnamescSC(sc.Sno=s.Sno))}

  2. 查询未选修课程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.SnoscSC(sc.Sno=t.Snosc.Cno=C1)}


5.3.6.3. 对比表格
特性元组关系演算域关系演算
变量类型元组变量(整条记录)域变量(属性值)
表达式复杂度易表达跨表关联适合单表深度过滤
典型场景多表联合查询。属性级条件组合。

5.3.7. 重点总结
  • 量词嵌套:复杂查询常需嵌套使用量词
  • 安全性:关系演算查询必须安全(结果有限),变量需被限定范围。
  • 与 SQL 的映射:SQL 的 WHERE 子句和 EXISTS/NOT EXISTS 直接体现关系演算中的量词逻辑。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词