知识卡片

排他并与半连接/半差:三个实践重要的附加运算符

普通读书笔记卡

内容

排他并(XUNION,也叫对称差)是并的排他版本:r1 XUNION r2要求r1、r2同类型, 主体是只出现在r1、或只出现在r2、但不能同时出现在两者中的元组,类比逻辑里的 XOR之于OR。半连接和半差是比[[自然连接的精确定义及交与积是连接的特例]]和 [[并交差的精确定义与CORRESPONDING实践建议]]中的连接/差更常被实际查询需要 的两个运算符(书中特别提醒:”你可能从未听过半连接,但它其实非常重要”): 半连接r1 MATCHING r2等价于(r1 JOIN r2){H1}(H1为r1标题),即连接结果对 r1属性的投影——本质是”取r1中能和r2匹配上的那部分子集”;要注意r1 MATCHING r2r2 MATCHING r1一般不等价,前者返回r1子集,后者返回r2子集。半差 r1 NOT MATCHING r2等价于r1 MINUS(r1 MATCHING r2),即”r1中排除掉能和r2 匹配上的那部分”,实践中大部分”看起来要用差”的查询,实际需要的是半差而非 纯粹的差;当r1、r2类型相同时,半差会退化成普通的差(r1 NOT MATCHING r2= r1 MINUS r2),这说明差是半差的一个特例,但连接却不是半连接的特例—— 两者虽然有交集但终究是不同的运算符。这三个运算符共同的价值在于:它们不是 理论意义上的”基本运算符”(呼应[[哪些运算符是基本的基本与有用的区别]]), 但对应了极其常见的实际查询意图(”两者互斥的部分”“能匹配上的子集”“匹配不上 的子集”),比起用户自己手写等价的组合表达式(连接+投影、连接+差),直接 使用这些命名好的运算符能显著提高查询的可读性和正确性。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第7章"SQL和关系代数 II:附加运算符"7.1节"排他并"、7.2节"半连接和半差"(源文件: OEBPS/text00074.html、text00075.html) - 结论依据:原文明确"两个集合s1和s2的排他并……是一个集合,其元素只出现在 s1中或只出现在s2中但不能在两者中都出现""关系r1和r2的半连接(r1 MATCHING r2)等价于(r1 JOIN r2){H1}……表达式r1 MATCHING r2和r2 MATCHING r1一般 是不等价的……两个关系r1和r2的半差(r1 NOT MATCHING r2)等价于r1 MINUS (r1 MATCHING r2)……集合差(MINUS)从关系角度讲是半差的特例。相反,连接 不是半连接的特例"。 - 原始内容:关系r1和r2的半连接(r1 MATCHING r2)等价于(r1 JOIN r2){H1} ……两个关系r1和r2的半差(r1 NOT MATCHING r2)等价于r1 MINUS(r1 MATCHING r2)……集合差(MINUS)从关系角度讲是半差的特例。