我在理解关系代数中的θ连接、等值连接和自然连接时遇到了困难。请问有人可以帮我更好地理解吗?如果我在θ连接中使用=符号,是否完全等同于使用自然连接?
我在理解关系代数中的θ连接、等值连接和自然连接时遇到了困难。请问有人可以帮我更好地理解吗?如果我在θ连接中使用=符号,是否完全等同于使用自然连接?
Theta Join允许任意比较关系(例如≥)。
Equijoin是使用等式运算符的Theta Join。
Natural Join是在每个关系中具有相同名称的属性上进行的Equijoin。
此外,Natural Join会删除涉及等式比较的重复列,因此只剩下每个比较列中的1列;用粗略的关系代数术语表示为:
⋈ = πR,S-as ○ ⋈aR=aS
Product(PName, Price)
====================
Laptop, 1500
Car, 20000
Airplane, 3000000
Component(PName, CName, Cost)
=============================
Laptop, CPU, 500
Laptop, hdd, 300
Laptop, case, 700
Car, wheels, 1000
| PNAME | PRICE | CNAME | COST |
--------------------------------------
| Laptop | 1500 | CPU | 500 |
| Laptop | 1500 | hdd | 300 |
| Laptop | 1500 | case | 700 |
| Laptop | 1500 | wheels | 1000 |
| Car | 20000 | CPU | 500 |
| Car | 20000 | hdd | 300 |
| Car | 20000 | case | 700 |
| Car | 20000 | wheels | 1000 |
| Airplane | 3000000 | CPU | 500 |
| Airplane | 3000000 | hdd | 300 |
| Airplane | 3000000 | case | 700 |
| Airplane | 3000000 | wheels | 1000 |
相关的SQL查询语句如下(你可以在这里尝试所有的例子)。Product JOIN Component ON Pname
SELECT *
FROM Product
JOIN Component
ON Product.Pname = Component.Pname
和结果:
| PNAME | PRICE | CNAME | COST |
----------------------------------
| Laptop | 1500 | CPU | 500 |
| Laptop | 1500 | hdd | 300 |
| Laptop | 1500 | case | 700 |
| Car | 20000 | wheels | 1000 |
信息来源:大学+认证的SQL Server开发人员+最近完成了斯坦福大学的MOO“数据库简介”,因此我敢说我对关系代数有新鲜的记忆。
@outis的答案很好:在关系方面简明且正确。
然而,在SQL方面,情况略微复杂。
考虑通常的供应商和零件数据库,但是在SQL中实现:
SELECT * FROM S NATURAL JOIN SP;
将返回一个结果集,其中包含以下列:
SNO,SNAME,STATUS,CITY,PNO,QTY
连接是在两个表中具有相同名称的列SNO
上执行的。请注意,结果集有六列,仅包含一个SNO
列。
现在考虑一个theta等值连接,其中连接的列名必须明确指定(还需要范围变量S
和SP
):
SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;
结果集将有七列,包括两列 SNO
。结果集的名称被 SQL 标准称为“实现相关”,但可能如下所示:
SNO, SNAME, STATUS, CITY, SNO, PNO, QTY
或者可能像这样:
S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY
换句话说,在 SQL 中,NATURAL JOIN
可以被认为是从结果集中删除具有重复名称的列(但遗憾的是不会删除重复行 - 你必须自己记得将 SELECT
更改为 SELECT DISTINCT
)。SELECT * FROM table_expression;
的结果是什么。我知道它不是关系,因为它可以具有重复名称的列,或者没有名称的列,等等其他原因。我知道它不是一个集合,因为列的顺序很重要。它甚至不是 SQL 表或 SQL 表达式。我把它称为结果集。JOIN ... USING(...)
。 - BenoitSELECT * FROM table_expression;
的结果是什么”? - Pacerier自然连接是等值连接的子集,等值连接又是Theta连接的子集。
如果我在Theta连接中使用=符号,这是否与仅使用自然连接完全相同?
不一定,但它将是等值连接。自然连接意味着您正在匹配所有同名列,而等值连接仅表示您专门使用“=”(而不是“小于”,“like”等)。
不过这纯属学术性质,你可以在关系型数据库工作多年,从未听到任何人使用这些术语。
Theta Join(θ连接):当您使用任何运算符进行连接查询(例如,=,<,>,>=等),那么该查询就属于θ连接。
Equi Join(等值连接):当您仅使用等式运算符进行连接查询时,则该查询属于等值连接。
示例:
> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID; > SELECT * FROM Emp INNER JOIN Dept USING(DeptID)
这将显示: _________________________________________________ | Emp.Name | Emp.DeptID | Dept.Name | Dept.DeptID | | | | | |
注意:等值连接也是θ连接!
Natural Join(自然连接):一种隐式发生的等值连接,通过比较两个表中所有相同名称的列来实现。
注意:在这里,连接结果每对相同命名列只有一个列。
示例:
SELECT * FROM Emp NATURAL JOIN Dept
这将显示: _______________________________ | DeptID | Emp.Name | Dept.Name | | | | |
两个表的笛卡尔积给出了所有可能的元组组合,就像数学中两个集合的叉积一样。由于很多时候内存中有一些垃圾值占用了不必要的空间,所以连接操作就派上用场了,它只给出那些需要且有意义的属性值的组合。
内连接会在表中重复显示字段,而自然连接通过过滤重复列并仅显示一次来解决这个问题。否则,两者的工作方式相同。自然连接更有效率,因为它保留了内存。此外,自然连接还消除了冗余。
两个表的等值连接是仅显示与另一个表中的值匹配的元组。例如:假设new1和new2是两个表。如果SQL查询select * from new1 join new2 on new1.id = new.id(id是两个表中相同的列),则从new2表开始,并加入与第二个表中的id匹配的内容。此外,非等值连接没有等号运算符,它们有<,>和between运算符。
θ连接包括所有比较运算符,包括等式和其他比较运算符<,>。当使用等式(=)运算符时,它被称为等值连接。
自然连接:当两个关系中至少有一个共同属性时,可以进行自然连接。
Theta 连接:当两个关系在特定条件下操作时,可以进行 Theta 连接。
等值连接:当两个关系在等值条件下操作时,可以进行等值连接。它是 Theta 连接的一种类型。