3 回答
TA贡献1821条经验 获得超4个赞
我觉得你的主要潜在的困惑是,当(例如)只A以红色突出显示,你正在做的是指“查询只返回数据来自A ”,但实际上它的意思是”查询只返回数据的那些情况下,A有记录 ”。查询可能仍包含从B.数据(有关情况B并没有有记录,查询将取代NULL。)
同样,下面的图像仅包含来自B圈的数据,那么为什么join语句中完全包含A?
如果您的意思是-图像A完全是白色的,并且有一个红色的月牙形,而该部分与B不重叠A,则:A查询中出现的原因是,A它如何查找B需要的记录被排除在外。(如果A未出现在查询中,则维恩图将没有A,只会显示B,并且无法将所需记录与不需要的记录区分开。)
图像使圆B看起来像是sql语句的主要焦点,但是sql语句本身通过以A开头(从A选择,然后联接B)向我传达了相反的印象,即A将成为焦点sql语句。
非常正确。因此,RIGHT JOINs比较少见。尽管使用a的查询LEFT JOIN几乎总是可以重新排序为使用a RIGHT JOIN的查询(反之亦然),但通常人们会使用LEFT JOIN和而不使用来编写查询RIGHT JOIN。
TA贡献1875条经验 获得超3个赞
我同意Cade所说的维恩图的局限性。可能更合适的视觉表示是这样。
桌子
从交叉联接B SQL小提琴中选择A.颜色,B。颜色
交叉联接(或笛卡尔乘积)使用两个表中各行的每种组合产生结果。每个表有4行,因此结果产生16行。
从A.Colour = B.Colour SQL Fiddle的内部联接B中选择A.Colour,B.Colour
内部联接在逻辑上返回交叉联接中与联接条件匹配的所有行。在这种情况下有五个。
从A.COLOR NOT IN(“绿色”,“蓝色”)SQL小提琴中的内部联接B选择A.Colour,B.Colour
内部联接条件不必一定是相等条件,也不必引用两个表(甚至其中一个表)的列。A.Colour NOT IN ('Green','Blue')对交叉联接的每一行进行评估。
内部联接条件的条件1=1对于交叉联接中的每一行都为true,因此两者是等效的(SQL Fiddle)。
从A.Colour = B.Colour SQL Fiddle的左外连接B中选择A.Colour,B.Colour
外部联接以同样的方式为内进行逻辑评估只是如果左表行(左连接)连接不从右手表都被保存在结果与任何行会合NULL的价值观右手列。
从A.COLOUR = B.COLOUR的左外连接B中选择A.Colour,B.Colour B.Colour IS NULL SQL Fiddle
这只是将先前的结果限制为仅返回其中的行B.Colour IS NULL。在这种特殊情况下,这些行将被保留,因为它们在右侧表中不匹配,并且查询返回表中不匹配的单个红色行B。这称为反半连接。
重要的是,为IS NULL测试选择一列不可为空或连接条件可确保NULL排除任何值的列,以使此模式正确运行,并避免仅带回恰好具有该NULL值的行,这一点很重要列以及未匹配的行。
从A.Colour = B.Colour SQL Fiddle的正确外部联接B中选择A.Colour,B.Colour
右外部联接的行为与左外部联接类似,不同之处在于它们保留了来自右表的不匹配行,并且null扩展了左手列。
从A.Colour = B.Colour SQL Fiddle的完整外部联接B中选择A.Colour,B.Colour
完全外部联接将左右联接的行为结合在一起,并保留左右表中不匹配的行。
TA贡献1836条经验 获得超3个赞
维恩图适用于表示设置操作,例如UNION,INTERSECTS,EXCEPT等。
仅在使用EXFT等设置操作模拟LEFT JOIN WHERE rhs.KEY为NULL的情况下,此图才是准确的。
否则会产生误导。例如,如果联接条件不是1:1,则任何联接都会导致行成倍增加。但是,只允许集合包含不同的成员,因此不能将它们表示为集合操作。
然后是CROSS JOIN或INNER JOIN ON = 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
(自我交叉和反加入以查找除您之外的所有相似家庭成员-self1和self2是同一集合,结果是一个适当的子集)
在本教程的前几分钟,坚持对键进行联接可能会很好,但是这可能会导致学习联接的含义很差。我认为这就是您所发现的。
维恩图通常可以用这种方式表示JOIN的想法需要消失。
添加回答
举报