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

mac*_*ian 91 sql database relational-algebra relational-database

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

out*_*tis 133

theta连接允许任意的比较关系(如≥).

一个等值连接是使用等于运算符一个theta连接.

一个自然的加入是对那些在每个关系相同的名称属性的等值连接.

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

  • 自然连接将删除具有相同名称的列 (13认同)
  • 所有这些,还是只有一个? (2认同)
  • @outis,“theta join”中的“theta”是什么意思? (2认同)
  • @Pacerier:从历史上看,theta联接中的theta是指用作联接准则的任意条件。(请参阅《数据库系统:加西亚·莫利纳(Garcia-Molina),乌尔曼,威多姆的全书》第2章,Theta Join) (2认同)

Bog*_*SFT 53

虽然解释确切差异的答案很好,但我想说明关系代数如何转换为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
Run Code Online (Sandbox Code Playgroud)

笛卡尔积产品x组件将 - 吼叫或sql小提琴.您可以看到有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 |
Run Code Online (Sandbox Code Playgroud)

JOINs可以为这些产品增加更多价值.我们真正想要的是将产品与其相关组件"加入",因为每个组件都属于产品.这样做的方法是使用连接:

产品JOIN组件打开Pname

关联的SQL查询将是这样的(你可以在这里玩所有的例子)

SELECT *
FROM Product
JOIN Component
  ON Product.Pname = Component.Pname
Run Code Online (Sandbox Code Playgroud)

结果:

|  PNAME | PRICE |  CNAME | COST |
----------------------------------
| Laptop |  1500 |    CPU |  500 |
| Laptop |  1500 |    hdd |  300 |
| Laptop |  1500 |   case |  700 |
|    Car | 20000 | wheels | 1000 |
Run Code Online (Sandbox Code Playgroud)

请注意,结果只有4行,因为笔记本电脑有3个组件,Car有1个,Airplane没有.这更有用.

回到你的问题,你问的所有联接是我刚刚展示的JOIN的变体:

自然连接 =连接(ON子句)在所有具有相同名称的列上进行; 它从结果中删除重复的列,而不是所有其他连接; 大多数DBMS(由各种供应商创建的数据库系统,如Microsoft的SQL Server,Oracle的MySQL等)甚至不打扰支持这一点,这只是不好的做法(或故意选择不实现它).想象一下,开发人员会将Product中第二列的名称从Price更改为Cost.然后所有的自然连接都将在PName和Cost上完成,因为没有数字匹配,所以会产生0行.

Theta Join =这是每个人都使用的通用连接,因为它允许您指定条件(SQL中的ON子句).您可以在几乎任何您喜欢的条件下加入,例如在前两个字母相似或价格不同的产品上.在实践中,这种情况很少发生 - 在95%的情况下,您将加入平等条件,这导致我们:

Equi Join =在实践中最常用的.上面的例子是一个equi连接.数据库针对此类连接进行了优化!equi join的oposite是一个非equi连接,即当你加入"="以外的条件时.数据库没有针对此进行优化!它们都是一般theta连接的子集.自然连接也是一个theta连接,但条件(theta)是隐含的.

信息来源:大学+认证的SQL Server开发人员+最近完成了斯坦福大学的MOO"数据库简介",所以我敢说我的关系代数是新鲜的.

  • 当您说“数据库”时,您实际上是指“DBMS”,这是处理“概念”时的一个关键区别。 (2认同)
  • onedaywhen - 谢谢你所有有用的评论!感觉就像代码审查:).我修复了笛卡尔积和DBMS问题.我认为自然连接只是学术上的兴趣,而SQL Server等重要的DBMS并没有故意实现这一点 - 明确添加条件可以更好地理解和维护代码.一个相关问题:http://stackoverflow.com/questions/4826613/natural-join-in-sql-server (2认同)
  • “自然”连接列的真正问题不在于更改名称,而在于添加新的名称,这些新名称不得在系统中所有可能连接的表之间发生冲突。采取非常常见的列,例如“名称”,“描述”,......使用“自然连接”将使它们连接起来,而它是无稽之谈,更多的是违反业务逻辑并导致错误。所以是的,“自然连接”是危险的。它迫使您使用不同的名称,除了(主/外)键列之外,并失去“名称间距”。 (2认同)

one*_*hen 14

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

但是,就SQL而言,情况稍微复杂一些.

考虑通常的供应商和零件数据库,但在SQL中实现:

SELECT * FROM S NATURAL JOIN SP;
Run Code Online (Sandbox Code Playgroud)

将返回带有列的结果集**

SNO, SNAME, STATUS, CITY, PNO, QTY

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

现在考虑一个theta eqijoin,其中必须明确指定连接的列名(加上范围变量S并且SP是必需的):

SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;
Run Code Online (Sandbox Code Playgroud)

结果集将有七列,包括两列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表表达式.我称之为结果集.


hei*_*erg 11

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

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

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

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

  • 在Codd的原始代数中,自然连接是基本类型的连接,而equi-或the-"连接"是NJ(例如交叉产品)的简写,后面是限制.*"自然是Equi的一个子集,它是Theta的一个子集"*可能这意味着每个NJ也可以表示为EJ或TJ.我认为如果σ1= 1(A x B)算作等值连接,则为真,在这种情况下,关系代数的每个操作都可以表示为该形式的等值连接.这里的模糊性是RA有一组以上可能的基本运算符. (3认同)
  • @EricFail:sqlvogel只是引用kekekela的答案,而不是来自Codd的任何内容。如果您想更多地了解Codd的有关联接(θ或其他角度)的著作,可以尝试“数据库管理的关系模型”,或通过他的[参考书目](http://www.informatik.uni-trier.de /~ley/pers/hd/c/Codd:E=_F=.html)。 (2认同)

Pal*_*ain 6

Theta Join: 当您使用任何运算符(例如=,<,>,> =等)进行联接查询时,该联接查询就会出现在Theta联接下。

等值联接: 仅使用等号运算符查询联接时,该联接查询位于等联接下。

例:

>选择*从Emp JOIN部门打开Emp.DeptID = Dept.DeptID;
>选择*从Emp内部联接部门使用(DeptID)
这将显示:
 _________________________________________________
| Emp.Name | Emp.DeptID | 部门名称| Dept.DeptID |
| | | | |

注意:等参联接也是theta联接!

自然连接:自然连接 的一种,通过比较两个表中所有相同名称的列而隐式出现。

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

 选择*来自Emp Natural Join部门
这将显示:
 _______________________________
| DeptID | Emp.Name | 部门名称|
| | | |