当谈到theta连接,equijoins和自然连接时,我无法理解关系代数。有人可以帮我更好地理解吗?如果我在theta连接上使用=符号,那么它与使用自然连接完全相同吗?
答案 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,其中必须明确指定连接的列名(需要范围变量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
换句话说,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连接。