SQL入门经典(第5版)

978-7-115-26407-7
作者: 【美】Ryan Stephens Ron Plew Arie D.Jones
译者: 井中月郝记生
编辑: 傅道坤

图书目录:

详情

本书用通俗易懂的语言,循序渐进地介绍了用SQL进行事务处理、构造数据库和面向对象程序设计。 本书在上一版的基础上,更新了代码、图表、练习和测验。在这一般中作者还使用了现在很流行的,基于开放源代码的数据库(如MYSQL)的例子。

图书摘要

SQL入门经典(第5版)

[美]Ryan Stephens Ron Plew Arie D.Jones 著

井中月 郝记生 译

人民邮电出版社

北京

本书的作者都是数据库教学与应用的专家,有着丰富的经验。本书详细介绍了SQL语言的基本语法、基本概念,说明了各种SQL实现与ANSI标准之间的差别。书中包含了大量的范例,直观地说明了如何使用SQL对数据进行处理。每章后面还有针对性很强的测验与练习,能够帮助读者更好地理解和掌握学习的内容。在最后的附录里还有关于安装 MySQL 的详细介绍、书中用到的关键SQL语句、测验和练习的答案。

本书的内容层次清晰,针对性强,非常适合初学者作为入门教材。

本书的作者们10多年来研究、应用和总结了SQL标准以及这些标准在关系型数据库的应用。

Ryan StephensRon Plew是Perpetual Technologies(PTI)公司的老板、发言人和共同创建者,这是一家正在高速发展的IT管理与咨询公司,专门从事数据库技术,特别是Oracle和SQL服务程序在各种UNIX、Linux和Windows平台上的运行。Ryan和Ron最初从事数据分析和数据库管理,现在领导着一个专家小组,为全世界范围内的客户管理数据库。他们还在印第安纳波利斯的 Indiana University-Purdue大学创办并教授数据库课程达 5年之久,并且编写了10余本关于Oracle、SQL、数据库设计和重要系统高可用性方面的图书。

Arie D. Jones是PTI公司的高级SQL Server数据库管理员和分析员,领导着一个专家小组负责数据库环境与应用程序的规划、设计、开发、部署,从而让每个客户都获得最佳的工具与服务的组合。他是技术事件的定期发言人,并且编写了多本关于数据库的图书和论文。

第1章 欢迎来到SQL世界

本章的重点包括:

SQL历史简介

介绍数据库管理系统

一些基本术语和概念

介绍本书所使用的数据库

欢迎来到SQL的世界,体验当今世界庞大的不断发展的数据库技术。通过阅读本书,我们可以获得很多的知识,而这些是在当今关系型数据库和数据管理领域生存所必需的。由于首先必须要介绍SQL的背景知识和一些预备知识,本章的主要内容是对后续章节的概述,这显得有些单调,但这些貌似无聊的内容却是体会本书后续精彩内容的基础。

当今时代的任何事务都涉及数据,人们需要使用某种有组织的方法或机制来管理和检索数据。如果数据被保存在数据库中,这种机制便被称为数据库管理系统(DBMS)。数据库管理系统已经产生多年了,其中大多数源自于大型机上的平面文件系统。随着技术的发展,在不断增长的商业需要、不断增加的共用数据和互联网的推动下,数据库管理系统的使用已经偏离了其原始方向。

信息管理的现代浪潮主要是由关系型数据库管理系统(RDBMS)实现的,后者是从传统DBMS派生出来的。

现代数据库与客户端/服务器或Web技术相结合在当今是很常见的模式,公司使用这些方式来管理数据,从而在相应的市场保持竞争力。很多公司的趋势是从客户端/服务器模式转移到Web模式,从而避免用户在访问重要数据时受到地点的限制。下面几个小节将讨论SQL和关系型数据库,后者是当今最通用的DBMS实现。很好地理解关系型数据库,以及如何在当今信息技术世界利用SQL来管理数据,对于理解SQL语言是十分重要的。

“结构化查询语言(SQL)”是与关系型数据库进行通信的标准语言,最初是由IBM公司以E.F. Codd博士的论文《A Relational Model of Data for Large Shared Data Banks》为原型开发出来的。在之后不久的 1979年,Relational Software公司(后来更名为Oracle公司)发布了第一个SQL产品:ORACLE,现在已经成为关系型数据库技术的领军者。

