关系代数 8 大核心运算从选择投影到除法3 类连接实战解析在数据库系统的学习中关系代数作为SQL查询的数学基础是理解数据操作本质的关键工具。不同于单纯记忆运算符符号真正掌握关系代数需要从实际查询场景出发理解每种运算背后的数据筛选逻辑。本文将用学生-课程-成绩这一经典案例贯穿始终带您深入8种核心运算的实战应用特别是三类连接的微妙差异。1. 关系代数基础与运算分类关系代数是Edgar F. Codd在1970年提出的关系数据库理论基础它用集合操作的方式描述对数据的查询过程。想象您面前有两张Excel表格——关系代数的每个运算都是在对这些表格进行裁剪、拼接或筛选。所有运算可归为两类传统集合运算继承自数学集合论包括并(∪)、交(∩)、差(-)和笛卡尔积(×)专门关系运算为数据库查询设计的运算包括选择(σ)、投影(π)、连接(⋈)和除法(÷)-- 示例创建基础表结构 CREATE TABLE 学生 ( 学号 CHAR(5) PRIMARY KEY, 姓名 VARCHAR(10) NOT NULL, 性别 CHAR(1) CHECK(性别 IN (男,女)), 年龄 INT ); CREATE TABLE 课程 ( 课程号 CHAR(4) PRIMARY KEY, 课程名 VARCHAR(20), 学分 INT ); CREATE TABLE 选课 ( 学号 CHAR(5), 课程号 CHAR(4), 成绩 DECIMAL(5,1), PRIMARY KEY (学号, 课程号), FOREIGN KEY (学号) REFERENCES 学生(学号), FOREIGN KEY (课程号) REFERENCES 课程(课程号) );2. 单表操作选择与投影2.1 选择运算(σ)数据的水平过滤选择运算相当于SQL中的WHERE子句它从关系中选取满足条件的元组行。运算符表示为σ条件(R)就像用筛子过滤数据-- 选择年龄大于20的男生 σ_性别男 AND 年龄20(学生) -- 对应SQL SELECT * FROM 学生 WHERE 性别男 AND 年龄20;常见误区选择条件中的属性必须存在于关系中且条件表达式结果应为布尔值。选择运算不会改变关系的结构只是筛选行。2.2 投影运算(π)数据的垂直裁剪投影运算对应SQL中的SELECT子句指定列它从关系中选择特定的属性列垂直裁剪。表示为π属性列表(R)-- 获取所有学生的姓名和年龄 π_姓名,年龄(学生) -- 对应SQL SELECT 姓名, 年龄 FROM 学生;注意投影会自动去除重复行这与SQL中默认保留所有行的行为不同。如需保留重复项需使用SQL的ALL关键字。选择与投影的组合使用-- 获取年龄大于20的男生姓名 π_姓名(σ_性别男 AND 年龄20(学生)) -- 对应SQL SELECT 姓名 FROM 学生 WHERE 性别男 AND 年龄20;3. 多表操作连接与集合运算3.1 笛卡尔积(×)关系的全组合笛卡尔积将两个关系的所有元组进行组合结果的关系度数为两关系度数之和元组数量为两者乘积学生 × 课程 -- 每个学生与每门课程的组合实际应用中通常会配合选择运算实现连接σ_学生.学号选课.学号 AND 选课.课程号课程.课程号(学生 × 选课 × 课程)3.2 连接运算(⋈)有条件的笛卡尔积连接是关系代数中最核心的运算之一主要有三类实现方式3.2.1 内连接(等值连接)最常见的连接类型根据两个关系的公共属性值相等进行连接学生 ⋈ 选课 -- 自然连接自动匹配同名属性 -- 显式指定连接条件 学生 ⋈_{学生.学号选课.学号} 选课内连接结果特点只保留两表中匹配的行结果表中公共属性只出现一次3.2.2 外连接保留未匹配元组外连接分为左外(⟕)、右外(⟖)和全外连接(⟗)用于保留未匹配的元组连接类型符号保留内容示例左外连接⟕左表所有元组学生 ⟕ 选课右外连接⟖右表所有元组学生 ⟖ 选课全外连接⟗两表所有元组学生 ⟗ 选课-- 左外连接即使没有选课记录也显示学生 学生 ⟕ 选课 -- 对应SQL SELECT * FROM 学生 LEFT JOIN 选课 ON 学生.学号选课.学号;3.2.3 自然连接自动匹配同名属性自然连接是特殊的等值连接自动匹配所有同名属性并去除重复列学生 ⋈ 选课 -- 自动按学号连接 -- 与普通等值连接的区别 学生 ⋈_{学生.学号选课.学号} 选课 -- 结果保留两个学号列3.3 集合运算并、交、差集合运算要求两关系必须并集兼容相同数量的属性且对应域相同运算符号说明示例并∪两关系的所有元组R ∪ S交∩两关系共有的元组R ∩ S差-在R但不在S的元组R - S-- 查询选修了CS101或CS102课程的学生学号 π_学号(σ_课程号CS101(选课)) ∪ π_学号(σ_课程号CS102(选课))4. 高级运算除法与综合应用4.1 除法运算(÷)解决全部问题除法运算用于查询满足所有条件的场景如选修了所有课程的学生-- 查询选修了所有课程的学生学号 π_学号,课程号(选课) ÷ π_课程号(课程) -- 分步解释 1. 计算所有课程集合π_课程号(课程) 2. 对每个学生检查其选修课程是否包含所有课程除法运算的SQL实现由于SQL没有直接对应的除法运算符通常用NOT EXISTS实现SELECT DISTINCT 学号 FROM 学生 S WHERE NOT EXISTS ( SELECT 课程号 FROM 课程 WHERE NOT EXISTS ( SELECT * FROM 选课 WHERE 选课.学号S.学号 AND 选课.课程号课程.课程号 ) );4.2 综合案例解析案例查询选修了数据库系统且成绩大于90分的学生的姓名和所在系π_姓名,年龄( σ_成绩90 AND 课程名数据库系统( 学生 ⋈ 选课 ⋈ 课程 ) ) -- 对应SQL SELECT 姓名, 年龄 FROM 学生 JOIN 选课 ON 学生.学号选课.学号 JOIN 课程 ON 选课.课程号课程.课程号 WHERE 成绩90 AND 课程名数据库系统;5. 关系代数与SQL的对应关系下表总结了关系代数运算与SQL的对应关系关系代数SQL说明σ_条件(R)SELECT * FROM R WHERE 条件行筛选π_A,B(R)SELECT A,B FROM R列选择R × SFROM R CROSS JOIN S笛卡尔积R ⋈ SFROM R NATURAL JOIN S自然连接R ⋈_条件 SFROM R JOIN S ON 条件θ连接R ∪ SSELECT * FROM R UNION SELECT * FROM S并集R ∩ SINTERSECT (部分数据库支持)交集R - SEXCEPT (或MINUS)差集R ÷ S需用NOT EXISTS实现除法理解这些对应关系有助于在编写复杂SQL查询时先在关系代数层面设计查询逻辑再转换为SQL实现。