oracle自连接和自然连接,一个θ连接,equijoin和自然连接之间的区别

尽pipe解释确切差异的答案没有问题,但我想说明关系代数是如何转化为SQL的,以及这三个概念的实际价值是什么。

你的问题的关键概念是join的想法。 为了理解一个连接,你需要理解一个笛卡尔乘积(这个例子是基于SQL的,当等价物被称为交叉连接的时候,按照oneday指出);

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

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组件将是 – 波纹pipe或sql小提琴 。 你可以看到有12行= 3×4。显然,“笔记本电脑”与“车轮”行没有任何意义,这就是为什么在实践中,笛卡尔产品很less使用。

| 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 |

JOINs在这里为这些产品增加更多的价值。 我们真正想要的是将产品与其关联的组件“连接”,因为每个组件都属于产品。 做到这一点的方法是join:

产品JOIN组件在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行,因为笔记本电脑有3个组件,Car有1个,Airplane没有。 这是非常有用的。

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

自然连接 =连接(ON子句)在所有具有相同名称的列上进行; 它会从结果中删除重复的列,而不是所有其他联接。 大多数DBMS(由微软的SQL Server,Oracle的MySQL等不同厂商创build的数据库系统)甚至不会支持这一点,这只是不好的做法(或故意select不实施它)。 想象一下,开发者来了,并将产品中第二列的名称从价格更改为成本。 然后所有的自然连接都将在PName和Cost上完成,结果为0行,因为没有数字匹配。

Theta Join =这是每个人都使用的普通连接,因为它允许你指定条件(SQL中的ON子句)。 您可以join任何您喜欢的条件,例如在具有类似前两个字母或具有不同价格的产品上。 在实践中,这种情况很less – 95%的情况下,你将join平等条件,这导致我们:

Equi Join =在实践中使用最常见的一种。 上面的例子是一个equi连接。 数据库针对这种types的连接进行了优化! equi连接的对立方式是非等连接,也就是当你join“=”以外的条件时。 数据库没有为此优化! 他们都是一般thetajoin的子集。 自然连接也是一个theta连接,但条件(theta)是隐含的。

信息来源:大学+authentication的SQL Server开发人员+最近完成了斯坦福大学的“数据库入门”,所以我敢说我有关系代数的新思想。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值