当我们去别的国家旅行时,需要了解其语言才能更加方便。举例来说,如果服务员只能使用其本国语言,那我们用母语点菜可能就会有麻烦。如果把数据库看作一个要从中进行信息搜索的外国,那么SQL就是我们向数据库表达需求的语言,我们可以利用SQL进行查询,从数据库里获得特定的信息。

“美国国家标准化组织(ANSI)”是一个核准多种行业标准的组织。SQL作为关系型数据库所使用的标准语言,最初是基于IBM的实现在1986年被批准的。1987年,“国际标准化组织(ISO)”把ANSI SQL作为国际标准。这个标准在 1992年进行了修订(SQL-92),1999年再次修订(SQL-99)。目前最新的标准是2008年7月开始采用的SQL-2008。

SQL-2008由9个相关的文档组成,在不远的将来还可能增加其他文档,以扩展标准来适应新出现的技术。

第1部分——SQL/架构:指定实现一致性的一般性需求,定义SQL的基本概念。

第2部分——SQL/基础:定义SQL的语法和操作。

第3部分——SQL/调用级接口:定义程序编程与SQL的接口。

第4部分——SQL/持久存储模块:定义控制结构,进而定义SQL例程。还定义了包含SQL例程的模块。

第9部分——外部数据管理(SQL/MED):定义SQL的扩展,用于通过使用数据包裹支持外部数据管理;还定义了数据链类型。

第10部分——对象语言绑定:定义 SQL 的扩展,支持把 SQL 语句内嵌到用 Java编写的程序。

第11部分——信息和定义方案:定义信息方案和定义方案的规范,提供与SQL数据相关的结构和安全信息。

第13部分——使用 Java 编程语言的例程和类型:定义以 SQL 例程形式调用 Java静态例程和类的功能。

第14部分——XML相关规范:定义SQL使用XML的方式。

对于新的ANSI标准(SQL-2008),DBMS声称的兼容有两个级别:核心SQL支持和增强 SQL 支持。在下面这个网页上可以找到 ANSI SQL 标准的超级链接:www.informit. com/title/9780672335419。

ANSI表示“美国国家标准化组织”,负责规划各种产品和概念的标准。

标准显然是有好处的,当然有时也有不足之处。最重要的是,标准指引厂商沿着恰当的开发方向前进。就SQL来说,标准提供了必要基本原则的骨架,从而最终让不同的实现之间保持一致性,更好地实现可移植性(不仅是对于数据库编程,而且是对于数据库整体和管理数据库的个人而言)。

有人认为标准并不是那么好,它限制了灵活性和特定实现的功能。然而,大多数遵循标准的厂商都在特定产品里实现了对标准SQL的增强,从而弥补了这种问题。

综合考虑正反两方面的因素,标准还是好的。标准定义了在任何SQL完整实现中都应该具有的功能,规划的基本概念不仅让各种相互竞争的 SQL 实现保持一致性,也提高了 SQL程序员的价值。

所谓SQL实现是指特定厂商的SQL产品或关系型数据库管理系统。需要说明的是,SQL实现之间的差别是很大的。虽然有些实现的大部分是与ANSI兼容的,但没有任何一种实现完全遵循标准。另外,ANSI 标准里为了保持兼容性而必须遵守的功能列表在近些年并没有太大改变,因此,新版本的RDBMS也必将保持与ANSI SQL的兼容性。

简单来说,数据库就是数据集合。我们可以把数据库看成这样一种有组织的机制:它能够存储信息,用户能够以有效且高效的方式检索其中的信息。

事实上,人们每天都在使用数据库,只是没有察觉到。电话簿就是个数据库,其中的数据包括个人的姓名、地址和电话号码。这些数据是按字母排序或是索引排序的,让用户能够方便地找到特定的本地居民。实际上,这些数据保存在计算机上的某个数据库里。毕竟这些电话簿的每一页都不是手写的,而且每年都会发布一个新版本。

数据库必须被维护。由于居民会搬到其他城市或州,电话簿里的项目就需要删除或添加。类似地,当居民更改姓名、地址、电话号码等信息时,相应的项目也要被修改。图1.1 展示了一个简单的数据库。

图1.1 数据库

关系型数据库由被称为表的逻辑单元组成,这些表在数据库内部彼此关联。关系型数据库可以将数据分解为较小的、可管理的逻辑单元,从而在公司这一级别上更易维护,并提供更优化的数据库性能。如图1.2所示,表之间通过共同的关键字(数据值)彼此关联。

