68

我在理解 sql 中的连接时遇到了麻烦,并且发现了这张我认为可能对我有帮助的图片。问题是我不完全理解它。例如,图像右上角的连接,它将整个 B 圆圈涂成红色,但仅与 A 重叠。图像使圆圈 B 看起来像是 sql 语句的主要焦点,但 sql 语句本身,从 A 开始(从 A 中选择,加入 B),给我传达了相反的印象,即 A 将是 sql 语句的焦点。

同样,下图只包含来自 B 圈的数据,那么为什么 A 包含在 join 语句中呢?

问题:从右上角顺时针工作并在中心完成,有人可以提供有关每个sql图像表示的更多信息,解释

a)为什么在每种情况下都需要连接(例如,特别是在没有从 A 或 B 获取数据的情况下,即只有 A 或 B 而不是两者都是彩色的)

b) 以及任何其他可以阐明为什么图像是 sql 的良好表示的细节

sql连接图

4

5 回答 5

70

我同意凯德关于维恩图的局限性的观点。更恰当的视觉表示可能是这样。

表

从 A CROSS JOIN B SQL Fiddle中选择 A.Colour、B.Colour

交叉连接(或笛卡尔积)对两个表中的行的每个组合产生一个结果。每个表有 4 行,因此这会在结果中产生 16 行。

交叉连接

从 A.Colour = B.Colour SQL Fiddle上的 A INNER JOIN B 中选择 A.Colour,B.Colour

内连接从逻辑上返回与连接条件匹配的交叉连接的所有行。在这种情况下,五个做。

内部联接

SELECT A.Colour, B.Colour 从 A.Colour NOT IN ('Green','Blue') SQL Fiddle的 A INNER JOIN B

内连接条件不一定是相等条件,也不需要引用两个(甚至任何一个)表中的列。评估A.Colour NOT IN ('Green','Blue')交叉连接返回的每一行。

内部 2

1=1对于交叉连接中的每一行,内部连接条件的计算结果都为真,因此两者是等价的( SQL Fiddle)。

从 A.Colour = B.Colour SQL Fiddle的左外连接 B 中选择 A.Colour、B.Colour

外部联接的逻辑评估方式与内部联接相同,只是如果左表中的一行(用于左联接)根本不与右侧表中的任何行联接,则它会保留在结果中,并NULL带有右手列。

洛杰

SELECT A.Colour, B.Colour 从 A.Colour = B.Colour 的 A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour IS NULL SQL Fiddle

这只是将先前的结果限制为仅返回B.Colour IS NULL. 在这种特殊情况下,这些将是保留的行,因为它们在右侧 table 中没有匹配,并且查询返回 table 中不匹配的单个红色行B。这称为反半连接。

IS NULL测试选择一个不可为空的列或连接条件可确保NULL排除任何值以使此模式正常工作并避免只带回恰好具有该NULL值的行非常重要除了不匹配的行之外的列。

loj 为空

从 A.Colour = B.Colour SQL Fiddle的右外部连接 B 中选择 A.Colour、B.Colour

右外连接的作用类似于左外连接,除了它们保留右表中不匹配的行并且空扩展左列。

罗杰

从 A.Colour = B.Colour SQL Fiddle上的完整外部连接 B 中选择 A.Colour、B.Colour

全外连接结合了左连接和右连接的行为,并保留左右表中不匹配的行。

FOJ

于 2012-12-23T14:46:35.830 回答
14

我认为您的主要潜在困惑是,当(例如)仅以A红色突出显示时,您将其理解为“查询仅返回来自A”的数据,但实际上它意味着“查询仅在以下情况下返回数据A有记录”。查询可能仍包含来自 B 的数据。(对于没有B记录的情况,查询将替换为。)NULL

同样,下图只包含来自 B 圈的数据,那么为什么 A 包含在 join 语句中呢?

如果你的意思是——图像A完全是白色的,并且B没有与 重叠的部分有一个红新月形A,那么:A出现在查询中的原因是,A它如何找到B需要的记录被排除在外。(如果A没有出现在查询中,那么维恩图就没有A,它只会显示B,并且没有办法区分想要的记录和不需要的记录。)

这张图让我觉得圆圈 B 是 sql 语句的主要焦点,但 sql 语句本身以 A 开头(从 A 中选择,加入 B)给我传达了相反的印象,即 A 将是焦点的sql语句。

完全正确。因此,RIGHT JOINs 相对不常见;尽管使用 a 的查询LEFT JOIN几乎总是可以重新排序以使用 aRIGHT JOIN代替(反之亦然),但通常人们会使用LEFT JOIN而不是使用编写查询RIGHT JOIN

