《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第一次提出这个功能时,标准制定者在准确定义语义时碰到了很大的困难;事实上,他们在搞定之前来回折腾了好几遍)。

相关实践学习
体验RDS通用云盘核心能力
本次实验任务是创建一个云数据库RDS MySQL(通用云盘),并通过云服务器ECS对RDS MySQL实例进行压测,体验IO加速和IO突发带来的性能提升;并通过DMS执行DDL,将数据归档到OSS,再结合云盘缩容,体验数据归档带来的成本优势。
相关文章
|
9天前
|
SQL 数据库 数据安全/隐私保护
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
|
29天前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
|
1天前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
23天前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
40 16
|
25天前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
2月前
|
SQL 数据库
数据库数据恢复—SQL Server报错“错误 823”的数据恢复案例
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复。
|
2月前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
108 9
|
3月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
288 6
|
3月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
795 11
|
4月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
120 11

热门文章

最新文章