知识卡片
排他并与半连接/半差:三个实践重要的附加运算符
内容
排他并(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
r2和r2 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)从关系角度讲是半差的特例。