关系代数是以关系为运算对象的一组高级集合运算,是SQL查询的理论基础。核心运算包括:
运算 | 符号 | 作用 | 对应SQL |
选择(Select) | σ | 选出满足条件的行(元组) |
|
投影(Project) | π | 选出指定的列(属性) |
|
并(Union) | ∪ | 合并两个关系,去重 |
|
差(Difference) | − | 属于R但不属于S的元组 |
|
交(Intersection) | ∩ | 既属于R又属于S的元组 |
|
笛卡尔积(Product) | × | 两个关系的所有组合 |
|
连接(Join) | ⋈ | 按条件组合两个关系的元组 |
|
自然连接(Natural Join) | ⋈ | 相同属性名等值连接,并去重 |
|
除(Division) | ÷ | 找出包含S中所有元组的R的元组 | 无直接关键字,需 |
设有三个表:
学生表 Student
Sno | Sname | Ssex | Sage |
001 | 张三 | 男 | 20 |
002 | 李四 | 女 | 21 |
003 | 王五 | 男 | 19 |
课程表 Course
Cno | Cname | Credit |
C01 | 数据库 | 3 |
C02 | 操作系统 | 4 |
C03 | 网络 | 2 |
选课表 SC
Sno | Cno | Grade |
001 | C01 | 85 |
001 | C02 | 78 |
002 | C01 | 92 |
003 | C03 | 67 |
示例1:选择与投影
查询“年龄大于20岁的男生,只显示学号和姓名”
关系代数:πSno,Sname(σSage>20∧Ssex=′男′(Student))
SQL:
SELECT Sno, Sname FROM Student WHERE Sage>20 AND Ssex='男';
示例2:自然连接
查询所有学生的选课信息(含学生姓名和课程名)
关系代数:Student⋈SC⋈CourseStudent⋈SC⋈Course
SQL:
SELECT * FROM Student NATURAL JOIN SC NATURAL JOIN Course;
示例3:除运算
查询选修了所有课程的学生学号
关系代数:πSno,Cno(SC)÷πCno(Course)
PLAINTEXT
SELECT Sno FROM SC
GROUP BY Sno
HAVING COUNT(DISTINCT Cno) = (SELECT COUNT(*) FROM Course);