图1.2 关系型数据库

由于关系型数据库里的表是相互关联的,所以通过一个查询可以获取足够的数据(虽然需要的数据可能处于多个表里)。由于关系型数据库的表之间可以具有共同的关键字或字段,所以多个表里的数据可以结合在一起形成一个数据集。本书后续内容会不断展示关系型数据库的优越之处,包括整体性能和方便的数据访问。

过去,计算机业由大型机统治着,它们是体积庞大、功能强悍的系统,具有大容量存储和高速数据处理能力。用户通过哑终端与主机通信,所谓哑终端就是没有处理能力的终端,依靠主机的CPU、外设和内存进行工作。每个终端通过一个数据链连接到主机。主机模式能够很好地实现其设计目的,并且在当今很多领域还在发挥作用,但另一种更伟大的技术出现了:客户端/服务器模型。

在客户端/服务器系统里,主机被称为服务器,可以通过网络进行访问(通常是局域网或广域网)。访问服务器的通常是个人计算机(PC)或其他服务器,而不是哑终端。每台个人计算机被称为客户端,通过网络与服务器进行通信。这也就是“客户端/服务器”名称的由来。客户端/服务器模型与主机模型之间最大的差别在于作为客户端的个人计算机能够自己“思考”,能够利用自身的CPU和内存处理数据,并且能够轻松地通过网络访问服务器。在大多数情况下,客户端/服务器模型可以适用于当今全部商业需求。

现代数据库系统位于多种不同的操作系统之上,而这些操作系统又运行在多种不同的计算机上。最常见的操作系统有基于Windows的系统、Linux和像UNIX这样的命令行系统。数据库主要位于客户端/服务器和Web环境里。不能实现数据库系统的主要原因是缺乏培训和经验。对客户端/服务器模型和基于Web的系统的理解已经与互联网技术开发和网络计算一起成为当今商业的强制要求(虽然有时显得不合理)。图1.3展示了客户端/服务器技术的概念。

图1.3 客户端/服务器模型

商业信息系统正在向Web迁移。现在我们能够通过互联网访问数据库,这意味着使用浏览器(比如 IE 和 Firefox)就能访问公司的信息。顾客(数据的用户)能够定购货物、查看存货、查看订单状态、修改账目、转账等。

顾客只需打开浏览器,访问公司的站点、登录,就可以利用公司页面内置的程序访问数据。大多数公司要求用户注册,并且为顾客提供登录名和密码。

当然,通过浏览器访问数据库的幕后工作并不像看上去这么简单。举例来说,Web程序可以运行SQL,从而访问公司的数据库,向Web服务器返回数据,然后再将数据返回到顾客的浏览器。

从用户的角度来说,基于 Web 的数据库系统类似于客户端/服务器系统。每个用户拥有一台客户机,安装了浏览器程序,能够连接到互联网。图1.3 所示的网络是互联网,这并不是必需的。在大多数情况下,客户机访问服务器是为了获取信息,并不关心服务器是否位于另一个州,甚至是另一个国家。基于Web的数据库系统的主要目的在于利用似乎没有物理界限的数据库系统,提高数据可访问性,扩大公司的客户群。

当今主流数据库厂商包括Oracle、Microsoft、Informix、Sybase和IBM。这些厂商以昂贵的基本许可费用出售各种版本的关系型数据库的闭源版本。其他一些厂商提供 SQL数据库(关系型数据库)的开源版本,这些厂商包括 MySQL、PostgresSQL 和 SAP。虽然还有其他很多厂商,但在此列出的这些名称经常会出现在图书、报纸、杂志、股市和互联网上。

每个厂商的SQL实现都是与众不同、独一无二的。数据库服务器就是一个产品——像市场上的其他产品一样,由多个不同的厂商生产。为了实现可移植性和易用性,厂商都保证其实现兼容于当前的ANSI标准。如果一家公司从一个数据库服务器迁移到另一个时需要用户学习另一种语言来保持数据库功能,那就太糟糕了。

但是,每个厂商的SQL实现都针对其数据库服务器进行了增强,这些增强,或称之为扩展,是一些额外的命令和选项,附加于标准SQL软件包上,由特定的实现提供。

