原文: https://beginnersbook.com/2019/02/dbms-relational-algebra/

在本教程中,我们将讨论关系代数。在前面的教程中,我们简要讨论了关系代数和微积分的基础知识,其中我们了解了使用这些理论数学系统的必要性。

什么是 DBMS 中的关系代数?

关系代数是一种过程查询语言,适用于关系模型。查询语言的目的是从数据库中检索数据或对数据执行各种操作,如插入,更新,删除。当我说关系代数是一种过程查询语言时,它意味着它告诉我们要检索哪些数据以及如何检索它们。

另一方面,关系演算是一种非过程式查询语言,这意味着它会告诉要检索哪些数据但不会告诉如何检索它。我们将在单独的教程中讨论关系演算。

关系代数中的运算类型

我们将这些操作分为两类:

  1. 基本操作
  2. 派生操作

基本/基本操作:

  1. 选择(σ
  2. 投影(Π
  3. 并集(
  4. 差集(-
  5. 笛卡尔积(X
  6. 重命名(ρ

衍生操作:

  1. 自然连接(
  2. 左,右,全外连接(
  3. 交集(
  4. 除法(÷

让我们在示例的帮助下逐一讨论这些操作。

选择运算符(σ

选择运算符由 sigma(σ)表示,它用于查找满足给定条件的关系(或表)中的元组(或行)。

如果您了解一点 SQL,那么您可以将其视为 SQL 中的where子句,它用于相同的目的。

选择运算符语法(σ

  1. σ Condition/Predicate(Relation/Table name)

选择运算符(σ)示例

  1. Table: CUSTOMER
  2. ---------------
  3. Customer_Id Customer_Name Customer_City
  4. ----------- ------------- -------------
  5. C10100 Steve Agra
  6. C10111 Raghu Agra
  7. C10115 Chaitanya Noida
  8. C10117 Ajeet Delhi
  9. C10118 Carl Delhi

查询:

  1. σ Customer_City="Agra" (CUSTOMER)

输出:

  1. Customer_Id Customer_Name Customer_City
  2. ----------- ------------- -------------
  3. C10100 Steve Agra
  4. C10111 Raghu Agra

投影运算符(Π

投影运算符由Π符号表示,用于从表(或关系)中选择所需的列(或属性)。

关系代数中的投影运算符类似于 SQL 中的Select语句

投影运算符语法(Π

  1. column_name1, column_name2, ...., column_nameN(table_name)

投影运算符(Π)示例

在这个例子中,我们有一个包含三列的表CUSTOMER,我们只想获取表的两列,我们可以在投影运算符Π的帮助下完成。

  1. Table: CUSTOMER
  2. Customer_Id Customer_Name Customer_City
  3. ----------- ------------- -------------
  4. C10100 Steve Agra
  5. C10111 Raghu Agra
  6. C10115 Chaitanya Noida
  7. C10117 Ajeet Delhi
  8. C10118 Carl Delhi

查询:

  1. Customer_Name, Customer_City (CUSTOMER)

输出:

  1. Customer_Name Customer_City
  2. ------------- -------------
  3. Steve Agra
  4. Raghu Agra
  5. Chaitanya Noida
  6. Ajeet Delhi
  7. Carl Delhi

并集运算符(

并集运算符用符号表示,用于从两个表(关系)中选择所有行(元组)。

让我们再讨论一下并集运算符。假设我们有两个关系R1R2都有相同的列,我们想从这些关系中选择所有元组(行),然后我们可以在这些关系上应用并集运算符。

注意:两个表中存在的行(元组)只在并集中出现一次。简而言之,您可以说并集操作后没有重复项。

并集运算符的语法(

  1. table_name1 table_name2

并集运算符()示例

表 1:Course

  1. Course_Id Student_Name Student_Id
  2. --------- ------------ ----------
  3. C101 Aditya S901
  4. C104 Aditya S901
  5. C106 Steve S911
  6. C109 Paul S921
  7. C115 Lucy S931

表 2:Student

  1. Student_Id Student_Name Student_Age
  2. ------------ ---------- -----------
  3. S901 Aditya 19
  4. S911 Steve 18
  5. S921 Paul 19
  6. S931 Lucy 17
  7. S941 Carl 16
  8. S951 Rick 18

查询:

  1. Student_Name (COURSE) Student_Name (STUDENT)

输出:

  1. Student_Name
  2. ------------
  3. Aditya
  4. Carl
  5. Paul
  6. Lucy
  7. Rick
  8. Steve

注意:正如你所看到的那样,输出中没有重复的名称,即使我们在两个表中都有很少的共同名称,同样在COURSE表中我们也有重复的名称。

交集运算符(

交集运算符用符号表示,用于从两个表(关系)中选择公共行(元组)。

假设我们有两个关系R1R2都有相同的列,我们想要选择两个关系中存在的所有元组(行),那么在这种情况下我们可以对这两个关系R1∩R2应用交集运算。

注意:只有那两个表中存在的那些行才会出现在结果集中。

交集运算符语法(

  1. table_name1 table_name2

交集运算符()示例

让我们采取与上面相同的例子。

表 1:Course

  1. Course_Id Student_Name Student_Id
  2. --------- ------------ ----------
  3. C101 Aditya S901
  4. C104 Aditya S901
  5. C106 Steve S911
  6. C109 Paul S921
  7. C115 Lucy S931

表 2:STUDENT

  1. Student_Id Student_Name Student_Age
  2. ------------ ---------- -----------
  3. S901 Aditya 19
  4. S911 Steve 18
  5. S921 Paul 19
  6. S931 Lucy 17
  7. S941 Carl 16
  8. S951 Rick 18

查询:

  1. Student_Name (COURSE) Student_Name (STUDENT)

输出:

  1. Student_Name
  2. ------------
  3. Aditya
  4. Steve
  5. Paul
  6. Lucy

差集运算符(-

差集运算符用-符号表示。假设我们有两个关系R1R2,我们想要选择所有那些存在于关系R1中但不存在于关系R2中的元组(行),这可以使用集合差R1-R2来完成。

差集运算符语法(-

  1. table_name1 - table_name2

差集运算符(-)示例

让我们看看上面我们看到的课程和学生。

查询:

让我们编写一个查询来选择STUDENT表中但不存在于COURSE表中的学生姓名。

  1. Student_Name (STUDENT) - Student_Name (COURSE)

输出:

  1. Student_Name
  2. ------------
  3. Carl
  4. Rick

笛卡尔积(X

笛卡尔积用X符号表示。假设我们有两个关系R1R2,然后这两个关系的笛卡尔积(R1 X R2)将第一关系R1的每个元组与第二关系R2的每个元组组合。我知道这听起来令人困惑,但是一旦我们举一个这样的例子,你就能理解这一点。

笛卡尔积(X的语法

  1. R1 X R2

笛卡尔积(X)示例

表 1:R

  1. Col_A Col_B
  2. ----- ------
  3. AA 100
  4. BB 200
  5. CC 300

表 2:S

  1. Col_X Col_Y
  2. ----- -----
  3. XX 99
  4. YY 11
  5. ZZ 101

查询:

让我们查找表RS的笛卡尔积。

  1. R X S

输出:

  1. Col_A Col_B Col_X Col_Y
  2. ----- ------ ------ ------
  3. AA 100 XX 99
  4. AA 100 YY 11
  5. AA 100 ZZ 101
  6. BB 200 XX 99
  7. BB 200 YY 11
  8. BB 200 ZZ 101
  9. CC 300 XX 99
  10. CC 300 YY 11
  11. CC 300 ZZ 101

注意:输出中的行数始终是每个表中行数的乘积。在我们的示例中,表 1 有 3 行,表 2 有 3 行,因此输出有3×3 = 9行。

重命名(ρ

重命名(ρ)操作可用于重命名关系的属性。

重命名(ρ)语法:

  1. ρ(new_relation_name, old_relation_name)

重命名(ρ)示例

假设我们有一个表Customer,我们正在获取客户名称,我们将所得关系重命名为CUST_NAMES

表:客户

  1. Customer_Id Customer_Name Customer_City
  2. ----------- ------------- -------------
  3. C10100 Steve Agra
  4. C10111 Raghu Agra
  5. C10115 Chaitanya Noida
  6. C10117 Ajeet Delhi
  7. C10118 Carl Delhi

查询:

  1. ρ(CUST_NAMES, ∏(Customer_Name)(CUSTOMER))

输出:

  1. CUST_NAMES
  2. ----------
  3. Steve
  4. Raghu
  5. Chaitanya
  6. Ajeet
  7. Carl