知识卡片

关系值与关系变量的区分及DELETE的本质

普通读书笔记卡

内容

借助通用编程语言里”值(value)与变量(variable)”的区分来看:DECLARE N INTEGER 让N成为一个变量而不是一个整数本身;同理,SQL里 CREATE TABLE T ... 让T成为一个 变量——准确说是一个表变量/关系变量(relvar),而不是一个关系值本身。值是逻辑学 意义上的”个体常量”,不存在于时空之中(虽然可以通过某种存在于时空中的编码来表示 它),同一个值可以在同一或不同时刻被任意多个变量持有,且值按定义不可更新(一旦 更新它就不再是它自己了);变量则是一个真实存在于时空中的容器,可以被更新(用 一个新值替换当前值),”可更新/可赋值”正是”变量性”的含义所在。这条一般性区分落到 关系模型上,直接解释了DELETE/INSERT/UPDATE这三条SQL语句的本质:它们在逻辑上都是 对唯一真正的基础更新算子——关系赋值(relational assignment)——的语法糖。以 DELETE S WHERE CITY='Athens' 为例,这条语句在概念上完全等价于把S的整个旧值 替换成一个新值:S := S MINUS (S WHERE CITY='Athens'),即先求出”S里排除Athens 供应商”这个关系表达式的值,再把这个值整体赋给S这个关系变量。这个等价性之所以要 用Tutorial D(作者与Hugh Darwen为表达纯粹关系概念而设计的形式化语言,出自 《数据库、类型与关系模型:第三宣言》)来写,是因为SQL本身根本不支持直接表达 关系赋值这个概念——这也是本书需要引入Tutorial D辅助讲解、而不能只用SQL讲透关系 理论的核心原因。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第1章"做好准备"1.8节 "关系vs.关系变量"、1.9节"值vs.变量"(源文件:OEBPS/text00014.html、 text00015.html) - 结论依据:原文明确"CREATE TABLE T……这条语句使得T成为一个变量,确切地说,是 一个表变量或者说关系变量(relvar)""DELETE S WHERE CITY='Athens'在逻辑上等价于 S := S MINUS (S WHERE CITY='Athens')""值……不存在于空间和时间之中……变量…… 确实存在于空间和时间之中,且可以被更新,这就是'变量'的含义""SQL并不直接支持 关系赋值",并说明INSERT/DELETE/UPDATE都是关系赋值的语法糖。 - 原始内容:这条语句使得T成为一个变量,确切地说,是一个表变量或者说关系变量 (relvar)……DELETE S WHERE CITY='Athens'在逻辑上等价于 S := S MINUS (S WHERE CITY='Athens')……值不存在于空间和时间之中……变量确实存在于空间和 时间之中,且可以被更新,这就是"变量"的含义。