SQL会话是用户利用SQL命令与关系型数据库进行交互时发生的事情。当用户与数据库建立连接时,会话就被建立了。在SQL会话范围之内,用户可以输入有效的SQL命令对数据库进行查询,操作数据库里的数据,定义数据库结构(比如表)。会话可以通过直接与数据库建立连接来申请,也可以通过前端程序来申请。无论何种情况,会话通常是由通过网络访问数据库的用户在终端或工作站建立的。

当用户连接到数据库时,SQL会话就被初始化了。命令CONNECT用于建立与数据库的连接,它可以申请连接,也可以修改连接。举例来说,如果目前以 user1 的身份连接到数据库,我们还可以用CONNECT命令以user2的身份连接到数据库;连接成功之后,用于user1的SQL会话就被隐含地断开了。连接数据库通常需要用到以下命令:

在尝试连接到数据库时,用户会看到一个提示,要求输入与当前用户名对应的密码。用户名用于向数据库说明身份,而密码是允许进行访问的钥匙。

当用户与数据库断开连接时,SQL会话就被结束了。命令DISCONNECT用于断开用户与数据库的连接。当中断与数据库的连接之后,用户所使用的程序可能显得还在与数据库通信,但实际上已经没有连接了。当使用EXIT命令离开数据库时,SQL会话就结束了,而且用于访问数据库的软件通常会关闭。

下面将讨论执行各种功能的SQL命令的基本分类。这些功能包括绑定数据库对象、操作对象、用数据填充数据库表、更新表里的现有数据、删除数据、执行数据库查询、控制数据库访问和数据库管理。

主要的分类包括:

数据定义语言(DDL);

数据操作语言(DML);

数据查询语言(DQL);

数据控制语言(DCL);

数据管理命令;

事务控制命令。

数据定义语言(DDL)用于创建和重构数据库对象,比如创建和删除表。

本书要讨论的一些最基础的DDL命令包括:

这些命令将在第3章、第17章和第20章中详细讨论。

数据操作语言(DML)用于操作关系型数据库对象内部的数据。

3个基本DML命令是:

这些命令将在第5章中详细讨论。

虽然只具有一个命令,但数据查询语言(DQL)是现代关系型数据库用户最关注的部分,它的基本命令是SELECT。

这个命令具有很多选项和子句,用于构成对关系型数据库的查询。查询是对数据库进行的信息调查,一般通过程序界面或命令行提示符向数据库发出。无论是简单的还是复杂的查询,含糊的还是明确的查询,都可以轻松地实现。

这个命令将在第7章到第16章中充分介绍。

SQL里的数据控制语言用于控制对数据库里数据的访问。这些数据控制语言(DCL)命令通常用于创建与用户访问相关的对象,以及控制用户的权限。这些控制命令包括:

这些命令通常与其他命令组合在一起,在本书多个章节中都有介绍。

数据管理命令用于对数据库里的操作进行审计和分析,还有助于分析系统性能。常用的两个数据管理命令如下所示:

不要把数据管理与数据库管理混为一谈。数据库管理是对数据库的整体管理,它包括各级命令的使用。对于不同的SQL实现来说,数据管理与SQL语言的核心命令相比具有更明显的独特性。

除了前面介绍的几类命令,下面这些命令可以用于管理数据库事务。

COMMIT:保存数据库事务。

ROLLBACK:撤销数据库事务。

SAVEPOINT:在一组事务里创建标记点以用于回退(ROLLBACK)。

SET TRANSACTION:设置事务的名称。

事务命令将在第6章中详细讨论。

在继续讨论SQL基础知识之前,我们先来介绍一下本书后续课程中要使用的数据库。下面的小节会介绍所用的表,说明它们之间的关系、它们的结构,并展示其中包含的数据。

图1.4 展示了本书范例、测验和练习中所用的表的关系。每个表都有不同的名称、包含一些字段。图中的映射线表示了特定表之间通过共用字段(通常被称为主键)建立的联系。

图1.4 本书所用表之间的关系

像商业活动中的其他标准一样,表命名标准对于保持良好的控制也是非常重要的。从前面对于表和数据的介绍可以看出,每个表的名称都以_TBL 作为后缀,这种方式也是很多站点所采用的。后缀_TBL 说明这个对象是个表,而关系型数据库里存在着多种不同类型的对象。例如,在后续章节会出现后缀_INX,这说明对象是表的索引。命名标准几乎存在于整个机制之内,对任何关系型数据库的管理都起到了重要的辅助作用。需要说明的是,在命名数据库对象时,并不是一定要使用后缀。所谓的命名标准,只是为了在创建对象的时候有一定的准则可以用来遵循。读者可以根据自己的喜好来自由选择命名标准。

