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

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

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

2.9 SQL中的行类型和表类型

再来用一下2.5节“标量类型vs.非标量类型”中定义元组变量的例子:
VAR STV TUPLE { STATUS INTEGER , SNO CHAR , CITY CHAR , SNAME CHAR } ;
你可能还记得,表达式TUPLE{}是对TUPLE类型生成器的调用。SQL有对应的ROW类型生成器(尽管SQL将其命名为类型构造器(type constructor))。下面是一个对前述Tutorial D示例的SQL类比:

DECLARE SRV /* SQL row variable */
        ROW ( SNO        VARCHAR(5) ,
              SNAME  VARCHAR(25) ,
              STATUS INTEGER ,
              CITY   VARCHAR(20) ) ;

然而,与元组不同,SQL中的行对其分量采用自左至右的排序;注19就以此为例,同样的四个分量可以构成24(=4×3×2×1)种不同的行类型(!)。
SQL也支持行赋值。考虑如下Tutorial D元组赋值:

STV := TUPLE FROM ( S WHERE SNO = 'S1' ) ;

下面是类比的SQL行赋值:

SET SRV = ( S WHERE SNO = 'S1' ) ;

右侧表达式是一个行子查询(从语法上讲是一个表表达式,但实际上作为一个行表达式)。这也是SQL中没有什么能显式地对应Tutorial D的TUPLE FROM的原因所在。(参见2.7节“SQL中的类型检查和型转”中对于子查询和型转的讨论)。
在SQL的UPDATE语句(参见第3章)中实际上也涉及了行赋值。.
再来说表。有趣的是,SQL根本没有一个真正的TABLE类型生成器(或像SQL中的类型构造器)!也就是说,SQL没有什么能直接类比于前文中,描述的RELATION类型生成器。然而,它有一个机制(CREATE TABLE)来定义本应被称为TABLE变量的东西。比如,回想一下2.5节“标量类型vs.非标量类型”中的定义:

VAR S BASE
      RELATION { SNO CHAR , SNAME CHAR , STATUS INTEGER , CITY CHAR }
      KEY { SNO } ;

下面是SQL的类比:

CREATE TABLE S
     ( SNO     VARCHAR(5)     NOT NULL ,
       SNAME     VARCHAR(25)     NOT NULL ,
       STATUS     INTEGER     NOT NULL ,
       CITY     VARCHAR(20)     NOT NULL ,
       UNIQUE ( SNO ) ) ;

要小心,本例中没有语言标记序列(sequence of linguistic tokens )能标记为“对TABLE类型构造器的调用”。(在你意识到定义供应商某一完整性的约束UNIQUE(SNO)声明不必列定义,而是几乎可以出现在任何地方(比如,SNO和SNAME列定义之间)之后,这一事实会更加明显。对于单个列定义中同样定义完整性约束的NOT NULL声明就更不必说了。)事实上,在这个意义上可以认为变量S在SQL中具有任何类型,而不管是什么类型它都只不过是“行包”(bag of rows),而当前所讨论行的类型是ROW (S`
NO VARCHAR (5),SNAME VARCHAR (25),STATUS INTEGER ,CITY VARCHAR (20))。

即便如此,我同时应该说明的是:SQL确实支持所谓的“类型化表”(typed tables)。不过,这个词不是很贴切,因为如果TT是一个定义为“T类型”的“类型化表”,那么TT就不是T类型的,并且它的行也不是!更重要的是,你应该尽量避开这样的表,因为它们与SQL对指针(pointer)的支持紧密相关,而指针是在关系模型中被明确禁止的。注20事实上,如果某个表的某列取值是指向另一“目标”表数据行的指针的话,那么这个表就不可能代表关系模型意义下的关系。注21然而,如刚才说的,SQL中不幸地允许此种表存在;指针称为引用值(reference values),包含指针的列则是REF类型(REF type)的。坦白地说,SQL中为什么要包括这些特性完全让人搞不懂;从有用的功能性上来看没什么事是非用它们不可的,事实上不用它们甚至可以做得更好。强烈建议:别用它们以及任何与其相关的特性。
旁注:为了避免可能的混淆,我要说明一下,SQL实际上在两个完全不同的意义下使用术语“参照(referencing)”。一个就像上面描述的那样。另外一个意义(也是更早出现的意义)和外键有关;一行中的一个外键取值被认为是“参照”包含对应目标键值的行。然而要注意,外键可不是指针!——这两个概念之间有多处逻辑差异,尤其是外键指向的是行(也就是行值),而指针是地址,因此按定义指向的是变量。(第1章中提到过,变量是“有空间位置的(have location)”,而值没有空间位置,也没有地址)。

相关文章
|
14天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 存储 BI
【软件设计师备考 专题 】数据库语言(SQL)
【软件设计师备考 专题 】数据库语言(SQL)
90 0
|
1月前
|
SQL 数据库
sql server中创建数据库和表的语法
sql server中创建数据库和表的语法
18 1
|
14天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
84 6
|
1天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
3天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
11天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
11天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
38 3
|
14天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
47 0
|
14天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例