《SQL与关系数据库理论——如何编写健壮的SQL代码》一1.8 关系vs.关系变量

简介: 本节书摘来华章计算机《SQL与关系数据库理论——如何编写健壮的SQL代码》一书中的第1章 ,第1.8节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

本节书摘来华章计算机《SQL与关系数据库理论——如何编写健壮的SQL代码》一书中的第1章 ,第1.8节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.8 关系vs.关系变量

你可能早已知道本章讲过的所有内容;其实,我也希望如此,不过我可不希望你因此感到乏味。事实上,长久以来一直存在着另一个造成大量混淆的逻辑差异:关系和关系变量之间的差异。暂时先把数据库放在一边;想想下面这个简单的编程语言示例。假设我用某种编程语言说:
DECLARE N INTEGER ... ;
那么,这里的N就不是一个整数而是一个变量,而变量的取值是整数,即在不同时刻可以取不同整数。这个很好理解。用完全同样的方式,如果我用SQL说:

CREATE TABLE T ... ;

那么,T就不是一个表,它是一个变量,一个表变量或者说是一个关系变量(这是我更想用的名称,忽略SQL中类似于重复行或者列排序等各种“怪癖”),其取值就是关系(不同的时刻有不同的关系)。
请看图1.3中的suppliers-and-parts数据库。这个图显示了3个关系值,即在某特定时刻恰好出现在数据库中的关系值。但是,如果在其他时刻再看数据库,我们可能会在其位置发现三个不同的关系值。换句话说,数据库中的S、P和SP实际上是变量,准确地说,是关系变量。比如,假设关系变量S当前有图1.3中显示的值,即关系值。又假设我们删掉了对应雅典供应商的元组集合(实际上只有一个元组):

DELETE S WHERE CITY = 'Athens' ;

那么结果会是:
image

概念上,发生的事情是,S的旧值被新值整体替换了。当然,旧值(有5个元组)和新值(有4个元组)在一定意义上是非常类似的,但是它们又是完全不同的值。实际上,刚才所说的DELETE逻辑等价于下面的关系赋值(实际是下面关系赋值的缩写):

S := S MINUS ( S WHERE CITY = 'Athens' ) ;

正如所有的赋值,此处的效果是:(a)计算右侧的源表达式;(b)计算结果被赋值到左侧的目标变量,而整个的结果刚才已经解释过了。
旁注:我无法用SQL说明刚才所说的赋值运算,因为SQL不直接支持关系赋值。不过,我已经用可以自解释的语言Tutorial D对关系赋值以及DELETE进行了说明。Tutorial D是Hugh Darwen和我在《Databases, Types, and the Relational Model: The Third Manifesto》(参见附录G)一书中用于描述关系思想的语言。我在本书中解释关系概念时也会使用该语言。注14不过,鉴于本书的目标读者是SQL实践人员,大多数时候我也会用SQL类比。注意:Tutorial D 的BNF语法参见附录D。
再强调一遍,DELETE是对特定关系赋值的简写。当然,类似的说明对于INSERT和UPDATE也适用:它们基本也是对特定关系赋值的简写。就像在1.4节“原始模型回顾”中提到的,关系赋值是关系模型中基本的更新运算符;事实上,从逻辑上说,我们真正需要的更新运算符也就仅此一个。
因此,关系值与关系变量是有逻辑差异的。问题是,数据库文献长久以来都使用“关系”一词来同时代表两者,这导致了混淆。注15因此,从现在开始,我在本书中会非常仔细地区分两者——用“关系值”表示关系取值,用“关系变量”表示关系变量。然而,在很多时候也会把关系值简称为关系(就好像经常将整数取值简称为整数一样)。对于关系变量(relation variable),则会在大多数时候将其简称为关系变量(relvar);比如,我会说suppliers-and-parts数据库包含三个关系变量(更准确的说,是三个基关系变量)。
作为练习,你可以回顾本章之前内容有哪些地方应该使用关系变量(relvar)但却(或者是也)使用了关系(relation)。

相关文章
|
21小时前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之将RDS切换到PolarDB-X 2.0时,代码层的SQL该如何改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
10天前
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之在执行SQL查询时遇到报错,代码为[XX000],该怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5天前
|
SQL 索引
如果想要再SQL代码中生成递增序列,那么步骤是什么
如果想要再SQL代码中生成递增序列,那么步骤是什么
|
20天前
|
SQL 人工智能 自然语言处理
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
|
1月前
|
SQL 机器学习/深度学习 分布式计算
MaxCompute产品使用合集之sql代码中支持插入jinja语法语句吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
1月前
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之在执行SQL时,出现了权限问题。错误代码为odps-0433121,是什么导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
28天前
|
关系型数据库 MySQL 测试技术
《阿里云产品四月刊》—瑶池数据库微课堂|RDS MySQL 经济版 vs 自建 MySQL 性能压测与性价比分析
阿里云瑶池数据库云原生化和一体化产品能力升级,多款产品更新迭代
|
1月前
|
SQL 存储 分布式计算
MaxCompute产品使用问题之odps sql如何定义变量
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
1月前
|
SQL 缓存 Oracle
SQL调优之绑定变量用法简介
SQL调优之绑定变量用法简介
|
1月前
|
SQL 关系型数据库 数据库
实时计算 Flink版操作报错合集之在本地执行代码没有问题,但是在线执行sql命令就会报错,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
104 0