106

当涉及到 theta 连接、等值连接和自然连接时,我无法理解关系代数。有人可以帮助我更好地理解它吗?如果我在 theta 连接上使用 = 符号,它与使用自然连接完全相同吗?

4

7 回答 7

158

Theta 连接允许任意比较关系(例如 ≥)。

等值连接是使用相等运算符的 theta 连接。

自然连接是在每个关系中具有相同名称的属性上的等值连接。

此外,自然连接会删除相等比较中涉及的重复列,因此每个比较列中只保留 1 个;在粗略的关系代数术语中: ⋈ = πR,S-as ○ ⋈<sub>aR=aS

于 2011-10-24T00:04:02.623 回答
63

虽然解释确切差异的答案很好,但我想展示关系代数如何转换为 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“数据库简介”,所以我敢说我对关系代数有了新的认识。

于 2013-03-06T11:55:29.677 回答
15

@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 中可以考虑从结果集中删除具有重复名称的列(但可惜不会删除重复的行 - 您必须记住更改SELECTSELECT DISTINCT自己)。


** 我不太清楚结果SELECT * FROM table_expression;是什么。我知道这不是一个关系,因为除其他原因外,它可以包含具有重复名称的列或没有名称的列。我知道它不是一个集合,因为除其他原因外,列顺序很重要。它甚至不是 SQL 表或 SQL 表表达式。我称之为结果集。

于 2011-10-24T08:24:56.253 回答
12

Natural 是 Equi 的一个子集,它是 Theta 的一个子集。

如果我在 theta 连接上使用 = 符号,它与使用自然连接完全相同吗???

不一定,但它会是一个 Equi。自然意味着您在所有类似命名的列上进行匹配,Equi 仅意味着您仅使用“=”(而不是“小于”等)

不过,这只是纯粹的学术界,您可以使用关系数据库多年,但从未听说过有人使用这些术语。

于 2011-10-24T00:00:39.563 回答
9

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 | 员工姓名 | 部门名称 |
| | | |
于 2017-03-02T18:42:28.720 回答
1

两张表的笛卡尔积给出了所有可能的元组组合,就像数学中的例子一样,两个集合的叉积。因为很多时候有一些垃圾值在内存中也占据了不必要的空间,所以这里加入来救援,它只给出那些必需且有意义的属性值的组合。

内连接给出了表中的重复字段两次,而这里的自然连接通过过滤重复的列并仅显示一次来解决问题。否则,两者的工作方式相同。自然连接更有效,因为它保留了内存。此外,自然连接中删除了冗余。

两个表的等值连接使得它们只显示与其他表中的值匹配的那些元组。例如:让 new1 和 new2 成为两个表。如果 sql 查询 select * from new1 join new2 on new1.id = new.id (id 是两个表中的同一列)然后从 new2 表开始并加入与第二个表中的 id 匹配的连接。此外,非 equi 连接没有相等运算符,它们有 <、> 和 between 运算符。

theta join 由所有比较运算符组成,包括相等和其他 < , > 比较运算符。当它使用相等(=)运算符时,它被称为 equi join 。

于 2017-03-15T17:51:12.963 回答
0

自然连接:当两个关系中至少有一个共同属性时,自然连接是可能的。

Theta Join:当两个人在特定条件下行动时,Theta join 是可能的。

Equi Join:当两个人在公平条件下行动时,Equi 是可能的。它是一种类型的 theta 连接。

于 2017-09-21T05:56:53.117 回答