《SQL与关系数据库理论——如何编写健壮的SQL代码》一3.4 关系及其主体

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

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

3.4 关系及其主体

要讨论的第一点是,主体的任何子集仍是主体;或者,不严格地说,关系的任何子集仍是关系。(第1章讨论过,不过现在要多说几句。)特别的,因为空集是任何集合的子集,所以,一个关系的主体可以由空的元组集合构成,这样的关系称为空关系(empty relation)。比如,假设现在没有任何出货(shipment)。那么,关系变量SP的当前值就是一个空的出货关系,如下图所示(现在我们回归在非正式场合省略标题中类型名称的惯例;在本书的剩余部分,标题中是否包括类型名称取决于是否适合达到最佳表达目的)。
image

注意,对于确定的特定关系类型只有一个该类型的空关系;而不同类型的空关系并不相同,因为它们的类型不同。比如,供应商空关系就不等于零件空关系(它的主体相等,但是标题不等)。
考虑下述关系:
image

这个关系只包含一个元组(等价于其基数为1)。如果想存取该关系包含的唯一元组,那么就必须以某种方式从包含它的关系中提取元组。Tutorial D使用TUPLE FROM rx语法形式达到此目的。其中,rx表示基数为1的关系的任意表达式。比如,它可以是表达式RELATION{TUPLE{SNO 'S1', PNO 'P1', QTY 300}}。这个表达式事实上是一个关系选择器调用(实际上是文字的)。相反,SQL使用型转;如果:tx是用作行子查询的表表达式(其出现在期望行表达式之处),则由tx表示的表t应只包含一行r,并且表t型转为行r。示例如下(此例是2.9节“SQL中的行类型和表类型”中的行赋值示例):
SET SRV = ( S WHERE SNO = 'S1' ) ;
我们还要检测在确定的关系r中是否出现元组t,在Tutorial D中:
t image r
当t在r中出现时返回TRUE,否则返回FALSE。符号“image”表示集合成员(set membership)运算符;表达式timager可读为“t[是]在r中”或“t出现在r中”。
你可能已经想到了,“image”实质上就是SQL的IN。只不过,SQL的IN左运算元通常是个标量而不是行(这意味着又要进行一些型转,即标量型转为包含标量的行)。注5示例如下(“得到至少供应一种零件型号的供应商”):

SELECT SNO , SNAME , STATUS , CITY 
FROM   S
WHERE  SNO IN     /* “SNO” coerced to “ROW(SNO)” */
     ( SELECT SNO
       FROM   SP )

注意:你肯定知道,SQL也支持NOT IN。Tutorial D对应的是“”。换句话说,Tutorial D表达式“tr”的意思是“t不在关系r中”。

相关实践学习
体验RDS通用云盘核心能力
本次实验任务是创建一个云数据库RDS MySQL(通用云盘),并通过云服务器ECS对RDS MySQL实例进行压测,体验IO加速和IO突发带来的性能提升;并通过DMS执行DDL,将数据归档到OSS,再结合云盘缩容,体验数据归档带来的成本优势。
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
创建SQL数据库的基本步骤与代码指南
在信息时代,数据管理显得尤为重要,其中数据库系统已成为信息技术架构的关键部分。而当我们谈论数据库系统时,SQL(结构化查询语言)无疑是其中最核心的工具之一。本文将详细介绍如何使用SQL创建数据库,包括编写相应的代码和必要的步骤。由于篇幅限制,本文可能无法达到您要求的2000字长度,但会尽量涵盖创建数
47 3
|
1月前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
1月前
|
SQL 安全 关系型数据库
SQL错误代码1303解析与解决方案:深入理解并应对权限问题
在数据库管理和开发过程中,遇到错误代码是常见的事情,每个错误代码都代表着一种特定的问题
|
3月前
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
41 1
|
2月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
116 0
|
3月前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
117 0
|
3月前
|
SQL 数据库 开发者
|
3月前
|
SQL 数据库 索引
SQL 编程最佳实践简直太牛啦!带你编写高效又可维护的 SQL 代码,轻松应对数据库挑战!
【8月更文挑战第31天】在SQL编程中,高效与可维护的代码至关重要,不仅能提升数据库性能,还降低维护成本。本文通过案例分析探讨SQL最佳实践:避免全表扫描,利用索引加速查询;合理使用JOIN,避免性能问题;避免使用`SELECT *`,减少不必要的数据传输;使用`COMMIT`和`ROLLBACK`确保事务一致性;添加注释提高代码可读性。遵循这些实践,不仅提升性能,还便于后期维护和扩展。应根据具体情况选择合适方法并持续优化SQL代码。
55 0
|
3月前
|
SQL Java 数据库连接
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
|
3月前
|
SQL DataWorks 大数据
DataWorks操作报错合集之SQL代码行数过长产生报错,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。