注意:不仅要遵循 SQL 实现的对象命名规则,还要符合本地商业规则,从而创建出具有描述性的、与业务数据相关联的名称。

下面将展示本书所用表里包含的数据。请花一些时间来研究这些数据,观察它们的区别,了解数据之间和表之间的关系。其中有些字段不是一定要包含数据,这是在创建表时指明的。

存储和维护有价值的数据是数据库存在的原因。前面的数据是用来解释本书中的SQL概念的,下面进一步详细介绍表里的元素。记住,表是数据存储的最常见和最简单的形式。

一、字段

每个表都可以分解为更小的项,这些项被称为“字段”。字段是表里的一列,用于保持每条记录的特定信息。表PRODUCTS_TBL里的字段包括PROD_ID、PROD_DESC和COST。这些字段对表中的信息进行分类保存。

二、记录或一行数据

记录,也被称为一行数据,是表里的各行。以表PRODUCTS_TBL为例,它的第一行记录如下所示:

很明显,这条记录由产品标识、产品描述和单价组成,对于每一种不同的产品,表PRODUCTS_TBL里都有一条相应的记录。

在关系型数据库的表里,一行数据是指一条完整的记录。

三、列

列是表里垂直的一项,包含表里特定字段的全部信息。举例来说,表 PRODUCTS_TBL里代表产品描述的一列包含以下内容:

这一列基于字段PROC_DESC,也就是产品描述。一列包含了表里每条记录中特定字段的全部信息。

四、主键

主键用于区分表里每一条数据行。表 PRODUCTS_TBL 里的主键是 PROD_ID,它通常是在表创建过程中初始化的。主键的特性确保了所有产品标识都是唯一的,也就是说表PRODUCTS_TBL里每条记录都具有不同的PROD_ID。主键避免了表中有重复的数据,并且还具有其他用途,具体介绍请见第3章。

五、NULL值

NULL是表示“没有值”的专用术语。如果表中某个字段的值是NULL,其表现形式就是字段为空,其值就是没有值。NULL并不等同于0或空格。值为NULL的字段在表创建过程中会保持为空。比如在表EMPLOYEE_TBL里,并不是每个雇员的姓名里都有中间名,其相应字段的值就是NULL。

后续两章将详细介绍表里的其他元素。

本书中的很多练习使用MySQL、Microsoft SQL Server和Oracle数据库来生成范例。这三种数据库都具有免费版本,可以自由选择一种来安装,以便完成本书所设置的练习。但是由于这三种数据库都不能与SQL-2008完全兼容,因此练习的结果可能会有一些细小的差别,不完全复合ANSI标准。不过,掌握了基本的ANSI标准以后,读者就可以在不同的数据库实现之间进行自由切换,以便解决大部分的问题了。

前面介绍了SQL标准语言,简要说明了其历史,粗略展示了这个标准在过去是如何进化的。另外还讨论了数据库系统和当今技术,包括关系型数据库、客户端/服务器系统、基于Web的系统,这些对于理解SQL都是非常重要的。还介绍了SQL语言的主要组件,说明了关系型数据库市场里有众多的厂商,当然也就有多种各具特色的SQL实现。虽然它们与ANSI SQL都略有不同,但大多数厂商都在一定范围内遵循当前标准(SQL-2008),后者维护了SQL的一致性,让SQL程序具有可移植性。

另外还介绍了本书所使用的数据库。从前面的内容可以看到,数据库由一些表组成,它们彼此有一定的关联;我们也看到此时表中包含的数据。本章还介绍了SQL的一些背景知识,展示了现代数据库的概念。在完成本章的练习之后,读者会信心十足地继续后面的课程。

问:如果要学习SQL,是不是可以使用SQL的任何一种实现呢?

答:是的,只要数据库的实现是兼容ANSI SQL的,我们就可以与之交互。如果实现并不是完全兼容的,我们只需要稍作调整即可。

问:在客户端/服务器环境里,个人计算机是客户端,还是服务器?

答:个人计算机被认为是客户端,但有时服务器也可以充当客户端的角色。

问:创建每一个表都必须使用_TBL作为名称后缀吗?

