知识卡片

外连接是被null填充的"并"运算

普通读书笔记卡

内容

外连接天生就会在结果中产生NULL,因此通常应当避免使用,但理解它为什么会产生 NULL能帮助判断哪些情况下这种妥协是可以接受的。从关系理论角度看,外连接的本质 根本不是连接,而是一种”并”运算的变体——它强行让两张原本不满足”并”运算通常要求 (标题必须完全相同)的表参与并运算,做法是先给其中一张或两张表补上NULL值填充 缺失的列,让两边标题凑齐一致后再做并集。书中用等价改写直观说明这一点:外连接 S NATURAL LEFT OUTER JOIN SP配合COALESCE(PNO,'nil')得到的结果,可以完全 用纯粹的UNION加显式补NULL/占位值来手写复现——先取SP里所有(SNO,PNO)行,再 UNION上”S里那些完全没有出现在SP中的供应商编号,PNO列填一个占位值”这部分(用 ‘nil’代替NULL同样能达到同样的展示效果)。这个等价关系揭示了外连接的真实身份: 它不是连接家族里的一个特例,而是”并”运算为了兼容不等标题的表所做的一种妥协, 只是约定俗成地选择用NULL作为默认填充值,理论上也完全可以像上面例子那样换成 任何有实际意义的占位值。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第4章"不要重复,不要 null"4.6节"对外连接的说明"(源文件:OEBPS/text00048.html) - 结论依据:原文明确"外连接天生就会在结果中产生null,因此通常应避免使用。从 关系理论角度,它是一种妥协:它迫使表参与一种'并'(没错,我说的就是并,不是 连接),即使所用的表不符合'并'的通常要求……通过在进行'并'之前向一个或全部 两个表填充null的方式,可实现对外联接,这样就可以使表满足通常的要求了",并 给出用UNION加显式占位值改写外连接的等价SQL示例。 - 原始内容:外连接天生就会在结果中产生null……从关系理论角度,它是一种妥协: 它迫使表参与一种"并",即使所用的表不符合"并"的通常要求……通过在进行"并"之前 向一个或全部两个表填充null的方式,可实现对外联接。