↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.1 / 7.0 / 6.5
历史版本。 PostgreSQL 7.0 已结束支持。 请参阅 当前版本手册.

第 69 章 SQL

摘要

本章介绍关系数据库背后的数学概念。这不是必读内容,所以如果你觉得陷入困境,或者想直接看一些简单的例子,尽管跳到下一章,等有了更多时间和耐心时再回来。这些内容本来就应该是有趣的!

这些材料最初是 Stefan Simkovics 的硕士论文( Simkovics, 1998 )的一部分。

SQL 已成为最流行的关系查询语言。名称 "SQL" 是 Structured Query Language(结构化查询语言)的缩写。1974 年,Donald Chamberlin 等人在 IBM 研究院定义了语言 SEQUEL(Structured English Query Language,结构化英语查询语言)。该语言于 1974-75 年首次在一个名为 SEQUEL-XRM 的 IBM 原型中实现。1976-77 年定义了修订版 SEQUEL,称为 SEQUEL/2,随后名称改为 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)授权其数据库委员会 X3H2 制定标准关系语言的提案。该提案于 1986 年获得批准,本质上由 SQL 的 IBM 方言构成。1987 年,这一 ANSI 标准又被国际标准化组织(ISO)接受为国际标准。这一最初的标准版本的 SQL 常被非正式地称为 "SQL/86"。1989 年,原始标准得到扩展,这一新标准同样常被非正式地称为 "SQL/89"。同样在 1989 年,还制定了一个相关标准,称为 Database Language Embedded SQL(ESQL,数据库语言嵌入式 SQL)。

ISO 和 ANSI 委员会多年来一直在定义一个大幅扩展的原始标准版本,它被非正式地称为 SQL2 或 SQL/92。该版本于 1992 年底成为批准的标准——"International Standard ISO/IEC 9075:1992, Database Language SQL"。当人们提到"the SQL standard"(SQL 标准)时,通常指的就是 SQL/92。SQL/92 的详细描述见 Date and Darwen, 1997 。在撰写本文时,一个被非正式地称为 SQL3 的新标准正在制定中。计划让 SQL 成为图灵完备的语言,即所有可计算的查询(例如递归查询)都将成为可能。这是一项非常复杂的任务,因此新标准的完成不会早于 1999 年。

69.1. 关系数据模型 #

如前所述,SQL 是一种关系语言。也就是说,它基于 E.F. Codd 于 1970 年首次发表的关系数据模型。我们稍后(在关系数据模型的形式化定义 [原文引用目标缺失] [查看原文章节]中)给出关系模型的形式化描述,但首先我们想从更直观的角度看一看它。

关系数据库是这样一种数据库:在它的用户看来,它是一个表的集合(而且除了表之外没有别的东西)。表由行和列组成,每一行代表一条记录,每一列代表表中记录的一个属性。供应商与零件数据库 [原文引用目标缺失] [查看原文章节]展示了一个由三张表组成的数据库示例:

  • SUPPLIER 是一张存储供应商编号(SNO)、名称(SNAME)和所在城市(CITY)的表。

  • PART 是一张存储零件编号(PNO)、名称(PNAME)和价格(PRICE)的表。

  • SELLS 存储哪个供应商(SNO)销售哪个零件(PNO)的信息。在某种意义上,它起着把另外两张表连接起来的作用。

例 69.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 就是在刚才定义的这类表上操作的,但在此之前,我们先学习关系模型的理论。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.

历史原文引用 (2)

此原始版本缺少部分引用目标。正文已标明这些引用,下列清单保留原始地址。

  • ch69s02.html#FORMAL-NOTION
  • sql.html#SUPPLIER-FIG