答:当然不是。使用_TBL 作为表名称后缀是我们所选择的一种命名方式,能够方便地标识出数据库里的表。当然还可以把 TBL 完整拼写为 TABLE,或是避免使用后缀,比如EMPLOYEE_TBL可以只命名为EMPLOYEE。

下面的内容包含一些测试问题和实战练习。这些测试问题的目的在于检验对学习内容的理解程度。实战练习是为了把学习的内容应用于实践,并且巩固对知识的掌握。在继续学习之前请先完成测试与练习,答案请见附录C。

1.缩写“SQL”的含义是什么?

2.SQL命令的6个主要类别是什么?

3.4个事务控制命令是什么?

4.对于数据库访问来说,客户端/服务器模型与Web技术之间的主要区别是什么?

5.如果一个字段被定义为NULL,这是否表示这个字段必须要输入某些内容?

1.说明下面的SQL命令分别属于哪个类别:

2.观察下面这个表,选出适合作为主键的列:

3.参考附录B,选择一种数据库实现,下载并安装好,为后面的练习做准备。

本章的重点包括:

事务的定义

用于控制事务的命令

事务命令的语法和范例

何时使用事务命令

低劣事务控制的后果

这一章将介绍数据库事务管理的概念。

事务是对数据库执行的一个操作单位。它是以逻辑顺序完成的工作单元或工作序列,无论是用户手工操作,还是由程序进行的自动操作。在使用SQL的关系型数据库里,事务是由第5章介绍的数据操作语言(DML)完成的。事务是对数据库所做的一个或多个修改,比如利用UPDATE语句对表里某个人的姓名进行修改时,就是在执行一个事务。

一个事务可以是一个或多个DML语句。在管理事务时,任何指定的事务(DML语句组)都必须作为一个整体来完成,否则其中任何一条语句都不会完成。

下面是事务的本质特征:

所有的事务都有开始和结束;

事务可以被保存或撤销;

如果事务在中途失败,事务中的任何部分都不会被记录到数据库。

事务控制是对关系型数据库管理系统(RDBMS)里可能发生的各种事务的管理能力。在谈及事务时,我们是指前一章所介绍的INSERT、UPDATE和DELETE命令。

注意:事务的启动或执行在各个实现中是不同的,详细情况请查看具体实现的文档。

当一个事务被执行并成功完成时,虽然从输出结果来看目标表已经被修改了,但实际上目标表并不是立即被修改。当事务成功完成时,利用事务控制命令最终认可这个事务,可以把事务所做的修改保存到数据库,也可以撤销事务所做的修改。

控制事务的命令有3个:

COMMIT;

ROLLBACK;

SAVEPOINT。

下面的小节将详细介绍这3个命令。

注意:什么时候可以使用事务

事务控制命令只与DML命令INSERT、UPDATE和DELETE配合使用,比如我们不会在创建表之后使用COMMIT语句,因为当表被创建之后,它会自动被提交给数据库。也不能使用 ROLLBACK 语句来恢复被撤销的表。此外,还有其他类似的语句,也是不能被撤销的,例如TRUNCATE语句。所以,在运行新的命令前,最好先确认一下用户所使用的RDBMS在事务方面的相关规定。当事务完成之后,事务信息被保存在数据库里的指定区域或临时回退区域。所有的修改都被保存到这个临时回退区域,直到事务控制命令出现。当事务控制命令出现时,所做的修改要么被保存到数据库,要么被放弃,然后临时回退区域被清空。图6.1展示了修改操作如何应用到关系型数据库。

图6.1 回退区域

COMMIT命令用于把事务所做的修改保存到数据库,它把上一个COMMIT或ROLLBACK命令之后的全部事务都保存到数据库。

这个命令的语法是:

关键字COMMIT是语法中唯一不可缺少的部分,其后是用于终止语句的字符或命令,具体内容取决于不同的实现。关键字WORK是个选项,其唯一作用是让命令对用户更加友好。

在下面这个范例里,我们首先从查询表PRODUCT_TMP里的全部数据开始:

接下来,删除表里所有价格低于$14.00的产品。

使用一个COMMIT语句把修改保存到数据库,完成这个事务。

对于数据库的大规模数据加载或撤销来说,应该多使用 COMMIT 语句;然而,过多的COMMIT语句会让工作需要大量额外时间才能完成。记住,全部修改都首先被送到临时回退区域,如果这个临时回退区域没有空间了,不能保存对数据库所做的修改,数据库很可能会挂起,禁止进一步的事务操作。

