原文: https://beginnersbook.com/2019/02/dbms-relational-algebra/
在本教程中,我们将讨论关系代数。在前面的教程中,我们简要讨论了关系代数和微积分的基础知识,其中我们了解了使用这些理论数学系统的必要性。
什么是 DBMS 中的关系代数?
关系代数是一种过程查询语言,适用于关系模型。查询语言的目的是从数据库中检索数据或对数据执行各种操作,如插入,更新,删除。当我说关系代数是一种过程查询语言时,它意味着它告诉我们要检索哪些数据以及如何检索它们。
另一方面,关系演算是一种非过程式查询语言,这意味着它会告诉要检索哪些数据但不会告诉如何检索它。我们将在单独的教程中讨论关系演算。
关系代数中的运算类型
我们将这些操作分为两类:
- 基本操作
- 派生操作
基本/基本操作:
- 选择(
σ) - 投影(
Π) - 并集(
∪) - 差集(
-) - 笛卡尔积(
X) - 重命名(
ρ)
衍生操作:
- 自然连接(
⋈) - 左,右,全外连接(
⟕,⟖,⟗) - 交集(
∩) - 除法(
÷)
让我们在示例的帮助下逐一讨论这些操作。
选择运算符(σ)
选择运算符由 sigma(σ)表示,它用于查找满足给定条件的关系(或表)中的元组(或行)。
如果您了解一点 SQL,那么您可以将其视为 SQL 中的where子句,它用于相同的目的。
选择运算符语法(σ)
σ Condition/Predicate(Relation/Table name)
选择运算符(σ)示例
Table: CUSTOMER---------------Customer_Id Customer_Name Customer_City----------- ------------- -------------C10100 Steve AgraC10111 Raghu AgraC10115 Chaitanya NoidaC10117 Ajeet DelhiC10118 Carl Delhi
查询:
σ Customer_City="Agra" (CUSTOMER)
输出:
Customer_Id Customer_Name Customer_City----------- ------------- -------------C10100 Steve AgraC10111 Raghu Agra
投影运算符(Π)
投影运算符由Π符号表示,用于从表(或关系)中选择所需的列(或属性)。
关系代数中的投影运算符类似于 SQL 中的Select语句。
投影运算符语法(Π)
∏ column_name1, column_name2, ...., column_nameN(table_name)
投影运算符(Π)示例
在这个例子中,我们有一个包含三列的表CUSTOMER,我们只想获取表的两列,我们可以在投影运算符Π的帮助下完成。
Table: CUSTOMERCustomer_Id Customer_Name Customer_City----------- ------------- -------------C10100 Steve AgraC10111 Raghu AgraC10115 Chaitanya NoidaC10117 Ajeet DelhiC10118 Carl Delhi
查询:
∏ Customer_Name, Customer_City (CUSTOMER)
输出:
Customer_Name Customer_City------------- -------------Steve AgraRaghu AgraChaitanya NoidaAjeet DelhiCarl Delhi
并集运算符(∪)
并集运算符用∪符号表示,用于从两个表(关系)中选择所有行(元组)。
让我们再讨论一下并集运算符。假设我们有两个关系R1和R2都有相同的列,我们想从这些关系中选择所有元组(行),然后我们可以在这些关系上应用并集运算符。
注意:两个表中存在的行(元组)只在并集中出现一次。简而言之,您可以说并集操作后没有重复项。
并集运算符的语法(∪)
table_name1 ∪ table_name2
并集运算符(∪)示例
表 1:Course
Course_Id Student_Name Student_Id--------- ------------ ----------C101 Aditya S901C104 Aditya S901C106 Steve S911C109 Paul S921C115 Lucy S931
表 2:Student
Student_Id Student_Name Student_Age------------ ---------- -----------S901 Aditya 19S911 Steve 18S921 Paul 19S931 Lucy 17S941 Carl 16S951 Rick 18
查询:
∏ Student_Name (COURSE) ∪ ∏ Student_Name (STUDENT)
输出:
Student_Name------------AdityaCarlPaulLucyRickSteve
注意:正如你所看到的那样,输出中没有重复的名称,即使我们在两个表中都有很少的共同名称,同样在COURSE表中我们也有重复的名称。
交集运算符(∩)
交集运算符用∩符号表示,用于从两个表(关系)中选择公共行(元组)。
假设我们有两个关系R1和R2都有相同的列,我们想要选择两个关系中存在的所有元组(行),那么在这种情况下我们可以对这两个关系R1∩R2应用交集运算。
注意:只有那两个表中存在的那些行才会出现在结果集中。
交集运算符语法(∩)
table_name1 ∩ table_name2
交集运算符(∩)示例
让我们采取与上面相同的例子。
表 1:Course
Course_Id Student_Name Student_Id--------- ------------ ----------C101 Aditya S901C104 Aditya S901C106 Steve S911C109 Paul S921C115 Lucy S931
表 2:STUDENT
Student_Id Student_Name Student_Age------------ ---------- -----------S901 Aditya 19S911 Steve 18S921 Paul 19S931 Lucy 17S941 Carl 16S951 Rick 18
查询:
∏ Student_Name (COURSE) ∩ ∏ Student_Name (STUDENT)
输出:
Student_Name------------AdityaStevePaulLucy
差集运算符(-)
差集运算符用-符号表示。假设我们有两个关系R1和R2,我们想要选择所有那些存在于关系R1中但不存在于关系R2中的元组(行),这可以使用集合差R1-R2来完成。
差集运算符语法(-)
table_name1 - table_name2
差集运算符(-)示例
让我们看看上面我们看到的课程和学生。
查询:
让我们编写一个查询来选择STUDENT表中但不存在于COURSE表中的学生姓名。
∏ Student_Name (STUDENT) - ∏ Student_Name (COURSE)
输出:
Student_Name------------CarlRick
笛卡尔积(X)
笛卡尔积用X符号表示。假设我们有两个关系R1和R2,然后这两个关系的笛卡尔积(R1 X R2)将第一关系R1的每个元组与第二关系R2的每个元组组合。我知道这听起来令人困惑,但是一旦我们举一个这样的例子,你就能理解这一点。
笛卡尔积(X)的语法
R1 X R2
笛卡尔积(X)示例
表 1:R
Col_A Col_B----- ------AA 100BB 200CC 300
表 2:S
Col_X Col_Y----- -----XX 99YY 11ZZ 101
查询:
让我们查找表R和S的笛卡尔积。
R X S
输出:
Col_A Col_B Col_X Col_Y----- ------ ------ ------AA 100 XX 99AA 100 YY 11AA 100 ZZ 101BB 200 XX 99BB 200 YY 11BB 200 ZZ 101CC 300 XX 99CC 300 YY 11CC 300 ZZ 101
注意:输出中的行数始终是每个表中行数的乘积。在我们的示例中,表 1 有 3 行,表 2 有 3 行,因此输出有3×3 = 9行。
重命名(ρ)
重命名(ρ)操作可用于重命名关系的属性。
重命名(ρ)语法:
ρ(new_relation_name, old_relation_name)
重命名(ρ)示例
假设我们有一个表Customer,我们正在获取客户名称,我们将所得关系重命名为CUST_NAMES。
表:客户
Customer_Id Customer_Name Customer_City----------- ------------- -------------C10100 Steve AgraC10111 Raghu AgraC10115 Chaitanya NoidaC10117 Ajeet DelhiC10118 Carl Delhi
查询:
ρ(CUST_NAMES, ∏(Customer_Name)(CUSTOMER))
输出:
CUST_NAMES----------SteveRaghuChaitanyaAjeetCarl
