为了账号安全,请及时绑定邮箱和手机立即绑定

sql加入维恩图

sql加入维恩图

牧羊人nacy 2019-10-15 10:30:50
我在理解sql中的连接时遇到了麻烦,并遇到了此映像,我认为这可能对我有所帮助。问题是我不完全了解它。例如,图像右上角的联接将整个B圆圈染成红色,但仅将A重叠。该图像使圆圈B成为sql语句的主要焦点,但是sql语句本身,从A开头(从A中选择,然后加入B),给我带来了相反的印象,即A将成为sql语句的焦点。同样,下面的图像仅包含来自B圈的数据,那么为什么join语句中完全包含A?问题:右上角顺时针工作并在中心结束,有人可以提供有关每个sql映像表示的更多信息,解释a)为什么在每种情况下都需要联接(例如,特别是在没有从A或B取得数据的情况下,即只有A或B而不是都带有颜色的情况下)b)和其他任何可以阐明为什么图像很好地表示sql的细节
查看完整描述

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。


查看完整回答
反对 回复 2019-10-15
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

我同意Cade所说的维恩图的局限性。可能更合适的视觉表示是这样。


桌子

//img1.sycdn.imooc.com//5da530840001dcdc02470114.jpg


从交叉联接B SQL小提琴中选择A.颜色,B。颜色

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


//img1.sycdn.imooc.com//5da5308700015f1801370345.jpg


从A.Colour = B.Colour SQL Fiddle的内部联接B中选择A.Colour,B.Colour

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


//img1.sycdn.imooc.com//5da5308f0001606501390123.jpg

从A.COLOR NOT IN(“绿色”,“蓝色”)SQL小提琴中的内部联接B选择A.Colour,B.Colour

内部联接条件不必一定是相等条件,也不必引用两个表(甚至其中一个表)的列。A.Colour NOT IN ('Green','Blue')对交叉联接的每一行进行评估。


//img1.sycdn.imooc.com//5da530920001f0f301480086.jpg

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


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

外部联接以同样的方式为内进行逻辑评估只是如果左表行(左连接)连接不从右手表都被保存在结果与任何行会合NULL的价值观右手列。


//img1.sycdn.imooc.com//5da530950001638601420135.jpg//img1.sycdn.imooc.com//5da530990001638601420135.jpg

从A.COLOUR = B.COLOUR的左外连接B中选择A.Colour,B.Colour B.Colour IS NULL SQL Fiddle

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


重要的是,为IS NULL测试选择一列不可为空或连接条件可确保NULL排除任何值的列,以使此模式正确运行,并避免仅带回恰好具有该NULL值的行,这一点很重要列以及未匹配的行。


//img1.sycdn.imooc.com//5da530a10001c9db01420027.jpg

从A.Colour = B.Colour SQL Fiddle的正确外部联接B中选择A.Colour,B.Colour

右外部联接的行为与左外部联接类似,不同之处在于它们保留了来自右表的不匹配行,并且null扩展了左手列。


//img1.sycdn.imooc.com//5da530a400014a8e01340131.jpg

从A.Colour = B.Colour SQL Fiddle的完整外部联接B中选择A.Colour,B.Colour

完全外部联接将左右联接的行为结合在一起,并保留左右表中不匹配的行。


//img1.sycdn.imooc.com//5da530a8000159ce01310152.jpg

查看完整回答
反对 回复 2019-10-15
?
米脂

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的想法需要消失。


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 850 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信