《SQL与关系数据库理论——如何编写健壮的SQL代码》一3.2 SQL中的行

简介: 本节书摘来华章计算机《交互式程序设计 第2版》一书中的第3章 ,第3.2节,Joshua Noble 著 毛顺兵 张婷婷 陈宇 沈鑫 任灿江 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。 3.2 SQL中的行 SQL支持数据行而不是元组;具体来说,SQL支持行类型、行类型构造器和行值构造器。

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

3.2 SQL中的行

SQL支持数据行而不是元组;具体来说,SQL支持行类型、行类型构造器和行值构造器。这些数据行基本可以分别类比于Tutorial D中的元组类型、TUPLE类型生成器和元组选择器(第2章中讨论过行类型以及行类型构造器,但没有行值构造器)。不过,这些类比是很不严谨的。这是因为,行与元组严格来讲并不一样,行对其分量有自左向右的排序,而元组没有。比如,表达式ROW(1,2)和ROW(2,1)就代表了两个不同的SQL行(两个都是SQL中合法的行值构造器调用)。注意:SQL行值构造器调用中的ROW关键字是可选的;但在实践中基本都忽略它。
正是因为自左向右的排序,SQL中的行分量(“字段”)可以(实际也是)通过顺序位置而不是名称来识别。比如,下面的行值构造器调用(实际是行字面值,尽管SQL没有这个术语):

( 'S1' , 'Smith' , 20 , 'London' )

此行很明显有一个值为'Smith'的分量。然而,我们在逻辑上不能说该分量是“SNAME分量”,我们只能说它是第2个分量。
还有,SQL中的行至少包含一个分量,SQL没有关系模型中0-元组的对应物(没有“0-行”)。
如第2章所述(涉及SQL行变量SRV的那个例子),SQL也支持行赋值操作。注2这样的赋值尤其存在于SQL的UPDATE语句中。比如,下面的UPDATE语句:

UPDATE  S
SET     STATUS = 20 , CITY = 'London'
WHERE   CITY = 'Paris' ;

就定义为与下面的语句逻辑相等(注意在第2行中的行赋值):

UPDATE  S
SET   ( STATUS , CITY ) = ( 20 , 'London' )
WHERE   CITY = 'Paris' ;

对于比较运算,大多数SQL中的布尔表达式(包括简单的“标量”比较)实际上都是依据行而不是标量进行定义的。下面是一个SELECT表达式示例,其中的WHERE子句包含一个显式的行比较:

SELECT SNO 
FROM   S
WHERE  ( STATUS , CITY ) = ( 20 , 'London' )

这个SELECT表达式逻辑等价于下面的语句:

SELECT SNO 
FROM   S
WHERE  STATUS = 20 AND CITY = 'London'

再比如,表达式:

SELECT SNO 
FROM   S
WHERE  ( STATUS , CITY ) <> ( 20 , 'London' )

逻辑等价于:

SELECT SNO 
FROM   S
WHERE  STATUS <> 20 OR CITY <> 'London'

注意:此例的展开形式,WHERE子句中的两个独立比较是由OR而不是由AND连接的。
另外,因为行分量具有左右排序,SQL也支持将“<”和“>”作为行比较运算符。示例如下:

SELECT SNO 
FROM   S
WHERE  ( STATUS , CITY ) > ( 20 , 'London' )

此式逻辑等价于:

SELECT SNO 
FROM   S
WHERE  STATUS > 20 OR ( STATUS = 20 AND CITY > 'London' )

然而,在实践中,大多数行比较包含的都是度为1的行,如下:

SELECT SNO 
FROM   S
WHERE  ( STATUS ) = ( 20 )

前面示例中所有的比较表达式都是行值构造器调用。不过,SQL有一个语法规则:如果这样的调用由唯一一个用括号封闭的标量表达式构成,则可以去掉括号,如下:

SELECT SNO 
FROM   S
WHERE  STATUS = 20

此例中WHERE子句的“行比较”就是有效的标量(scalar)比较(STATUS和20都是标量表达式)。然而,严格地讲,SQL中没有什么是标量比较;对于SQL而言,表达式STATUS=20在技术上仍然是一个行比较(“标量”比较元(comparand)有效地型转为行)。
建议:除非比较中各行的度都为1(即实际上的标量),否则就不要用“<”“<=”“>”和“>=”这些比较运算符;它们既依赖于自左向右的列排序,又没有关系模型中的对应物,还非常容易出错。(有必要说明一下,在SQL第一次提出这个功能时,标准制定者在准确定义语义时碰到了很大的困难;事实上,他们在搞定之前来回折腾了好几遍)。

相关实践学习
MySQL数据库快速部署实践
本场景主要介绍如何在一台配置了CentOS 7.7版本的ECS实例(云服务器)上安装mysql,执行mysql的常用操作,学习基本的SQL语句。
相关文章
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
847 152
|
5月前
|
存储 关系型数据库 数据库
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
本文通过一个 Agentic RAG 应用的完整构建流程,展示了如何借助 RDS Supabase 快速搭建具备知识处理与智能决策能力的 AI 应用,展示从数据准备到应用部署的全流程,相较于传统开发模式效率大幅提升。
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
|
3月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
435 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
2月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
221 6
|
7月前
|
SQL 存储 关系型数据库
第二篇:关系型数据库的核心概念与 SQL 基础
本篇内容深入浅出地讲解了关系型数据库的核心概念与SQL基础,适合有一定计算机基础的学习者。文章涵盖数据库的基本操作(CRUD)、数据类型、表的创建与管理等内容,并通过实例解析SELECT、INSERT、UPDATE、DELETE等语句的用法。此外,还推荐了多种学习资源与实践建议,帮助读者巩固知识。学完后,你将掌握基础数据库操作,为后续高级学习铺平道路。
473 1
|
3月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
3月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
349 8
|
4月前
|
SQL 人工智能 Java
用 LangChain4j+Ollama 打造 Text-to-SQL AI Agent,数据库想问就问
本文介绍了如何利用AI技术简化SQL查询操作,让不懂技术的用户也能轻松从数据库中获取信息。通过本地部署PostgreSQL数据库和Ollama模型,结合Java代码,实现将自然语言问题自动转换为SQL查询,并将结果以易懂的方式呈现。整个流程简单直观,适合初学者动手实践,同时也展示了AI在数据查询中的潜力与局限。
562 8
|
6月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
515 62

热门文章

最新文章