于 2012-12-21T21:30:59.033 回答
12

维恩图适用于表示集合操作,例如 UNION、INTERSECTS、EXCEPT 等。

仅就 EXCEPT 之类的集合操作使用 LEFT JOIN WHERE rhs.KEY 为 NULL 之类的东西进行模拟时,此图是准确的。

否则会产生误导。例如,如果连接条件不是 1:1,则任何连接都可能导致行成倍增加。但是集合只允许包含不同的成员,因此不能表示为集合操作。

然后是 CROSS JOIN 或 INNER JOIN ON 1 = 1 - 这既不类似于图中所示的 INNER JOIN,也不能用维恩图真正描述所产生的集合。更不用说所有其他可能的三角连接、自连接和反连接,例如:

lhs INNER JOIN rhs ON rhs.VALUE < lhs.VALUE (triangular)

或者

SELF self1
INNER JOIN SELF self2
    ON self2.key <> self1.key
    AND self1.type = self2.type

(self cross and anti-join 查找除自己之外的所有相似家庭成员 - self1 和 self2 是同一个集合,结果是一个适当的子集)

在教程的前几分钟坚持键上的连接可能很好,但这可能会导致学习连接是什么的糟糕路径。我想这就是你发现的。

维恩图通常可以以这种方式表示 JOIN 的想法需要消除。

于 2012-12-22T14:39:56.207 回答
-1

当您进行连接时,您的两个表可能不会完全匹配。具体来说,A 中的某些行可能与 B 中的任何内容都不匹配,或者 A 中的重复行与 B 中的单行匹配,反之亦然。

发生这种情况时,您可以选择:

  1. 对于每个 A,如果有一个 B,则取一个有效的 B。(左上)
  2. 取出完全匹配的每一对(丢弃任何缺少 A 或 B--center 的)
  3. 对于每个 B,如果有一个,则取一个有效的 A(右上角)
  4. 拿走一切(左下)

中左和右在技术上是连接,但没有意义;它们可能会更有效地编写SELECT <select_list> FROM TableA A WHERE A.Key NOT IN (SELECT B.Key FROM TableB B)(或相反)。

在直接回答您的困惑时,RIGHT JOIN说“以下表达式是此查询的焦点”。右下角相当奇怪,我看不出你为什么想要这样。NULL它返回来自两个外部中间查询的结果,与对面表的所有列中的 's混合在一起。

于 2012-12-21T21:31:57.850 回答
-1

对于正确的连接,是的,语法可能会令人困惑,但是的,它看起来就是这样。当您说“TableA RIGHT JOIN TableB”时,确实是在说 TableB 是您所指的主表,而 TableA 只是挂在它具有匹配记录的位置。这在查询中读起来确实很奇怪,因为 TableA 首先列出,所以您的大脑会自动为其分配更多优先级,即使 TableB 确实是查询中更重要的表。出于这个原因,您实际上很少在实际代码中看到右连接。

因此,代替 A 和 B,让我们采用两个易于跟踪的东西。假设我们有两张用于人们信息的表,ShoeSize 和 IQ。你有一些人的鞋码信息,一些人的智商信息。并且在您可以加入的两个表上都有一个 PersonID。

从右上角顺时针方向(即使这从一些更复杂和人为的情况开始):

  • ShoeSize RIGHT JOIN IQ -> 给我所有的 IQ 信息。如果我们有这些人的任何 ShoeSize 信息,请包括这些信息。
  • ShoeSize RIGHT JOIN IQ WHERE ShowSize.PersonID = NULL -> 给我所有的 IQ 信息,但仅限于没有任何鞋码信息的人
  • ShoeSize FULL OUTER JOIN IQ WHERE ShoeSize.PersonID = NULL AND IQ.PersonID = NULL -> 只给没有 IQ 信息的人的鞋码信息,以及没有鞋码信息的人的 IQ 信息
  • ShoeSize FULL OUTER JOIN IQ -> 给我一切,所有鞋码和所有 IQ 数据。如果任何 ShoeSizes 和 IQ 记录具有相同的 PersonID,请将它们包含在一行中。
  • ShoeSize LEFT JOIN IQ WHERE IQ.PersonID = NULL -> 给我所有的鞋码信息,但仅限于没有 IQ 信息的人
  • ShoeSize LEFT JOIN IQ -> 给我所有的鞋码信息。如果我们有这些人的任何智商信息,请包括这些信息。
于 2012-12-21T21:38:34.447 回答