《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)。

相关实践学习
MySQL数据库快速部署实践
本场景主要介绍如何在一台配置了CentOS 7.7版本的ECS实例(云服务器)上安装mysql,执行mysql的常用操作,学习基本的SQL语句。
相关文章
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1083 152
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
845 156
|
11月前
|
存储 缓存 数据库
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
1043 4
|
12月前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
299 4
|
12月前
|
SQL
【YashanDB知识库】like 变量的SQL语句应用程序执行效率低与yasql执行效率高
【YashanDB知识库】like 变量的SQL语句应用程序执行效率低与yasql执行效率高
|
7月前
|
SQL 容灾 安全
云时代SQL Server的终极答案:阿里云 RDS SQL Server如何用异地容灾重构系统可靠性
在数字化转型的浪潮中,数据库的高可用性已成为系统稳定性的生命线。作为经历过多次生产事故的资深开发者,肯定深知传统自建SQL Server架构的脆弱性——直到遇见阿里云 RDS SQL Server,其革命性的异地容灾架构彻底改写了游戏规则。
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
4251 11
|
存储 数据采集 数据挖掘
CSV vs 数据库:数据存储的最佳选择是什么
本文介绍了爬虫数据存储中CSV和数据库的优缺点,分析了两者在不同场景下的适用性。CSV简单易用、资源消耗低,适合小量数据;数据库则在处理大量数据和复杂查询时表现出色,支持并发操作。通过Python代码示例,展示了如何使用多线程和爬虫代理IP技术将百度搜索数据存储到MySQL数据库中,适用于大型项目和复杂数据分析需求。
828 2
|
缓存 物联网 数据库
InfluxDB vs TDengine :2025 年了,谁家用的数据库还不能高效读缓存?
在工业互联网和物联网的大数据应用场景中,实时数据的写入和查询性能至关重要。如何快速获取最新设备状态并实时处理数据,直接影响到业务的高效运转。本文将深入分析 TDengine 和 InfluxDB 在缓存机制上的差异,帮助读者更好地理解这两款主流时序数据库在性能优化方面的优劣。
1161 1
|
SQL 存储 Oracle
南大通用GBase 8s数据库游标变量解析:提升数据库操作效率
南大通用GBase 8s 数据库游标变量解析:提升数据库操作效率