SQL作为维恩图join

我在理解sql中的连接时遇到了麻烦,并且遇到了我认为可能会帮助我的这个映像。 问题是我不完全理解它。 例如,图像右上angular的连接,其中B的全部颜色为红色,但只有A的重叠。图像使得它看起来像是圆圈B是sql语句的主要焦点,但是sql语句本身,从A开始(从A中select,joinB),给我的印象是相反的,即A将成为sql语句的焦点。

同样,下面的图片只包含了B圈的数据,那么为什么在连接语句中包含了A呢?

问题:从右上angular开始按顺时针方向工作,然后在中心完成,可以有人提供关于每个sql映像表示的更多信息,解释

a)为什么在每种情况下都需要join(例如,尤其是在没有从A或B中获取数据的情况下,即只有A或B而不是两者都有颜色的情况下)

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

在这里输入图像描述

我认为你的主要潜在的困惑是,当(例如)只有A被突出显示为红色时,你的意思是“查询只返回来自A数据”,但实际上这意味着“查询只返回那些数据A有logging的情况 “。 查询可能仍然包含来自B的数据(对于B没有logging的情况,查询将替代NULL

同样,下面的图片只包含了B圈的数据,那么为什么在连接语句中包含了A呢?

如果你的意思是 – A的图像完全是白色的,而B的部分有AA不重叠的红色新月形,那么: A出现在查询中的原因是, A是它的发现方式B中的logging需要排除。 (如果A没有出现在查询中,那么Venn图将不会有A ,它只会显示B ,并且没有办法将期望的logging与不需要的logging区分开来。

这个图像看起来像是圆圈B是sql语句的主要焦点,但是sql语句本身以A(从Aselect,joinB)开始,给我传达了相反的印象,即A是焦点的sql语句。

完全正确。 出于这个原因, RIGHT JOIN是比较less见的; 尽pipe使用LEFT JOIN的查询几乎总是可以重新sorting以使用RIGHT JOIN (反之亦然),但通常人们将使用LEFT JOIN而不是RIGHT JOIN来编写查询。

我同意凯德关于维恩图在这里的局限性。 更适合的视觉performance可能是这样的。

表

SELECT A.Colour,B.Colour FROM CROSS JOIN B SQL小提琴

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

交叉加入

SELECT A.Colour,B.Colour FROM A INNER JOIN B ON A.Colour = B.Colour SQL Fiddle

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

内部联接

SELECT A.Colour,B.Colour FROM A IN JOIN B IN ON A.Colour NOT IN('Green','Blue') SQL小提琴

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

内心2

对于交叉连接中的每一行, 1=1的内部连接条件将计算为true,因此这两者是等效的( SQL Fiddle )。

SELECT A.Colour,B.Colour FROM LEFT OUTER JOIN B ON A.Colour = B.Colour SQL小提琴

外连接的逻辑评估方式与内连接相同,只是如果左表(左连接)中的某行不与右表中的任何行进行连接,则它将保留在结果中,其值为右边的列。

LOJ

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

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

IS NULLtestingselect一个非空的列是非常重要的,这个列不是空的或者连接条件可以确保排除任何NULL值,以便这个模式正常工作,并避免只返回发生碰撞的行除了未匹配的行之外,该列的NULL值。

loj是空的

SELECT A.Colour,B.Colour FROM RIGHT OUTER JOIN B ON A.Colour = B.Colour SQL小提琴

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

ROJ

SELECT A.Colour,B.Colour FROM A FULL OUTER JOIN B ON A.Colour = B.Colour SQL Fiddle

完全外连接将左右连接的行为组合在一起,并保留左右两个表中的不匹配行。

FOJ

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

只要像EXCEPT那样的集合操作用像LEFT JOIN WHERE rhs.KEY为NULL的东西来模拟,这个图是准确的。

否则,这是误导。 例如,如果连接条件不是1:1,则任何连接都可能导致行相乘。 但是集合只允许包含不同的成员,所以这些不能被表示为集合操作。

然后是CROSS JOIN或INNER JOIN ON 1 = 1 – 这与图中所示的INNER JOIN类似,也不能用Venn图来描述。 更不用说所有其他可能的三angular形连接,自我和反连接:

 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 

(自我交叉和反joinfind除了你自己以外的所有类似的家庭成员 – self1和self2是相同的集合,结果是一个合适的子集)

在教程的前几分钟,坚持join密钥可能会很好,但是这可能会导致学习什么是联接。 我想这是你find的。

Venn Diagrams通常可以代表JOIN的这种想法需要消失。

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

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

  1. 对于每个A,取一个有效的B,如果有的话。 (左上)
  2. 把每一对完全匹配(丢弃任何缺lessA或B的中心)
  3. 对于每个B,取一个有效的A,如果有一个(右上)
  4. 采取一切(左下)

中心的左右是技术上的连接,但毫无意义的; 他们可能会更有效地写入SELECT <select_list> FROM TableA A WHERE A.Key NOT IN (SELECT B.Key FROM TableB B) (或相反)。

直接回答你的困惑, RIGHT JOIN说“下面的expression式是这个查询的重点”。 右下是相当奇怪的,我没有理由为什么你会想要的。 它返回来自两个外部中间查询的结果,在对立表的所有列中与NULL混合。

对于正确的join,是的,语法可能会令人困惑,但是是的,这似乎是。 当你说“TableA RIGHT JOIN TableB”时,确实是说TableB是你所指的主表,而TableA只是挂在它有匹配logging的地方。 这在查询中看起来很奇怪,因为TableA是首先列出的,所以你的大脑会自动为它分配更多的优先级,尽pipeTableB实际上是查询中更重要的表。 出于这个原因,你很less看到正确的代码join。

所以,我们可以拿两件容易追踪的东西来代替A和B。 假设我们有两个人的信息表,ShoeSize和IQ。 有些人有ShoeSize信息,有些人有一些IQ信息。 并且在两个表上都有一个可以join的PersonID。

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

  • ShoeSize RIGHT JOIN IQ – >给我所有的智商信息。 如果有的话,包括这些人的任何ShoeSize信息。
  • ShoeSize RIGHT JOIN IQ WHERE ShowSize.PersonID = NULL – >给我所有的IQ信息,但只限于没有鞋号的人
  • ShoeSize FULL OUTER JOIN IQ WHERE ShoeSize.PersonID = NULL且IQ.PersonID = NULL – >给我鞋子尺寸信息,只给没有IQ信息的人,加上没有鞋子尺寸信息的人的IQ信息
  • ShoeSize全外联JO IQ – >给我所有的东西,所有的鞋号和所有的IQ数据。 如果任何ShoeSizes和IQlogging具有相同的PersonID,请将其包含在一行中。
  • ShoeSize LEFT JOIN IQ WHERE IQ.PersonID = NULL – >给我所有的鞋号信息,但只限于没有IQ信息的人
  • ShoeSize LEFT JOIN IQ – >给我所有的鞋子尺寸信息。 如果有的话,包括那些人的任何智商信息。