本节书摘来华章计算机《SQL与关系数据库理论——如何编写健壮的SQL代码》一书中的第1章 ,第1.9节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.9 值vs.变量
关系(relation)和关系变量(relvar)的逻辑差异实际上是通常意义下值与变量之间逻辑差异的特例。现在,谈谈通常意义下的情形(有点偏题,不过有必要这么做,因为清晰的思路在特别多的方面都非常有益)。下面给出一些定义:
定义 值(value)是逻辑学家所说的“单个常量”,比如整数3。一个值不存在于时空之中。然而,值可以通过某些编码在记忆中表示,而这些表示或编码在时空中存在。事实上,同一个值可以在不同的时间和地点以不同的形式表示。或者说,任意多个不同的变量(参见下个定义)在相同或不同的时间可以有相同的值。特别的,根据定义可知,值本身是不能被更新的;因为如果它能被更新,那么在更新之后它就不再是它本身了。
定义 变量是用于表示值的容器。一个变量存在于时空之中。同时,变量可以被更新,这一点和值不同。也就是说,可以用另外一个值替换变量的当前值。这就是“变量”的含义——作为变量就要可更新,可更新的才是变量;同样的,作为变量就要可赋值,可赋值的才是变量。
请特别小心,并不是只有整数3这样的简单事物才是合法值。相反,取值可以是很复杂的。比如,一个值可以是一个几何点,一个多边形,一条X射线,一个XML文档,一个指纹,一个数组,一个堆栈,一个列表或者一个关系等等。当然,类似的说明也适用于变量。下一章中会对这样的问题详细说明。你可能很难想象人们会在取值和变量这样明显并基础的差异上感到困惑。然而,事实并非如此。在此方面是十分容易掉入陷阱的。为了说明这种情况,考虑如下从某个对象数据库教程中抽取出来的内容(在方括号中的斜体部分是我给出的注释),如下所示:
我们区分变量的已声明类型是根据……对象的类型是变量的当前值[所以对象是值] ……我们从值区分对象[所以对象终究不是值] ……一个设值方法[是运算符使得]可能会查看其对于其他对象的影响[所以,对象实际上是变量]。