本章介绍隐藏在关系数据库后面的数学原理.这些内容并不是学习所必要的, 因此如果如果你陷在这里或者想直接获取一些简单的例子, 请随意跳到下一章阅读,并且当你有更多的时间和耐心后, 随时欢迎回过头阅读这一章.我们认为这些内容是非常有趣的.
本章最早是 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)公布了数据库委员会宪章(DatabaseCommittee)X3H2, 建议发展一种标准的关系语言。 这个建议在 1986 年被批准并且认为实际上就是 IBM 版本的 SQL。在 1987 年,这个ANSI 标准也被国际标准化组织 (ISO)接受为国际标准。这个最初的 SQL 版本的标准经常非正式的被称为 "SQL/86". 到了 1989 年,对那个最初的标准进行了扩展, 并且这个新的标准被经常地非正式的称为"SQL/89"。 同样在 1989 年,一个相关的标准,发展了称之为 数据库语言嵌入SQL (Database LanguageEmbedded SQL) (ESQL)。
ISO 和 ANSI 委员会已经在一个大大地扩展了最初的标准的新版本的定义上工作了好几年, 常被非正式的称之为 SQL2 和 SQL/92 。这个版本成为一个批准了的标准 - "International Standard ISO/IEC 9075:1992, Database Language SQL - 在1992 年晚些时候。 SQL/92 通常是人们说 "SQL标准" 时所指的版本。在 Date and Darwen, 1997里有 SQL/92 详细的描述。在我们写作这份文档的时候, 一个非正式地称为 SQL3 新的标准正在制订。这个新的标准准备把 SQL 变成一种旋转完整(Turing-complete)的语言,也就是说,所有可计算的查询 (例如,递归查询)都将是可能的。 这是一个非常复杂的任务,因而新标准的完成不会在 1999 年以前。
如上所述,SQL 是一种关系语言。 那意味着它是基于 E.F. Codd 在 1970 年首次发表的 关系数据模型的完叶。 我们将在稍后给出关系模型的正式描述(在 关系数据模型公式 里),不过在这之前让我们先用一个更直观的视角看看这个模型。
一个关系数据库是被其用户看作 表集合(而且除表之外没有其他东西)的这么 一个东西。一个表由行和列组成,每行代表一条记录, 每列代表一个包含在表里面的记录的属性。 供应商和部件数据库 演示了一个由三个表组成的数据库:
SUPPLIER 是存储供应商数字(SNO),名称(SNAME)和城市(CITY)的表。
PART 是存储部件的数字(PNO)名称(PNAME)和价格(PRICE)的表。
SELLS 存储关于某个供应商(SNO)销售的部件(PNO)的信息。 它是联接其他两个表的结点。
Example 1-1. 供应商和部件数据库
SUPPLIER: SELLS: SNO | SNAME | CITY 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: 4 | 3 PNO | PNAME | PRICE 4 | 4 ----+---------+--------- 1 | Screw | 10 2 | Nut | 8 3 | Bolt | 15 4 | Cam | 25
PART 和 SUPPLIER 可以看作不同的 实体而 SELLS可以看作是特定部件和特定供应商之间的一种 关系。
如我们稍后将看到的,SQL 对表进行操作,就象我们刚才定义的那样,不过在这之前, 我们将先学习关系模型的理论。