当涉及到 theta 连接、等值连接和自然连接时,我无法理解关系代数。有人可以帮助我更好地理解它吗?如果我在 theta 连接上使用 = 符号,它与使用自然连接完全相同吗?
7 回答
Theta 连接允许任意比较关系(例如 ≥)。
等值连接是使用相等运算符的 theta 连接。
自然连接是在每个关系中具有相同名称的属性上的等值连接。
此外,自然连接会删除相等比较中涉及的重复列,因此每个比较列中只保留 1 个;在粗略的关系代数术语中:
⋈ = πR,S-as ○ ⋈<sub>aR=aS
虽然解释确切差异的答案很好,但我想展示关系代数如何转换为 SQL 以及这 3 个概念的实际价值是什么。
您问题中的关键概念是加入的想法。要了解联接,您需要了解笛卡尔积(该示例基于 SQL,其中等价的称为交叉联接,正如 onedaywhen 指出的那样);
这在实践中不是很有用。考虑这个例子。
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
笛卡尔积 Product x Component 将是-bellow 或sql fiddle。你可以看到有 12 行 = 3 x 4。显然,像“笔记本电脑”和“轮子”这样的行没有意义,这就是为什么在实践中很少使用笛卡尔积的原因。
| 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 |
JOIN 在这里为这些产品增加更多价值。我们真正想要的是将产品与其关联的组件“连接”起来,因为每个组件都属于一个产品。这样做的方法是加入:
产品 JOIN 组件 ON Pname
相关的 SQL 查询是这样的(你可以在这里玩所有的例子)
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 |
请注意,结果只有 4 行,因为 Laptop 有 3 个组件,Car 有 1 个,Airplane 没有。这更有用。
回到您的问题,您询问的所有连接都是我刚刚展示的 JOIN 的变体:
自然连接= 对所有具有相同名称的列进行连接(ON 子句);它从结果中删除重复的列,而不是所有其他连接;大多数 DBMS(由各种供应商创建的数据库系统,如 Microsoft 的 SQL Server、Oracle 的 MySQL 等)甚至都不支持这一点,这只是一种不好的做法(或故意选择不实现它)。想象一下,一个开发人员来了,将 Product 中第二列的名称从 Price 更改为 Cost。然后所有自然连接都将在 PName 和 Cost 上完成,因为没有数字匹配,所以结果为 0 行。
Theta Join = 这是每个人都使用的通用连接,因为它允许您指定条件(SQL 中的 ON 子句)。您几乎可以在任何您喜欢的条件下加入,例如前 2 个字母相似或价格不同的产品。在实践中,这种情况很少发生——在 95% 的情况下,您将在平等条件下加入,这导致我们:
Equi Join = 实践中最常用的一种。上面的例子是一个 equi 连接。数据库针对这种类型的连接进行了优化!与等值连接相反的是非等值连接,即当您在“=”之外的条件下连接时。数据库没有为此优化!它们都是一般 theta 连接的子集。自然连接也是 theta 连接,但条件 (theta) 是隐式的。
信息来源:大学 + 认证的 SQL Server 开发人员 + 最近完成了斯坦福大学的 MOO“数据库简介”,所以我敢说我对关系代数有了新的认识。
@outis 的回答很好:关于关系的简洁和正确。
然而,就 SQL 而言,情况稍微复杂一些。
考虑通常的供应商和零件数据库,但在 SQL 中实现:
SELECT * FROM S NATURAL JOIN SP;
将返回带有列的结果集**
SNO, SNAME, STATUS, CITY, PNO, QTY
连接在两个表中具有相同名称的列上执行,SNO
。请注意,结果集有六列,并且仅包含一列SNO
。
现在考虑一个 theta eqijoin,其中连接的列名必须明确指定(加上范围变量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
换句话说,NATURAL JOIN
在 SQL 中可以考虑从结果集中删除具有重复名称的列(但可惜不会删除重复的行 - 您必须记住更改SELECT
为SELECT DISTINCT
自己)。
** 我不太清楚结果SELECT * FROM table_expression;
是什么。我知道这不是一个关系,因为除其他原因外,它可以包含具有重复名称的列或没有名称的列。我知道它不是一个集合,因为除其他原因外,列顺序很重要。它甚至不是 SQL 表或 SQL 表表达式。我称之为结果集。
Natural 是 Equi 的一个子集,它是 Theta 的一个子集。
如果我在 theta 连接上使用 = 符号,它与使用自然连接完全相同吗???
不一定,但它会是一个 Equi。自然意味着您在所有类似命名的列上进行匹配,Equi 仅意味着您仅使用“=”(而不是“小于”等)
不过,这只是纯粹的学术界,您可以使用关系数据库多年,但从未听说过有人使用这些术语。
Theta Join:
当您使用任何运算符(例如,=、<、>、>= 等)进行 join 查询时,该 join 查询属于 Theta join。
Equi Join:
当您仅使用相等运算符进行联接查询时,该联接查询属于 Equi 联接。
例子:
> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID; > SELECT * FROM Emp INNER JOIN Dept USING (DeptID)
这将显示: _________________________________________________ | 员工姓名 | Emp.DeptID | 部门名称 | 部门ID | | | | | |
注意:Equi 连接也是一个 theta 连接!
自然连接:
一种 Equi Join 类型,通过比较两个表中所有相同名称的列隐式发生。
注意:这里,连接结果对于每对相同命名的列只有一个列。
例子
SELECT * FROM Emp NATURAL JOIN Dept
这将显示: ______________________________ | 部门ID | 员工姓名 | 部门名称 | | | | |
两张表的笛卡尔积给出了所有可能的元组组合,就像数学中的例子一样,两个集合的叉积。因为很多时候有一些垃圾值在内存中也占据了不必要的空间,所以这里加入来救援,它只给出那些必需且有意义的属性值的组合。
内连接给出了表中的重复字段两次,而这里的自然连接通过过滤重复的列并仅显示一次来解决问题。否则,两者的工作方式相同。自然连接更有效,因为它保留了内存。此外,自然连接中删除了冗余。
两个表的等值连接使得它们只显示与其他表中的值匹配的那些元组。例如:让 new1 和 new2 成为两个表。如果 sql 查询 select * from new1 join new2 on new1.id = new.id (id 是两个表中的同一列)然后从 new2 表开始并加入与第二个表中的 id 匹配的连接。此外,非 equi 连接没有相等运算符,它们有 <、> 和 between 运算符。
theta join 由所有比较运算符组成,包括相等和其他 < , > 比较运算符。当它使用相等(=)运算符时,它被称为 equi join 。
自然连接:当两个关系中至少有一个共同属性时,自然连接是可能的。
Theta Join:当两个人在特定条件下行动时,Theta join 是可能的。
Equi Join:当两个人在公平条件下行动时,Equi 是可能的。它是一种类型的 theta 连接。