我已经阅读了所有连接是关联和交换的地方。
所以A join (B join C)
应该是一样的(A join C) join B
。
但我真的很难理解这是怎么回事。假设 A 和 B 有一个共同的属性,B 和 C 有一个共同的属性,但是 A 和 C 没有共同的属性来连接。
似乎在那种情况下,在第二种情况下(A join C) join B
,当连接 A 和 C 的操作发生时,它会导致一个空集,从而使与 B 的连接成为不可能。
而在第一种情况下,它会起作用,因为 B 连接 C 会导致预期的连接表具有与 A 连接的属性。
你做了一个错误的假设。
如果三是 and 之间的关系,and 之间
A
和and但没有关系and ,加入and不会给你任何行。它实际上为您提供m * n行,其中m是 中的行数,n是 中的行数。B
B
C
A
C
A
C
A
B
变成,如果我们加入
A
并且C
首先:注意:大学是 30 多年前的 - 希望您从概念上理解,并且可以重写为实际关系代数的正确语法。
如果您有 20 行 in
A
、 30 inB
和 40 inC
,并且 in 的每一行B
匹配 1 中的一行且仅匹配 1 行A
,并且 in 的每一行C
匹配 中的 1 行且仅匹配 1 行B
。当您加入A
时B
,您将获得 30 行;当您将这 30 行加入 时C
,您将获得 40 行。如果您第一次加入
A
,C
与定义哪些行对是有效的没有关系,您将获得每对可能的行- 800 行。当我们加入800 行时,和B
之间的连接意味着其中的一行只能匹配包含一个特定行的行 - 其中将有 40 个(每行一个)。在这 40 个中,唯一的实际匹配是 和 之间的连接也是有效的。而且,我们知道匹配当前行的行不能匹配任何其他行。所以,对于一排,我们可能有 2B
A
B
AC
A
C
B
C
C
B
B
B
AC
匹配的行,另外 4 行,再匹配 1 行。也就是说,我们知道每一
C
行都匹配一个(并且只有一个)B
行,所以匹配的总数将再次达到 40 - 与我们第一次匹配的 40 个匹配A
andB
, orB
and相同C
。所以 - 连接的条件并没有告诉你哪些行匹配 - 它真的告诉你哪些行不匹配。把它拿走,你就得到了- 两个表中行的叉积。
CROSS JOIN
考虑到
join的结合性可以用维恩图直观地证明如下:
用维恩图可以直观地证明join的交换性如下:
更新
(之前,图表有∩而不是⋈。下面的解释是在∩的上下文中进行的。)
感谢@Lennart 在评论中指出
我想需要提供更多解释,因为
INTERSECT
操作与INNER JOIN
. 我想从链接中强调以下几点:INTERSECT
INNER JOIN
运算符多次返回与子句几乎相同的结果。使用
INTERSECT
运算符时,所有查询中的列数和顺序必须相同,并且数据类型必须兼容。但是,如果考虑我在上面第三个要点中明确表示的内容,这对上面的维恩图没有影响:所以 ∩ 符号我真正的意思是加入,而不是相交,考虑到这一点,加入将遵循集合交集的行为。我想我犯的错误是使用符号∩而不是⋈。写答案时我没有考虑
INTERSECT
手术。我出于直觉将其用作“两组的逻辑交集”,而不是“数据库INTERSECT
操作”。INNER JOIN
INTERSECT
与 一起使用时可以模拟withDISTINCT
。但即使我们不包含DISTINCT
并保留它INNER JOIN
,维恩图仍然成立,因为两个圆/集的交集也会包含重复记录。另请注意,此答案试图使用与维恩图类似的方法来解释左外连接的关联性。
最后,老实说,我觉得我应该把符号∩换成⋈。