知识卡片

关系比较运算符与IS_EMPTY测试

普通读书笔记卡

内容

关系类型必须支持”=“比较(这是每个类型都必须满足的通用要求),但除了相等性, 书中指出对关系而言还有几种同样重要的比较:包含(r1中所有元组都在r2中)、真包含 (在包含的基础上r2还至少多一个r1没有的元组)、包含于/真包含于(前两者的反向 关系)。一个具体的实用例子是S{CITY}=P{CITY}(供应商城市投影集合与零件城市 投影集合是否相等);S{SNO}⊃SP{SNO}(真包含,表示存在供应商完全没有供应任何 零件,即某些供应商编号出现在S里却不出现在SP里)。这一节还引出一个后续章节 (尤其是第8章约束相关内容)会反复依赖的实用缩写:IS_EMPTY(r)表示”关系r是否 为空”,本质上是”r与同类型空关系相比是否相等”这个常见判断的简写,IS_NOT_EMPTY(r) 则是它的反运算。这几个比较运算符共同说明:关系之间的比较不只有相等这一种粒度, 包含关系(子集/超集)本身也是一种在数据库设计与约束表达中经常需要直接使用的 一等公民概念,而不需要每次都拆成”逐个检查元组成员关系”这种更底层的操作来表达。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第3章"元组、关系、行、表" 3.6节"关系比较"(源文件:OEBPS/text00036.html) - 结论依据:原文明确"对于同种类型T的两个关系r1和r2,必须至少能检验它俩是否 相等。其他的比较可能也是有用的。比如,我们可能想检验是否有'r1包含r2'…… 一个特别常见的需求就是,把某个确定的关系r和同类型的空关系进行'='比较,也就 是说,这是一个用来检验是否为空的测试……IS_EMPTY(r)……后续章节将非常依赖 这个表达式(尤其是第8章)"。 - 原始内容:对于同种类型T的两个关系r1和r2,必须至少能检验它俩是否相等…… IS_EMPTY(r)……此表达式定义为在关系r为空时返回TRUE,否则返回FALSE。后续 章节将非常依赖这个表达式(尤其是第8章)。