第一部分 SQL概念综述

04-13Ctrl+D 收藏本站

关灯 直达底部

第1章 欢迎来到SQL世界

第1章 欢迎来到SQL世界

本章的重点包括:

SQL历史简介

介绍数据库管理系统

一些基本术语和概念

介绍本书所使用的数据库

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

1.1 SQL定义及历史

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

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

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

1.1.1 什么是SQL

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

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

1.1.2 什么是ANSI SQL

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

1.1.3 新标准: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.4 什么是数据库

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

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

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

图1.1 数据库

1.1.5 关系型数据库

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

图1.2 关系型数据库

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

1.1.6 客户端/服务器技术

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

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

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

图1.3 客户端/服务器模型

1.1.7 基于Web的数据库系统

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

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

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

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

1.1.8 主流数据库厂商

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

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

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

1.2 SQL会话

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

1.2.1 CONNECT

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

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

1.2.2 DISCONNECT和EXIT

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

1.3 SQL命令的类型

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

主要的分类包括:

数据定义语言(DDL);

数据操作语言(DML);

数据查询语言(DQL);

数据控制语言(DCL);

数据管理命令;

事务控制命令。

1.3.1 定义数据库结构

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

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

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

1.3.2 操作数据

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

3个基本DML命令是:

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

1.3.3 选择数据

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

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

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

1.3.4 数据控制语言

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

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

1.3.5 数据管理命令

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

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

1.3.6 事务控制命令

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

COMMIT:保存数据库事务。

ROLLBACK:撤销数据库事务。

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

SET TRANSACTION:设置事务的名称。

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

1.4 本书使用的数据库

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

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

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

1.4.1 表命名标准

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

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

1.4.2 数据一瞥

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

1.4.3 表的构成

存储和维护有价值的数据是数据库存在的原因。前面的数据是用来解释本书中的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。

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

1.4.4 范例和练习

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

1.5 小结

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

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

1.6 问与答

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

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

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

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

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

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

1.7 实践

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

1.7.1 测验

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

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

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

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

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

1.7.2 练习

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

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

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