实际上,在提交了一条UPDATE、INSERT或DELETE语句之后,大部分RDBMS都是使用事务来进行后台处理的,一旦操作被取消或报错,所做的操作就可以被撤销。所以,在提交了一个事务之后,会有一系列操作来确保事务正常运行。在现实生活中,用户可能会在ATM上提交一个银行事务以便从自己的账户中取出现金。这时,就需要完成取钱和更新账户余额两项事务。很显然,我们希望这两项事务能够同时完成,或者全部失败。否则,系统数据的完整性就会受到影响。所以,在这个实例中,我们会将两项操作合并为一个事务,来确保对操作结果的控制。

注意:不同的实现对COMMIT命令的提交有所不同

在某些实现里,事务不是通过使用COMMIT命令提交的,而是由退出数据库的操作引发提交。但是在其他实现里,比如 MySQL ,在执行 SET TRANSACTION命令之后,在数据库收到COMMIT或ROLLBACK之前,自动提交功能是不会恢复的。此外,在Microsoft SQL Server中,除非事务正在运行,否则语句会被自动提交。所以,用户务必要了解所使用的RDBMS在事务处理和命令提交方面的相关规定。

ROLLBACK 命令用于撤销还没有被保存到数据库的命令,它只能用于撤销上一个COMMIT或ROLLBACK命令之后的事务。

ROLLBACK的语法如下所示:

与COMMIT命令一样的是,关键字WORK只是个选项。

在下面的范例里,首先选择表PRODUCTS_TMP里的全部记录,这是前一次删除14条记录之后所剩的数据。

接下来更新表,把标识为11235的产品价格修改为$39.99:

现在对表进行一个简单的查询,可以发现修改似乎已经生效了:

现在,执行ROLLBACK命令来撤销刚刚所做的修改:

最后,验证所做的修改并没有被提交到数据库:

保存点是事务过程中的一个逻辑点,我们可以把事务回退到这个点,而不必回退整个事务。

SAVEPOINT命令的语法如下:

这个命令就是在事务语句之间创建一个保存点。ROLLBACK 命令可以撤销一组事务操作,而保存点可以将大量事务操作划分为较小的、更易于管理的组。

Microsoft SQL Server的语法稍有不同。在SQL Server中,使用的是SAVE TRANSAC-TION,而不是SAVEPOINT,范例如下:

除此之外,SQL Server与其他数据库实现完全相同。

回退到保存点的命令语法如下:

在下面的范例里,我们要从表PORDUCTS_TMP表里删除剩余的数据,在进行每次删除之前都使用SAVEPOINT命令,这样就可以在任何时候利用ROLLBACK命令回退到任意一个保存点,从而把适当的数据恢复到原始状态:

注意:保存点的名称必须唯一

在相应的事务操作组里,保存点的名称必须是唯一的,但其名称可以与表或其他对象的名称相同,详细的命名规范请见具体实现的说明文档。保存点名称的设置属于个人喜好,它只被数据库开发人员用来管理事务操作组。

在三次删除操作完成之后,假设我们又改变了主意,决定回退到名为SP2的保存点。由于SP2是在第一次删除操作之后创建的,所以这样做会撤销最后两次删除操作:

现在查看表里的内容,可以发现只发生了第一次删除操作:

记住,ROLLBACK命令本身会回退到上一个COMMIT或ROLLBACK语句。由于我们还没有执行COMMIT命令,所以这时执行ROLLBACK命令会撤销全部删除命令,如下所示:

这个命令用于删除创建的保存点。在某个保存点被释放之后,就不能再利用ROLLBACK命令来撤销这个保存点之后的事务操作了。利用这个命令可以避免意外地回退到某个不再需要的保存点。

Microsoft SQL Server不支持RELEASE SAVEPOINT命令;在事务完成以后,所有的保存点会被自动删除。这个过程不必使用COMMIT或者 ROLLBACK命令。用户在自己的环境中创建事务时,需要牢记这一点。

这个命令用于初始化数据库事务,可以指定事务的特性。举例来说,我们可以指定事务是只读的或是可以读写的,如下所示:

