Bra*_*cil 42 sql mysqli visualization set-theory
我在理解sql中的连接时遇到了麻烦,并且遇到了这个我认为可能对我有用的图像.问题是我不完全理解它.例如,图像右上角的连接,它将整个B圆圈的颜色设置为红色,但只有A的重叠.图像使得它看起来像圆圈B是sql语句的主要焦点,但是sql语句本身,从A开始(从A中选择,加入B),向我传达了相反的印象,即A将成为sql语句的焦点.
同样,下面的图像只包含来自B圈的数据,那么为什么在连接语句中包含A呢?
问题:从右上角顺时针工作并在中心完成,有人可以提供有关每个sql图像表示的更多信息,解释
a)为什么在每种情况下都需要连接(例如,特别是在没有数据来自A或B的情况下,即只有A或B而不是两者都被着色的情况)
b)以及任何其他细节可以澄清为什么图像是sql的良好表示

Mar*_*ith 52
我同意Cade关于维恩图的局限性.更合适的视觉表现可能就是这样.

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

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

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

1=1对于交叉连接中的每一行,内部连接条件将评估为true,因此两者是等效的(SQL Fiddle).
外连接的逻辑评估方式与内连接的方式相同,只是如果左表中的一行(左连接)不与右表中的任何行连接,它将保留在结果中,其NULL值为右栏.

这只是将前一个结果限制为只返回行所在的位置B.Colour IS NULL.在这种特殊情况下,这些将是保留的行,因为它们在右侧表中没有匹配,并且查询返回表中不匹配的单个红色行B.这被称为反半连接.
为IS NULL测试选择一个不可为空的列或连接条件确保NULL将排除任何值以使此模式正常工作并避免仅返回恰好具有该NULL值的行的列非常重要.除了未匹配的行之外的列.

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

完全外连接组合了左连接和右连接的行为,并保留左表和右表的不匹配行.

Cad*_*oux 10
维恩图适用于表示集合操作,如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)
Run Code Online (Sandbox Code Playgroud)
要么
SELF self1
INNER JOIN SELF self2
ON self2.key <> self1.key
AND self1.type = self2.type
Run Code Online (Sandbox Code Playgroud)
(自我交叉和反连接以找到除了你自己之外的所有类似的家庭成员 - self1和self2是相同的集合,结果是一个合适的子集)
在教程的前几分钟坚持加入键可能没问题,但这可能会导致学习联接的不良途径.我想这就是你找到的.
Venn Diagrams通常以这种方式代表JOIN的想法需要消失.
我觉得你的主要潜在的困惑是,当(例如)只A以红色突出显示,你正在做的是指"查询只返回数据来自A ",但实际上它的意思是"查询只返回数据的那些情况下,A有记录 ".查询可能仍包含从B.数据(有关情况B并没有有记录,查询将取代NULL.)
同样,下面的图像只包含来自B圈的数据,那么为什么在连接语句中包含A呢?
如果你的意思是 - A完全是白色的图像,并且那个部分的红色新月形状B不重叠A,那么:A查询中出现的原因是,A它是如何找到B需要的记录的被排除在外.(如果A没有出现在查询中,那么维恩图就没有A,它只会显示B,并且没有办法将所需的记录与不需要的记录区分开来.)
图像看起来像圆圈B是sql语句的主要焦点,但是sql语句本身,从A开始(从A中选择,加入B),给我带来了相反的印象,即A将成为焦点的SQL语句.
完全正确.因此,RIGHT JOINs相对不常见; 虽然它使用的查询LEFT JOIN几乎总是可以重新排序使用RIGHT JOIN替代(反之亦然),通常人们会写自己的查询与LEFT JOIN和不带RIGHT JOIN.
| 归档时间: |
|
| 查看次数: |
59222 次 |
| 最近记录: |