第六十九章. SQL

内容
关系数据模型
关系数据模型公式
在关系数据模型上的操作
SQL 语言
本章介绍隐藏在关系数据库后面的数学原理.这些内容并不是学习所必要的,因此如果如果你陷在这里或者想直接获取一些简单的例子,请随意跳到下一章阅读,并且当你有更多的时间和耐心后,随时欢迎回过头阅读这一章.我们认为这些内容是非常有趣的.

本章最初出现在 Stefan Simkovics 的硕士论文的一部分里(Simkovics, 1998)。

SQL 已经成为了最流行的关系查询语言。SQL”的名称是Structured Query Language(结构化查询语言)的缩写。在 1974 年,Donald Chamberlin 和其他人在 IBM 的研究所定义了语言 SEQUEL (Structured English Query Language)(结构化英语查询语言)。这种语言在 1974-75 年首先在一种叫 SEUEL-XRM 的 IBM 的原型里面实现。到了 1976-77 年,定义了一种叫 SEQUEL/2 的 SEQUEL 改进版,并且名称也因此改成 SQL

在 1977 年,IBM 开发了一种新的叫 System R 的原型语言。 System R 实现了 SEQUEL/2 (现在的 SQL)的很大一部分子集,并且在项目过程中对SQL 做了许多修改。System R 被安装到了许多用户节点上,包括 IBM 的节点和许多经过选择的客户节点上。多亏了在 System R 那些用户节点上的成功,IBM 开始开发基于 System R 技术的 SQL 语言的商业产品。

再过了一年,IBM 和许多其他提供商宣布了许多 SQL 产品,例如 SQL/DS(IBM),DB2(IBM),ORACLE(Oracle Corp.),DG/SQL(Data General Corp.),和 SYBASE (Sybase Inc.)。

SQL 现在还是一个官方标准。在 1982 年,美国国家标准局(ANSI)公布了数据库委员会宪章(Database Committee)X3H2,建议发展一种标准的关系语言。这个建议在 1986 年被批准并且考虑了实际上是 IBM 版本的 SQL。在 1987 年,这个ANSI 标准也被国际标准化组织(ISO)接受为国际标准。这个最初的SQL 版本的标准经常非正式的被称为"SQL/86"。到了 1989 年,那个最初的标准被扩展了,并且这个新的标准被经常地非正式的称为 "SQL/89"。同样在 1989 年,一个相关的标准,发展了称之为数据库语言嵌入SQL (Database Language Embedded SQL)(ESQL)。

ISO 和 ANSI 委员会已经在一个大大地扩展了最初的标准的新版本的定义上工作了好几年,常被非正式的称之为SQL2 或 SQL/92。这个版本成为一个批准了的标准 - "International Standard ISO/IEC 9075:1992, Database Language SQL" - 在1992 年晚些时候。SQL/92 是人们常说的 "SQL 标准" 时所指的版本。SQL/92 的详细描述在 Date and Darwen, 1997 里给出。在我们写作这份文档的时候,一个非正式地称为SQL3的新的标准正在制订。这个新的标准准备把SQL 变成一种旋转完成(Turing-complete)语言,也就是说,所有可计算的查询(例如,递归查询)都将是可能的。这是一个非常复杂的任务,因而新标准的完成不会在 1999 年以前。

关系数据模型

如上所述,SQL 是一种关系语言。那意味着它是基于 E.F. Codd 在 1970 年首次发表的关系数据模型。我们将在稍后给出关系模型的正式描述(在 关系数据模型公式里),不过我们先用一个更直观的视角看看这个模型。

一个关系数据库是被其用户看作一个表的集合的数据库(而且除表之外没有其他东西)。一个表由行和列组成,每行代表一条记录,每列代表一个包含在表里面的记录的属性。供应商和部件数据库 演示了一个由三个表组成的数据库:

例 69-1. 供应商和部件数据库
   SUPPLIER   SNO |  SNAME  |  CITY      SELLS   SNO | PNO

             -----+---------+--------           -----+-----
               1  |  Smith  | London              1  |  1
               2  |  Jones  | Paris               1  |  2
               3  |  Adams  | Vienna              2  |  4
               4  |  Blake  | Rome                3  |  1
                                                  3  |  3
                                                  4  |  2
   PART       PNO |  PNAME  |  PRICE              4  |  3 
             -----+---------+---------            4  |  4
               1  |  Screw  |   10
               2  |  Nut    |    8
               3  |  Bolt   |   15
               4  |  Cam    |   25
表 PART 和 SUPPLIER 可以看作不同的实体而 SELLS 可以看作是一种特定部件和特定供应商之间的关系

如我们稍后将看到的,SQL 对表进行操作,就象我们刚才定义的那样,不过在这之前,我们将先学习关系模型的理论。