知识卡片
关系值与关系变量的区分及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')……值不存在于空间和时间之中……变量确实存在于空间和
时间之中,且可以被更新,这就是"变量"的含义。