一、 基本关系运算符(核心的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 JOINLEFT 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 子查询
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