关系代数
一、选择 Selection(σ)—— “横向切行”
定义:给定关系 R与谓词 P,σP(R)返回 R中所有满足 P的元组。
形式:σP(R)
谓词构成:原子比较(属性 vs 常量 或 属性 vs 属性)通过逻辑连接词 ∧(合取)、∨(析取)、¬(否定)组合而成。
对应 SQL:SELECT * FROM R WHERE P;
示例:
σAge>18(Student)等价于 SQL:
SELECT * FROM Student WHERE Age > 18;
二、投影 Projection(π)—— “纵向取列(并去重)”
定义:给定关系 R与属性列表 A1,A2,…,Ak,πA1,…,Ak(R)返回仅包含这些属性的元组,并去除重复元组。
形式:πL(R),其中 L为属性列表。
对应 SQL:SELECT DISTINCT L FROM R;(严格语义下需使用 DISTINCT)。
示例:
πName, Age(Student)等价于 SQL:
SELECT DISTINCT Name, Age FROM Student;
三、连接 Join(⋈)—— “先配对,再挑对:把两张表拼成宽行”
1. θ-连接(Theta Join)
定义:R⋈θS≡σθ(R×S),其中 θ是比较谓词。
形式:R⋈θS
特例:当 θ中所有比较均为等号时,称为等值连接。
对应 SQL:SELECT * FROM R JOIN S ON θ;
2.自然连接(Natural Join)
定义:R⋈S自动在 R与 S的同名属性上执行等值连接,并在结果中仅保留同名属性的一份副本。
形式:R⋈S
性质:无需显式指定连接条件,依赖属性名的语义一致性。
对应 SQL:SELECT * FROM R NATURAL JOIN S;或使用显式 ON子句(推荐)。
示例:
关系 Student(SID,Name)与 Enroll(SID,CourseID)的自然连接:
Student⋈Enroll
等价 SQL:
SELECT * FROM Student NATURAL JOIN Enroll;
或更可控的显式写法:
SELECT * FROM Student JOIN Enroll ON Student.SID = Enroll.SID;
四、除法 Division(÷)—— “全覆盖 / 包含全部”的利器
定义:设关系 R(X,Y)与 S(Y),其中 X与 Y为属性组。R÷S返回所有 X值,使得该 X在 R中出现的 Y值集合包含 S中的所有 Y值。
形式:R÷S
代数等价式:
R÷S=πX(R)−πX((πX(R)×S)−R)
计算步骤:
-
计算候选 X:πX(R)。
-
生成理论全集:πX(R)×S。
-
找出缺失配对:理论全集减去实际配对 R。
-
剔除有缺失的 X:从候选集中移除出现在缺失配对中的 X。
对应 SQL:无直接关键字,通常使用双重 NOT EXISTS 实现。
示例:
设 R(StudentID,CourseID)为选课记录,S(CourseID)为必修课集合。
查询“选修了全部必修课的学生”:
πStudentID,CourseID(R)÷πCourseID(S)
等价 SQL:
SELECT DISTINCT e.StudentID
FROM Enroll e
WHERE NOT EXISTS (
SELECT 1 FROM Required r
WHERE NOT EXISTS (
SELECT 1 FROM Enroll e2
WHERE e2.StudentID = e.StudentID
AND e2.CourseID = r.CourseID
)
);
总结
