数据库系统概论(六)详细讲解关系代数
 - 前言
- 一、什么是关系代数?
- 二、传统的集合运算
- 1. 并(Union)
- 2. 差(Difference)
- 3. 交(Intersection)
- 4. 笛卡尔积(Cartesian Product)
 
- 三、专门的集合运算
- 1. 选择(Selection)
- 2. 投影(Projection)
- 3. 连接(Join)
- ① 非等值连接
- ② 等值连接
- ③ 自然连接
- ④ 外连接(保留未匹配的行)
 
- 4. 除(Division)
 
- 四、总结
  
 
 
前言
 
- 在数据库系统概论的学习进程中,我们已逐步解锁数据库的关键领域,从基础概念的积淀到关系模型数据结构的深度解析,每一篇都在为构筑完备的数据库知识大厦奠基。
- 作为系列的第六篇,本文将深度钻研关系代数 —— 这一数据库操作的形式化语言。它不仅是破解数据库查询与数据操作奥秘的核心密钥,更是精通数据库设计、提升查询优化能力的关键阶梯,将带领我们进一步洞悉数据库高效运作的数据处理之道。
 我的个人主页,欢迎来阅读我的其他文章
 https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
 我的数据库系统概论专栏
 https://blog.csdn.net/2402_83322742/category_12911520.html?spm=1001.2014.3001.5482
 
 
 
一、什么是关系代数?
 

 
简单理解:关系代数是数据库的“数学语言”,用来定义如何对数据表(二维表格)进行操作。
 核心思想:通过各种“运算符”对表进行“行”或“列”的处理,得到新表。
 
二、传统的集合运算
 
 前提:参与运算的表必须“相容” 
 即 **列数相同,且对应列的数据类型一致**(比如都是“姓名”“年龄”这样的列)。 
1. 并(Union)
 
作用:合并两个表的所有数据,重复数据只保留一份。
 符号:R∪S
 例子:
 
 
 
并运算结果(表A∪表B):
 
 
2. 差(Difference)
 
作用:从表A中删除表B中存在的数据。
 符号: ( R - S )
 例子:表A - 表B(只保留表A有、表B没有的数据):
 
 
 
 
3. 交(Intersection)
 
作用:找出两个表中完全相同的数据。
 符号: ( R ∩ S )
 例子:表A∩表B(同时在表A和表B中出现的数据):
 
表A(学生选课表A)
 
 
表B(学生选课表B)
 
 
交运算结果(表A ∩ 表B)
 
 
4. 笛卡尔积(Cartesian Product)
 
作用:将两个表的每一行两两组合,生成一个大表。
 符号: ( R × S )
 例子:
 
 
 
笛卡尔积结果(表A×表B,共 ( 2×2=4 ) 行):
 
| 姓名 | 性别 | 课程名 | 
|---|
| 张三 | 男 | 数学 | 
| 张三 | 男 | 英语 | 
| 李四 | 女 | 数学 | 
| 李四 | 女 | 英语 | 
 
三、专门的集合运算
 
1. 选择(Selection)
 
作用:按条件筛选表中的“行”(筛选后行数可能减少)。
 符号:
 
例子:从“学生表”中选出“年龄>18”的学生:
 
 
选择结果
 
 
2. 投影(Projection)
 
作用:选择表中的“列”,并去除重复行(筛选后列数可能减少)。
 符号: 
 
例子:从“学生表”中提取“姓名”和“性别”列:
 投影结果
 
 
 
3. 连接(Join)
 
作用:按条件将两个表“拼接”成一个表,重点是“如何拼接”。
 
① 非等值连接
 
条件:用“≠、>、<”等非等号条件拼接。
 例子:表A(学生成绩)和表B(及格线)按“成绩>及格分”连接:
 
 
 
结果(成绩>及格分,即80>60):
 
 
 
关系 ( R )
 
| ( A ) | ( B ) | ( C ) | 
|---|
| ( a_1 ) | ( b_1 ) | ( 5 ) | 
| ( a_1 ) | ( b_2 ) | ( 6 ) | 
| ( a_2 ) | ( b_3 ) | ( 8 ) | 
| ( a_2 ) | ( b_4 ) | ( 12 ) | 
 
关系 ( S )
 
| ( B ) | ( E ) | 
|---|
| ( b_1 ) | ( 3 ) | 
| ( b_2 ) | ( 7 ) | 
| ( b_3 ) | ( 10 ) | 
| ( b_3 ) | ( 2 ) | 
| ( b_5 ) | ( 2 ) | 
 
非等值连接 (E>C)
 
| ( A ) | ( R.B ) | ( C ) | ( S.B ) | ( E ) | 
|---|
| ( a_1 ) | ( b_1 ) | ( 5 ) | ( b_2 ) | ( 7 ) | 
| ( a_1 ) | ( b_1 ) | ( 5 ) | ( b_3 ) | ( 10 ) | 
| ( a_1 ) | ( b_2 ) | ( 6 ) | ( b_2 ) | ( 7 ) | 
| ( a_1 ) | ( b_2 ) | ( 6 ) | ( b_3 ) | ( 10 ) | 
| ( a_2 ) | ( b_3 ) | ( 8 ) | ( b_3 ) | ( 10 ) | 
 
② 等值连接
 
条件:用“=”拼接,要求两表有相同列名(或不同列名但值相等)。
 例子:表A和表B按“课程=课程名”连接(假设列名不同但含义相同):
 
 
 
结果(课程=课程名):
 
 
 
关系 ( R )
 
