theta join,equijoin和natural join之间的区别

时间:2011-10-23 23:52:15

标签: sql database relational-database relational-algebra

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

7 个答案:

答案 0 :(得分:124)

theta join 允许任意比较关系(例如≥)。

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

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

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

答案 1 :(得分:49)

虽然解释确切差异的答案很好,但我想说明关系代数如何转换为SQL以及3个概念的实际值是什么。

您问题中的关键概念是加入的想法。要理解连接,您需要了解笛卡尔积(该示例基于SQL,其中等效称为交叉连接,如同指出的那样);

这在实践中不是很有用。考虑这个例子。

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

笛卡尔积产品x组件将 - 吼叫或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组件打开Pname

关联的SQL查询将是这样的(您可以使用所有示例here

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行,因为笔记本电脑有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连接。数据库针对此类连接进行了优化! equi join的oposite是一个非equi连接,即当你加入“=”以外的条件时。数据库没有针对此进行优化!它们都是一般theta连接的子集。自然连接也是一个theta连接,但条件(theta)是隐含的。

信息来源:大学+认证的SQL Server开发人员+最近完成了斯坦福大学的MOO“数据库简介”,所以我敢说我脑子里有关系代数。

答案 2 :(得分:14)

@outis的答案很好:关于关系的简洁和正确。

然而,就SQL而言,情况稍微复杂一些。

考虑通常的suppliers and parts database,但在SQL中实现:

SELECT * FROM S NATURAL JOIN SP;

将返回带有列

的结果集**

SNO, SNAME, STATUS, CITY, PNO, QTY

在两个表SNO中对名称相同的列执行连接。请注意,结果集有六列,只包含一列SNO

现在考虑一个theta eqijoin,其中必须明确指定连接的列名(需要范围变量SSP):

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更改为{{1}你自己)。


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

答案 3 :(得分:9)

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

  

如果我在theta连接上使用=符号,那就完全一样了   使用自然连接???

不一定,但它会是一个Equi。自然意味着你匹配所有类似命名的列,Equi只意味着你只使用'='(而不是'小于',等等)

这是纯粹的学术界,你可以使用关系数据库多年,从不听任何人使用这些术语。

答案 4 :(得分:4)

Theta加入: 当您使用任何运算符(例如,=,<,>,> =等)查询联接时,该联接查询将在Theta join下。
Equi Join: 当您仅使用相等运算符查询连接时,该连接查询将在Equi join下进行。

示例:

> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID;
> SELECT * FROM Emp INNER JOIN Dept USING(DeptID)
This will show:
 _________________________________________________
| Emp.Name | Emp.DeptID | Dept.Name | Dept.DeptID |
|          |            |           |             |

注意:Equi join也是theta join!

自然加入: 一种Equi Join,通过比较两个表中的所有相同名称列来隐式发生。

注意:此处,连接结果对于每对相同的命名列只有一列。

实施例

 SELECT * FROM Emp NATURAL JOIN Dept
This will show:
 _______________________________
| DeptID | Emp.Name | Dept.Name |
|        |          |           |

答案 5 :(得分:1)

两个表的笛卡尔积给出了元组的所有可能组合,如数学中的例子,两组的交叉积。因为很多时候有一些垃圾值占用了内存中不必要的空间,所以这里的连接来到了救援,它只提供了所需的那些属性值并且是有意义的。

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

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

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

答案 6 :(得分:0)

自然连接:当两个关系中至少有一个共同属性时,可以进行自然连接。

Theta Join:当两个人在特定情况下采取行动时,Theta加入是可能的。

Equi Join:当两个人在股权条件下行事时,Equi可以成为可能。它是一种theta连接。