尽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开发人员+最近完成了斯坦福大学的“数据库入门”,所以我敢说我有关系代数的新思想。