READ WRITE用于对数据库进行查询和操作数据的事务,READ ONLY用于只进行查询的事务。READ ONLY很适合生成报告,而且能够提高事务完成的速度。如果事务是READ WRITE类型的,数据库必须对数据库对象进行加锁,从而在多个事务同时发生时保持数据完整性。如果事务是READ ONLY,数据库就不会建立锁定,这样就会提高事务的性能。

事务还可以设置其他特性,但超出了本书的讨论范围。MySQL 通过对事务实现不同级别的隔离来实现类似功能,但语法略有不同。详细情况请参考具体实现的帮助文档。

低劣的事务控制会降低数据库性能,甚至导致数据库异常终止。反复出现的数据库性能恶化可能是由于在大量插入、更新或删除中缺少事务控制。大规模批处理还会导致临时存储的回退信息不断膨胀,直到出现COMMIT或ROLLBACK命令。

当出现 COMMIT 命令时,回退事务信息被写入到目标表里,临时存储区域里的回退信息被清除。当出现ROLLBACK命令时,修改不会作用于数据库,而临时存储区域里的回退信息被清除。如果一直没有出现COMMIT或ROLLBACK命令,临时存储区域里的回退信息就会不断增长,直到没有剩余空间,导致数据库停止全部进程,直到空间被释放。虽然存储空间的使用实际上是由数据库管理员(DBA)控制的,但缺少事务控制还是会导致数据库处理停止,有时迫使DBA采取的行动会中止正在运行的用户进程。

这一章通过介绍3个事务控制命令(COMMIT、ROLLBACK和SAVEPOINT)展示了事务管理的初步概念。COMMIT用于把事务保存到数据库,ROLLBACK用于撤销已经执行的事务,而SAVEPOINT用于把事务划分为组,让我们可以回退到事务过程中特定的逻辑位置。

在运行大规模事务操作时,应该经常使用 COMMIT 和 ROLLBACK 命令来保证数据库具有足够的剩余空间。另外还要记住,这些事务命令只用于3个DML命令:INSERT、UPDATE和DELETE。

问:每个INSERT语句是否都需要执行一个COMMIT?

答:不,绝对不需要。如果要向表里插入几十万条记录,建议每 5 000~10 000条记录执行一个COMMIT语句,具体数值取决于临时回退区域的大小(向数据库管理员寻求建议)。当回退区域没有空间时,数据库可能停止或工作不正常。

问:ROLLBACK命令如何撤销一个事务?

答:ROLLBACK命令清除回退区域里的全部修改。

问:在执行事务过程中,如果99%的事务都完成了,但另外1%出现了错误,能否只重做出现错误的部分呢?

答:不能,整个事务必须是成功的,否则数据完整性就会遭到破坏。

问:在执行COMMIT语句之后,事务操作的效果就是永久的了,但使用UPDATE命令不是能够修改数据吗?

答:“永久”一词在此是表示它现在是数据库的一部分了。UPDATE 语句当然一直都可以用于修改数据。

下面的内容包含一些测试问题和实战练习。这些测试问题的目的在于检验对学习内容的理解程度。实战练习是为了把学习的内容应用于实践,并且巩固对知识的掌握。在继续学习之前请先完成测试与练习,答案请见附录C。

1.判断正误:如果提交了一些事务,还有一些事务没有提交,这时执行ROLLBACK命令,同一过程里的全部事务都会被撤销。

2.判断正误:SAVEPOINT命令会把一定数量已执行事务之后的事务保存起来。

3.简要叙述下面每个命令的作用:COMMIT、ROLLBACK和SAVEPOINT。

4.在Microsoft SQL Server中执行事务有什么不同点?

5.使用事务进行操作的实质是什么?

1.执行如下事务,并且在第 3 个事务之后创建一个保存点或者一个保存事务,然后在最后执行一条ROLLBACK命令。请说明上述操作完成之后,表CUSTOMER_TBL的内容。

2.执行如下事务,在第3个事务之后创建一个保存点。

事务执行完之后添加一条COMMIT命令,之后再加上一条回退到保存点的ROLLBACK命令,这时会发生什么呢?

相关图书

SQL实践教程(第10版)
SQL实践教程(第10版)
SQL初学教程(第3版)
SQL初学教程(第3版)
SQL学习指南(第3版)
SQL学习指南(第3版)
SQL入门经典(第6版)
SQL入门经典(第6版)
SQL优化核心思想
SQL优化核心思想
SQL初学者指南(第2版)
SQL初学者指南(第2版)

相关文章

相关课程