关系数据库运算符
运算符符号作用类比SQL选择σ按条件筛选行WHERE投影π选取指定的列SELECT [列名]并∪合并两个表,去重UNION差求两个表的差集EXCEPTMINUS笛卡尔积×所有元组的组合CROSS JOIN交∩求两个表的交集INTERSECT连接⋈有条件的笛卡尔积重命名ρ修改关系或属性名AS除÷解决“包含所有”问题NOT EXISTS子查询。
一、 基本关系运算符(核心的5种)
这5种运算符是关系代数的基础,其他运算符都可以由它们推导出来。
1. 选择 (Selection)
-
作用:根据给定的条件,从关系(表)中水平地筛选出满足条件的元组(行)。它就像是一个过滤器。
-
符号: σ (Sigma)
-
类比SQL:
WHERE子句。 -
示例:
-
有一个关系
学生(学号, 姓名, 年龄, 系别)。 -
查询所有计算机系的学生:
σ_(系别='计算机系')(学生) -
SQL对应:
SELECT * FROM 学生 WHERE 系别 = '计算机系‘;
-
2. 投影 (Projection)
-
作用:从关系(表)中垂直地选取指定的属性列,并去除重复的行。
-
符号: π (Pi)
-
类比SQL:
SELECT后面指定列名。 -
示例:
-
关系
学生(学号, 姓名, 年龄, 系别)。 -
只查看所有学生的姓名和系别:
π_(姓名, 系别)(学生) -
SQL对应:
SELECT 姓名, 系别 FROM 学生;(注意:SQL中除非使用DISTINCT,否则不会自动去重)
-
3. 并 (Union)
-
作用:将两个结构相同(属性数目相同且对应属性的数据类型兼容)的关系合并成一个新关系,并自动去除重复的元组。
-
符号: ∪
-
类比SQL:
UNION运算符。 -
示例:
-
有关系
2019级学生(学号, 姓名)和2020级学生(学号, 姓名)。 -
查询所有在校学生(不区分年级):
2019级学生 ∪ 2020级学生 -
SQL对应:
SELECT * FROM 2019级学生 UNION SELECT * FROM 2020级学生;
-
4. 差 (Difference)
-
作用:返回属于第一个关系但不属于第二个关系的所有元组。两个关系也必须结构相同。
-
符号: -
-
类比SQL:
EXCEPT(在Oracle中是MINUS)。 -
示例:
-
有关系
选修了数学课的学生(学号, 姓名)和选修了英语课的学生(学号, 姓名)。 -
查询只选修了数学课但没有选修英语课的学生:
选修了数学课的学生 - 选修了英语课的学生 -
SQL对应:
SELECT * FROM 选修了数学课的学生 EXCEPT SELECT * FROM 选修了英语课的学生;
-
5. 笛卡尔积 (Cartesian Product)
-
作用:将两个关系中的元组进行所有可能的组合。如果第一个关系有m个元组,第二个有n个元组,结果就有m*n个元组。
-
符号: ×
-
类比SQL:
CROSS JOIN或者没有连接条件的多表查询。 -
示例:
-
有关系
学生(学号, 姓名)(有2条记录) 和课程(课程号, 课程名)(有3条记录)。 -
它们的笛卡尔积会产生 2 * 3 = 6 条记录,表示所有学生和所有课程的可能组合。
-
SQL对应:
SELECT * FROM 学生 CROSS JOIN 课程;或SELECT * FROM 学生, 课程;
-
二、 扩展关系运算符(由基本运算符导出)
这些运算符非常常用,可以看作是基本运算符的快捷方式。
6. 交 (Intersection)
-
作用:返回同时属于两个关系的所有元组。两个关系必须结构相同。
-
符号: ∩
-
推导:
R ∩ S = R - (R - S) -
类比SQL:
INTERSECT。 -
示例:
-
查询既选修了数学课又选修了英语课的学生:
选修了数学课的学生 ∩ 选修了英语课的学生 -
SQL对应:
SELECT * FROM 选修了数学课的学生 INTERSECT SELECT * FROM 选修了英语课的学生;
-
7. 连接 (Join)
-
作用:在笛卡尔积的基础上,根据给定的连接条件筛选出有意义的元组。这是最常用、最重要的运算符之一。
-
符号: ⋈
-
推导:
R ⋈_(条件) S = σ_(条件)(R × S)(即先做笛卡尔积,再进行选择) -
类比SQL: 各种
JOIN(INNER JOIN,LEFT JOIN等)。
连接有多种类型,最核心的是等值连接和自然连接:
-
等值连接 (Equijoin):连接条件是属性的相等比较。
-
示例:
学生 ⋈_(学生.学号 = 选课.学号) 选课
-
-
自然连接 (Natural Join):一种特殊的等值连接,它会自动比较两个关系中所有同名的属性,并在结果中去除重复的同名属性。这是最常用的连接。
-
示例: 如果
学生和选课表都有学号属性,那么学生 ⋈ 选课会自动按学号相等进行连接,结果中只有一个学号列。
-
8. 重命名 (Rename)
-
作用:修改关系或属性的名称,通常是为了连接自身(自连接)或使结果更清晰。
-
符号: ρ (Rho)
-
类比SQL:
AS关键字。 -
示例:
-
将关系
学生重命名为S:ρ_S(学生) -
将属性
姓名重命名为学生姓名:ρ_(学生姓名 <- 姓名)(学生) -
SQL对应:
SELECT 姓名 AS 学生姓名 FROM 学生;或FROM 学生 AS S
-
9. 除 (Division)
-
作用:解决“查询包含了所有...”这类问题。例如,“查询选修了所有课程的学生”。
-
符号: ÷
-
推导: 相对复杂,可以理解为:关系R除以关系S的结果,是满足“结果与S的笛卡尔积包含在R中”的最大关系。
-
类比SQL: 没有直接对应的运算符,通常用
NOT EXISTS双重嵌套子查询实现。 -
示例:
-
选课(学号, 课程号)÷所有课程(课程号)=选修了所有课程的学号。
-
总结表
| 运算符 | 符号 | 作用 | 类比SQL |
|---|---|---|---|
| 选择 | σ | 按条件筛选行 | WHERE |
| 投影 | π | 选取指定的列 | SELECT [列名] |
| 并 | ∪ | 合并两个表,去重 | UNION |
| 差 | - | 求两个表的差集 | EXCEPT / MINUS |
| 笛卡尔积 | × | 所有元组的组合 | CROSS JOIN |
| 交 | ∩ | 求两个表的交集 | INTERSECT |
| 连接 | ⋈ | 有条件的笛卡尔积 | JOIN ... ON ... |
| 重命名 | ρ | 修改关系或属性名 | AS |
| 除 | ÷ | 解决“包含所有”问题 | NOT EXISTS 子查询 |
更多推荐
所有评论(0)