数据库相关笔记①
Relational Algebra(RA)关系代数
关系代数(Relational Algebra,RA)是一种用于查询和操作关系数据库的理论语言。它主要包括一组操作符,如选择(Selection),投影(Projection),并集(Union),交集(Intersection),差集(Difference),笛卡尔积(Cartesian Product),重命名(Rename)等,这些操作符可以用于操作数据库中的表(也称为关系)。
关系代数是关系数据库理论的基础,SQL 等查询语言的设计就是基于关系代数的理论。
关系代数的主要优点是它提供了一种形式化的方法来表示数据库操作,这对于理解和优化查询非常有用。
投影(Projection,π)操作
投影操作用于从表中提取我们需要的列。
投影操作会删除不在投影列表(projectionlist)中的列,并且移除结果中的重复行。
投影操作完成后,结果集的属性(attribute)将与投影列表中的属性一致。
假设我们有一个学生表,其结构如下:
学生 ID | 姓名 | 年龄 | 性别 |
---|---|---|---|
1 | 张三 | 20 | 男 |
2 | 李四 | 21 | 女 |
3 | 王五 | 22 | 男 |
4 | 赵六 | 20 | 女 |
如果我们只想提取学生的姓名和年龄,那么可以使用投影操作。在 SQL 中,这可以通过 SELECT 语句实现:
SELECT 姓名, 年龄 FROM 学生表; |
对应的关系代数: π姓名, 年龄(学生表)
姓名 | 年龄 |
---|---|
张三 | 20 |
李四 | 21 |
王五 | 22 |
赵六 | 20 |
选择(Selection,σ)操作
选择操作用于从表中筛选出满足特定条件的行(元组)。
经过选择操作后,输出的表结构与输入的表结构保持一致。
选择条件(Selection Condition)由一组布尔(bool)操作符构成。
这些操作符包括:小于(<),大于(>),小于等于(<=),大于等于(>=),等于(=),不等于(≠)。
这些条件可以通过逻辑连接词进行连接:Λ 表示“与”(AND),V 表示“或”(OR)。
假设我们有一个学生表,其结构如下:
学生 ID | 姓名 | 年龄 | 性别 |
---|---|---|---|
1 | 张三 | 20 | 男 |
2 | 李四 | 21 | 女 |
3 | 王五 | 22 | 男 |
4 | 赵六 | 20 | 女 |
如果我们想选择年龄大于 20 岁的学生,那么可以使用选择操作。在 SQL 中,这可以通过 WHERE 子句实现:
SELECT * FROM 学生表 WHERE 年龄 > 20; |
对应的关系代数: σ年龄>20(学生表)
学生 ID | 姓名 | 年龄 | 性别 |
---|---|---|---|
2 | 李四 | 21 | 女 |
3 | 王五 | 22 | 男 |
重命名(Rename,ρ)操作
重命名操作允许我们使用多个名称来指代关系。
它也允许我们为关系代数表达式的结果命名并引用。
SELECT CustomerID AS ID, |
笛卡尔积(Cross-product,×)
笛卡尔积操作是对两个表(例如,表 R 和表 S)进行的操作,它会将两个表中的每一行(元组)进行一一配对,生成一个新的表。
具体来说,如果表 R 有 m 行,表 S 有 n 行,那么 R 和 S 的笛卡尔积将会有 m*n 行。每一行是由 R 的一行和 S 的一行组合而成的。
如果表 R 和表 S 都为空(即,没有任何行),那么 R 和 S 的笛卡尔积也将为空。
在 SQL 中,可以使用CROSS JOIN
语句来进行笛卡尔积操作:
SELECT * FROM R CROSS JOIN S; |
条件连接(Conditional Join,θ⋈)
条件连接的结果表的结构与笛卡尔积操作的结果一致。
条件连接也被称为 Theta Join(θ 连接)。
它首先进行笛卡尔积操作,然后对结果进行筛选,只保留满足特定条件的行。
R ⋈ϴ S = σϴ(R× S)
Find the student ID,name,and gender of all students enrolled in INFO6007
σ_course_id=‘INFO6007’(students ⋈_student_id=id enrollments)
SELECT students.id, students.name, students.gender |
自然连接(Natural Join,⋈)
自然连接是一种特殊的连接操作,它基于两个表中的所有具有相同名称的列进行连接。
在自然连接操作中,结果表将只包含一次具有相同名称的列。
例如,如果表 R 和表 S 都有一个名为"A"的列,那么在 R 和 S 的自然连接结果中,只会有一个名为"A"的列。
在 SQL 中,可以使用INNER JOIN
语句来实现自然连接:
SELECT * FROM R INNER JOIN S USING (A); |
左连接(Left Join)和右连接(Right Join)
左连接和右连接是 SQL 中的两种连接操作,它们都是基于两个表中的一个或多个列的值进行连接的。
-
左连接(Left Join):返回包含左表中的所有行和右表中匹配的行的结果表。如果右表中没有匹配的行,则结果表中的对应行将包含 NULL。
-
右连接(Right Join):返回包含右表中的所有行和左表中匹配的行的结果表。如果左表中没有匹配的行,则结果表中的对应行将包含 NULL。
在 SQL 中,可以使用 LEFT JOIN
或 RIGHT JOIN
语句来实现左连接或右连接:
假设我们有两个表,表 A 和表 B:
表 A:
A_id | Name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
表 B:
B_id | Name |
---|---|
2 | 李四 |
3 | 王五 |
4 | 赵六 |
如果我们进行左连接(以 Name 为连接条件),结果将如下:
SELECT * FROM A LEFT JOIN B ON A.Name = B.Name; |
结果:
A_id | Name | B_id |
---|---|---|
1 | 张三 | NULL |
2 | 李四 | 2 |
3 | 王五 | 3 |
如果我们进行右连接(以 Name 为连接条件),结果将如下:
SELECT * FROM A RIGHT JOIN B ON A.Name = B.Name; |
结果:
A_id | Name | B_id |
---|---|---|
2 | 李四 | 2 |
3 | 王五 | 3 |
NULL | 赵六 | 4 |
全外连接(Full Outer Join)
全外连接是 SQL 中的一种连接操作,它返回左表和右表中的所有行。如果左表和右表中的行在连接条件上没有匹配,那么结果表中的对应行将包含 NULL。
在 SQL 中,可以使用 FULL OUTER JOIN
语句来实现全外连接:
例如,如果我们有两个表,表 R 和表 S:
表 R:
R_id | Name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
表 S:
S_id | Name |
---|---|
2 | 李四 |
3 | 王五 |
4 | 赵六 |
如果我们进行全外连接(以 Name 为连接条件),结果将如下:
SELECT * FROM R FULL OUTER JOIN S ON R.Name = S.Name; |
结果:
R_id | Name | S_id |
---|---|---|
1 | 张三 | NULL |
2 | 李四 | 2 |
3 | 王五 | 3 |
NULL | 赵六 | 4 |
Set Operators
Union
-
UNION
操作用于合并两个表的结果。 -
在 SQL 中,
UNION
操作会自动去除结果中的重复行。
UNION ALL
操作则会保留结果中的所有行,包括重复的行。
Intersection
1.lntersection 取两个 table 的交集
2.在 SQL 语句中的语法 Intersect
Difference
1.lntersection 取两个 table 交集及以外的部分
2.在 SQL 语句中的语法 Except
R ∩ S = R - (R-S)