| ( A ) | ( B ) | ( C ) | 
|---|
| ( a_1 ) | ( b_1 ) | ( 5 ) | 
| ( a_1 ) | ( b_2 ) | ( 6 ) | 
| ( a_2 ) | ( b_3 ) | ( 8 ) | 
| ( a_2 ) | ( b_4 ) | ( 12 ) | 
 
关系 ( S )
 
| ( B ) | ( E ) | 
|---|
| ( b_1 ) | ( 3 ) | 
| ( b_2 ) | ( 7 ) | 
| ( b_3 ) | ( 10 ) | 
| ( b_3 ) | ( 2 ) | 
| ( b_5 ) | ( 2 ) | 
 
 等值连接 (R.B=S.B) 
 
| ( A ) | ( R.B ) | ( C ) | ( S.B ) | ( E ) | 
|---|
| ( a_1 ) | ( b_1 ) | ( 5 ) | ( b_1 ) | ( 3 ) | 
| ( a_1 ) | ( b_2 ) | ( 6 ) | ( b_2 ) | ( 7 ) | 
| ( a_2 ) | ( b_3 ) | ( 8 ) | ( b_3 ) | ( 10 ) | 
| ( a_2 ) | ( b_3 ) | ( 8 ) | ( b_3 ) | ( 2 ) | 
 
③ 自然连接
 
特点:自动去除重复列名,是“等值连接的优化版”(要求两表有至少一个同名列)。
 例子:表A和表B都有“课程”列,自然连接后合并该列:
 
 
 
结果(自动合并“课程”列):
 
 
 
关系 ( R )
 
| ( A ) | ( B ) | ( C ) | 
|---|
| ( a_1 ) | ( b_1 ) | ( 5 ) | 
| ( a_1 ) | ( b_2 ) | ( 6 ) | 
| ( a_2 ) | ( b_3 ) | ( 8 ) | 
| ( a_2 ) | ( b_4 ) | ( 12 ) | 
 
关系 ( S )
 
| ( B ) | ( E ) | 
|---|
| ( b_1 ) | ( 3 ) | 
| ( b_2 ) | ( 7 ) | 
| ( b_3 ) | ( 10 ) | 
| ( b_3 ) | ( 2 ) | 
| ( b_5 ) | ( 2 ) | 
 
 自然连接 R组的B列与S组的B列如果相等则连接 
 
| ( A ) | ( B ) | ( C ) | ( E ) | 
|---|
| ( a_1 ) | ( b_1 ) | ( 5 ) | ( 3 ) | 
| ( a_1 ) | ( b_2 ) | ( 6 ) | ( 7 ) | 
| ( a_2 ) | ( b_3 ) | ( 8 ) | ( 10 ) | 
| ( a_2 ) | ( b_3 ) | ( 8 ) | ( 2 ) | 
 
④ 外连接(保留未匹配的行)
 
- 左外连接:保留左表所有行,右表无匹配的行用NULL填充。
- 右外连接:保留右表所有行,左表无匹配的行用NULL填充。
- 全外连接:保留左右表所有行,无匹配的行用NULL填充(SQL中常用,关系代数中较少提)。
例子:左表A(学生)和右表B(选课),左外连接保留所有学生,无论是否选课:
 
 
 
左外连接结果:
 
 
表A
 
 
表B
 
 
右外连接结果(保留右表B所有行,左表A无匹配填 NULL)
 
 
4. 除(Division)
 
作用:从“被除数表”中找出“完全包含除数表所有数据”的行。
 前提:
 
- 被除数表(表A)需包含除数表(表B)的所有列,且还有额外列(如“学生”列)。
- 结果是“额外列”中,满足“与除数表所有行相关”的值。
例子:
 
| 表A(学生选课,被除数) | 学生 | 课程 | 
|---|
|  | 张三 | 数学 | 
|  | 张三 | 英语 | 
|  | 李四 | 数学 | 
|  | 王五 | 英语 | 
 
 
除运算逻辑:
 
- 表B要求“必须选数学”。
- 表A中每个学生的选课需包含表B的所有课程(即必须有“数学”)。
- 筛选出“学生”列中,满足条件的学生:
除运算结果(表A ÷ 表B):
 
 
四、总结
 
| 分类 | 运算符 | 作用描述 | 核心操作对象 | 例子关键词 | 
|---|
| 传统集合运算 | 并(∪) | 合并两表,去重 | 整表 | 合并选课学生 | 
|  | 差(-) | 表A减表B | 整表 | 找出表A独有的数据 | 
|  | 交(∩) | 找出两表共同数据 | 整表 | 同时出现在两表中的学生 | 
|  | 笛卡尔积(×) | 两两组合所有行 | 整表 | 学生×课程生成所有可能组合 | 
| 专门集合运算 | 选择(σ) | 按条件筛选行 | 行(筛选) | 选出年龄>18的学生 | 
|  | 投影(π) | 选择列,去重 | 列(筛选) | 提取姓名和性别列 | 
|  | 连接(⋈) | 按条件拼接两表 | 行(拼接) | 等值连接、自然连接、外连接 | 
|  | 除(÷) | 找出包含除数所有行的被除数数据 | 行(匹配) | 找出选了所有必选课程的学生 | 
 
 
以上就是这篇博客的全部内容,下一篇我们将继续探索更多精彩内容。
 
 我的个人主页,欢迎来阅读我的其他文章
 https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
 我的数据库系统概论专栏
 https://blog.csdn.net/2402_83322742/category_12911520.html?spm=1001.2014.3001.5482
 
 
 
 
