一、关系模型和关系代数,《数据库系统概念》,原书第7版

### 文章目录

  • [@[toc]](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [一、引言](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [1.1 什么是数据库](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [1.2 数据完整性](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [1.3 数据库的操作](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [1.4 数据库的持久性](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [1.5 数据库管理系统](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [1.6 数据模型](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [1.7 早期DBMS](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [二、关系模型](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.1 什么是关系模型](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.2 关系数据库的结构](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.3 键](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.4 约束](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.5 数据操纵语言(DML)](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.6 关系代数](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.6.1 选择运算](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.6.2 投影运算](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.6.3 合并运算](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.6.4 交运算](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.6.5 差运算](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.6.6 笛卡尔积运算](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.6.7 连接运算](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.6.8 额外的运算](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [2.7 思考](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)
  • [三、小结](#文章目录 @[toc] 一、引言 1.1 什么是数据库 1.2 数据完整性 1.3 数据库的操作 1.4 数据库的持久性 1.5 数据库管理系统 1.6 数据模型 1.7 早期DBMS 二、关系模型 2.1 什么是关系模型 2.2 关系数据库的结构 2.3 键 2.4 约束 2.5 数据操纵语言(DML) 2.6 关系代数 2.6.1 选择运算 2.6.2 投影运算 2.6.3 合并运算 2.6.4 交运算 2.6.5 差运算 2.6.6 笛卡尔积运算 2.6.7 连接运算 2.6.8 额外的运算 2.7 思考 三、小结)

一、引言

1.1 什么是数据库

**数据库(Database)**是一个描述现实世界某些事物的互相关联的数据集合,数据库是大多数计算机应用程序的核心部分。

比如我们要创建一个类似于 music store 的数据库来记录音乐家和它们的专辑

我们需要记录两个基础信息:

  • 音乐家的信息
  • 音乐家发布的专辑

我们的数据库以 CSV(comma-seperated value,逗号分隔值) 文件的形式来存储

  • 每一个实体都有一个csv文件
  • 应用程序每次想要查询/更新记录时,都必须解析文件

我们对上述解析逻辑给出Python3代码

python 复制代码
for line in file.readlines():
    record = parse(line)
    if record[0] == 'GZA':
		print(int(record[1]))

上述逻辑有很多问题:

首先,显然这是一个效率很低的方式,不过对于增添操作,我们只需在末尾添加,效率其也还行。

其次,数据库的模式、关系是隐式表示的,上面直接 record[0] == 'GZA' 类似的逻辑是很差的

延续上面的例子,我们有几个方面的问题

1.2 数据完整性

  1. 上面展示的是音乐家和专辑1对1的关系,但是许多专辑可能是同一位音乐家,我们如何确保一对多的关系呢?
  2. 如果有人用非法字符串重写了的专辑年份呢?
  3. 如果一个专辑有多位音乐家呢?
  4. 如果我们删除了某位有专辑的音乐家,会发生什么?

上面的问题都是关于数据完整性的问题?

1.3 数据库的操作

  1. 如何找到某个特定的记录?
  2. 我们如何创建一个新的拥有相同数据库应用程序 以及 应用程序在不同的设备上运行会怎样?
  3. 如果两个线程同时尝试写同一文件又会怎样?

1.4 数据库的持久性

  1. 如果我们更新记录时机器崩溃了该如何处理?
  2. 如何将数据库扩展到多个机器来应对高频访问?

1.5 数据库管理系统

**数据库管理系统(Database Management System,DBMS)**由一个互相关联的数据的集合和一组用以访问这些数据的程序组成。DBMS主要目标是提供一种可以方便、高效地存取数据库信息的途径。

一个通用的 DBMS 支持定义或明确内在实现方式,包括 创建、查询、更新、如何管理数据库等操作。

1.6 数据模型

**数据模型(Data model)**是一个描述数据、数据联系、数据语义以及一致性约束的概念工具的集合。

  • Relational

大多数DBMS采用

  • Key / Value
  • Graph
  • Document/XML / Object
  • Wide-Column / Column-family

一般为NoSQL(非关系型数据库)采用。

  • Array/Matrix/Vectors

机器学习采用较多

  • Hierarchical
  • Network
  • Multi-Value

目前已过时

1.7 早期DBMS

1960s,早期数据库应用程序很难在DMBS上构建和维护。

这时期的DBMS有:IDS, IMS, CODASYL

这一时期的DBMS存在问题:每当需要在逻辑层和物理层对模式进行修改时,都几乎得重写应用程序,因为程序员不知道清除数据库后数据在磁盘上的表示方式发生了怎样的变化。

1960s,IBM的数学家Ted Codd 看到了IBM的工程师每次修改数据库的模式和布局都要重写数据库后,于1969年设计了关系模型(relational model),这也是本节的主题。

二、关系模型

2.1 什么是关系模型

**关系模型(relational model)**基于关系来定义数据库抽象,从而避免过多的维护。

核心逻辑:

  • 用简单的数据结构存储数据集合
  • 保留数据本身的物理表示,如磁盘或者内存中的实际位和字节
  • 通过高级语言查询数据,但具体的底层查询方式由DBMS来决定

关系模型的三大关键包括:

  • 结构(structure):即如何定义数据库的实际构成,关系中包含哪些内容,它们的属性以及类型
  • 完整性(integrity):确保数据库中的数据是合法的
  • 操作(Manipulation):如何去访问和修改数据

2.2 关系数据库的结构

关系数据库由**表(table)**的集合组成,每张表被赋予唯一一个名称。

如上面的Artist表,一共有三个列标题,表中每一行记录了一位Artist的相关信息。

关系模型中,**关系(relation)**用来指代表。**元组(tuple)**用来指代行。**属性(attribute)**用来指代列。

**关系实例(table instance)**这个术语来指代一个关系的特定实例,如上表,就是一个Artist的实例。

  • 每个关系的每个属性都有一个允许取值的集合,该集合称为该属性的域(domain)
  • 如果一个域中的元素被认为是不可再分的单元,则该域是原子的(atomic)。如一个人可能有多个电话号码,那么我们建立一个以电话号码为属性的表,那么电话号码的表就不是原子的,因为一个元素是电话号码的集合。
  • **空值(null value)**是一个特殊的值,表示未知或者并不存在。如果允许的话,我们认为控制是每一个域的成员。

2.3 键

**主键(primary key)**在一个关系中用来区分不同元组。

  • 如果表没有定义主键,一些DBMS自动创建内部的主键

DBMS 能够通过一列自动生成一个主键。

  • IDENTITY(SQL Standard)
  • SEQUENCE(PostgreSQL/Oracle)
  • AUTO_INCREMENT(MySQL)

外码(foreign key) 特指一种映射到另一个关系的一个元组的属性,

即,一个关系中的一个属性,是另一个表的主键。

如下图,我们有一个ArtistAlbum表,一个Artist表,一个Album表

在ArtistAlbum中,artist_id 和 album_id 分别是Artist 和 Album 的主键

2.4 约束

用户定义的条件必须对每一个数据库示例都成立。

  • 对特定属性或者全局范围内都有效
  • DBMS 会组织违反任意约束的修改操作

SQL中可以进行全局断言,不过很少使用,因为效率太低。

2.5 数据操纵语言(DML)

数据操纵语言(DML) 是 从数据库存储获取信息的方式。

一般分为过程化(Procedural)非过程化(Non-Procedural)

过程化语言 基于集合,关注找到结果的策略。------关系代数

而过程化语言 只关注 什么数据是想要的,并不关注如何找到它。------关系演算

2.6 关系代数

**关系代数(relation algebra)**是在关系中获取和操作元组的基础操作。

  • 基于集合代数

关系代数有很多的运算,每一个运算以一个或者多个关系来作为其输入,并输出一个新的关系。

  • 我们可以通过复合多个运算来实现更为复杂的运算
2.6.1 选择运算

**选择(select)**运算从一些元组中选出一个满足给定谓词的元组的集合,它是一个一元运算。

我们使用小写希腊字母 σ 来代表选择。

语法: σ p r e d i c a t e ( R ) \sigma_{predicate}(R) σpredicate(R)

下面是 选择运算的示例,以及SQL语言表示

2.6.2 投影运算

**投影(project)**运算也是一个一元运算,可以生成一个只包含特定属性的元组的关系。

  • 可以重新排列属性的顺序
  • 可以移除我们不想要的属性
  • 操作属性的值来生成新的派生属性(比如下面将b_id的值减去100)

语法: ∏ A 1 , A 2 , . . . , A n ( R ) \prod_{A1,A2,...,An}(R) ∏A1,A2,...,An(R)

下面是示例以及SQL语言表示

2.6.3 合并运算

合并(Union)运算生成一个包含在任意输入关系中的元组的关系。

语法: R ∪ S R \cup S R∪S

下面是示例以及SQL语句表示

值得注意的是,在SQL中UNION会自动去重,如果保留重复项以提高效率,应该使用UNION ALL

2.6.4 交运算

交(intersect)运算生成只在两个输入中都出现的元组的关系。

语法: R ∩ S R \cap S R∩S

下面是示例以及SQL语句表示

2.6.5 差运算

差(differentiate)运算 生成一个只在第一个输入中出现并非在第二个输入中出现的元组的关系。

语法:(R - S)

下面是示例以及SQL语句表示

2.6.6 笛卡尔积运算

笛卡尔积(product)运算会生成第一个输入和第二个输入的元组间的所有二元组合的关系。

Syntax:(R × S)

2.6.7 连接运算

连接(join)运算生成两个输入所有有一个或者多个公共值的元组的组合。

语法: R ⋈ S R \Join S R⋈S

下面是示例以及一些SQL语句的表示

我们可以在SQL语句中 指定 公共值(一个或多个)

2.6.8 额外的运算

Ted Codd在设计关系模型时并未考虑到实际应用中的不足,所以人们又完善了一些额外操作。

赋值(assignment)运算 用 ← \leftarrow ←来表示,很多时候我们需要将关系代数表达式中的一部分赋值给临时的关系变量。

比如我们有课程表,我们想要获取在2017年秋季和2018年春季都开设的课程ID

**更名(rename)**运算,用小写希腊字母 ρ 来表示。

语法: ρ x ( A 1 , A 2 , . . . , A n ) ( E ) \rho_{x(A1,A2,...,An)(E)} ρx(A1,A2,...,An)(E),表示返回以x 命名的表达式E的结果,并且将其属性重命名为A1,A2,...,An

很多时候我们需要多次使用相同的关系,那么我们就可以通过更名操作来指代某些关系。

**除法(division)**运算定义如下:

r® 和 s(S) 代表关系,并且 S ⊆ R S \subseteq R S⊆R,即,模式S的每个属性也在模式R内。

给定元组 t,令t[S] 代表元组t 在 S中属性上的投影。

那么r ÷ s 是 R - S模式上的一个关系,元组t 在 r ÷ s 中的充分必要条件是:

  • t 在 ∏ R − S ( r ) \prod _{R - S}(r) ∏R−S(r)中
  • 对于s 中的每个元组 t s t_s ts,在r 中存在一个元组 t r t_r tr 同时满足如下条件:
    • t r [ S ] = t s [ S ] t_r[S] = t_s[S] tr[S]=ts[S]
    • t r [ R − S ] = t t_r[R - S] = t tr[R−S]=t

语言过于抽象,下面是示例:

2.7 思考

关系代数定义了高层级语言对于如何计算查询的命令:

  • 比如: σ b i d = 102 ( R ⋈ S ) \sigma_{b_id=102}(R\Join S) σbid=102(R⋈S) vs R ⋈ ( σ b i d = 102 ( S ) ) R \Join (\sigma_{b_id=102}(S)) R⋈(σbid=102(S))
  • 二者的计算量不同,效率自然也不同

一个更好的方式是声明你希望DBMS去计算的答案。

  • Example:Retrieve the joined tuples from R and S where b_id equals 102

这也是为什么我们希望有SQL这样的声明式语言。

三、小结

  • 数据库无处不在
  • 关系代数是关系型数据库中处理查询的基本原语
  • 关系代数将成为交互的核心基础,这也决定了我们如何构建系统组件以及执行查询。
相关推荐
huaqianzkh1 小时前
了解MySQL 高可用架构:主从备份
数据库·mysql·架构
向往风的男子2 小时前
【mysql】mysql之读写分离以及分库分表
数据库·mysql
阳光开朗_大男孩儿2 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
挠背小能手2 小时前
达梦数据库SCHEMA使用初探
数据库·oracle
楠神说软件测试3 小时前
接口自动化框架入门(requests+pytest)
运维·数据库·自动化
惟长堤一痕3 小时前
医学数据分析实训 项目一 医学数据采集
数据库
xuan哈哈哈3 小时前
web基础—dvwa靶场(八)SQL Injection(Blind)
数据库·web安全·网络安全
Lill_bin3 小时前
Lua编程语言简介与应用
开发语言·数据库·缓存·设计模式·性能优化·lua
终末圆3 小时前
MyBatis动态SQL中的`if`标签使用【后端 19】
java·数据结构·数据库·sql·算法·spring·mybatis
拾伍廿肆4 小时前
Django ORM(多表)
数据库·django