<< Back to man.ChinaUnix.net

Next Previous Contents

28. 文件和参考书

28.1 用户指引和说明书

PostgreSQL 发行版本中已包括以下各项的 postscript、HTML 格式 和 unix man-pages。它们在 /usr/doc/postgresql* 目录中。如果你能上网, 你可在以下地方找到下列文件︰ http://www.postgresql.org/docs

28.2 线上文件

28.3 有用的参考书

还有数以百计有关 SQL 的书!到书店看看吧。

28.4 ANSI/ISO SQL 规格文件 SQL 1992, SQL 1998

ANSI/ISO SQL 规格文件可在下列网站找到︰

28.5 ANSI/ISO SQL 1992 的语法

请参阅本文件的附录甲 附录甲

28.6 ANSI/ISO SQL 1998 的语法

SQL 1998 (SQL 3) 规格仍在开发中。参看本文件的“电子途径取得 SQL3 草案” SQL 1998

28.7 初学者 SQL 导引

参看本文附录乙 Appendix B

28.8 SQL92 的时态延伸 (Temporal Extension)

这目录中包括一个 SQL-92 语言规格的时态延伸。这种新语言被名为 TSQL2。

这里的语言规格是这语言的最终版本。

可直接联络 TSQL2 设计委员会的主席︰Richard T.Snodgrass, Department of Computer Science, University of Arizona, Tucson, AZ 85721,

TSQL2 Language Design Committee 的电邮地址和入会详情可在语言规格最后的 一章找到。

这目录中的内容如下。

spec.dvi,.ps TSQL2 语言规格,一九九四年九月出版

bookspec.ps TSQL2 语言规格,内容如在 TSQL2 的书般,一九九五年十月 出版(请参阅下文)

sql3 提交给 ANSI 和 ISO SQL3 筹委会的修订建议

和语言规格一起,这里还收集了一些有关设计上的决定的评论、提供例子、 和研究如何实践这语言。这些评论原本是给 TSQL2 Language Design Committee 的建议。它们现在有另一个用处︰提供有关 TSQL2 构造的例子、 推动设计时作出的大量决定、比较 TSQL2 和过去十五年有人提议过的大量语言。 必须强调,请些评论目前不是 TSQL2 语言规格的一部分,而是对它的补充和发展。 这语言规格已是 TSQL2 的最终决定。

这些评论,加上语言规格、数个索引和其他支持材料,已经集结成书︰

Snodgrass, R.T., editor, The TSQL2 Temporal Query Language, Kluwer Academic Publishers, 1995, 674+xxiv 页。

书中有一个节录了的评价,完整的评价在此目录中的 eval.ps 提供。

tl2tsql2.pl 档是一个把获接受的时态逻辑 (temporal logic) 翻译为 TSQL2 的 prolog 程序。这程序由 Michael Boehlen 写成。

各位可接触他以取得一份解释这翻译过程的论文。这是这程序的旧版本。新版本在 (the TimeDB and Tiger systems).

28.9 第零部分 取得 ISO/ANSI SQL 文件

这文章说明如何(合法地)取得一份 SQL-92 标准和怎样取得一份“现时的”SQL3 草案。

这标准版权所有, ANSI 标准的持有人为 ANSI,ISO 标准的持有人为 ISO。

现时有两(2)个 SQL 标准,分别由 ANSI 和 ISO 出版。这两份标准每个字都一模一样, 除了一些小节,如文件标题、页首、短句“International Standard”和“American Standard”之类。

购买 SQL-92 标准

The ISO standard, ISO/IEC 9075:1992, Information Technology - Database Languages - SQL,目前(一九九三年三月)在 ANSI 有存货及可得到︰

     American National Standards Institute
     1430 Broadway
     New York, NY 10018 (USA)
     Phone (sales): +1.212.642.4900
价钱 US$230.00。ANSI 版,ANSI X3.135-1992, American National Standard for Information Systems - Database Language SQL,目前并无存货, 但应该可在一九九三年三月下旬至五月上旬间得到。估计它的价钱是 US$225.00。

如果你从 ANSI 购买任何一份文件,你需要给 7% 的手续费(即大约 US$9.10)。海外邮寄肯定会更贵。ANSI 要求所有单据都伴随一份公司订单的复印本, 或者你可以美元寄一张美国的银行的支票,他们会在结了账后寄给你。 (例外情况︰如果你的组织是 ANSI 的公司会员 (corporate member),ANSI 会把文件寄给你而向公司收钱。)

在美国国外,ISO 标准也可从作为 ISO (International Organization for Standardization) 或 IEC (International Electrotechnical Commission) 会员的本土国营机构(国家的标准组织)购买。国营机构及其地址的名单可从 ANSI 或其他国营机构取得。它们也可从 ISO 得到︰

     International Organization for Standardization
     Central Secretariat
     1, rue de Varembi
     CH-1211 Genhve 20
     Switzerland
如果你想以更方便快捷的方法订购这标准,你需要附出代价。你可从以下组织以 US$308.00 订购 ISO/IEC 9075:1992, Information Technology - Database Languages - SQL︰
     Global Engineering Documents
     2805 McGaw Ave
     Irvine, CA 92714 (USA)
     USA
     Phone (works from anywhere): +1.714.261.1455
     Phone (only in the USA): (800)854-7179
我不知道这是否包括货运费,但我估计(起码)国际货运会额外收费。 他们会颇为快捷地把文件寄给你,甚至会接受“主要的信用卡”。Global 还没有 ANSI 版,或他们没有价钱或估计时间(但我预计它会在 ANSI 出版后数周之内出现,价钱接近 US$300.00)。

购买一份 SQL3 草案 (Working Draft)

你可从 ANSI X3 Secretariat, CBEMA (Computer and Business Equipment Manufacturers Association) 购买一份 SQL3 草案的复印本。他们意图确保能提供“最近”版本的 SQL3 草案,并以 US$60.00 至 US$65.00 出售。你可以以下途径接触 CBEMA。

     CBEMA, X3 Secretariat
     Attn: Lynn Barra
     1250 Eye St.
     Suite 200
     Washington, DC 20005 (USA)
Lynn Barra 也可以电话号码 +1.202.626.5738 接触以要求一份,不过邮寄似乎较有礼貌。

电子径取得 SQL3 草案

最新版本(以写本文时为准)的 SQL3(ANSI 和 ISO)草案(和所有附件) 可在以下站台以“anonymous ftp”或“ftpmail”得到︰

     gatekeeper.dec.com

  在

     /pub/standards/sql/
这目录中有多个文档,包括 PostScript 档和纯文字档(格式不很美观, 但可在萤幕上无须特别软件阅读)。

一般来说,你可找到类似名称的文档︰

     sql-bindings-mar94.ps
     sql-bindings-mar94.txt
     sql-cli-mar94.ps
     sql-cli-mar94.txt
     sql-foundation-mar94.ps
     sql-foundation-mar94.txt
     sql-framework-mar94.ps
     sql-framework-mar94.txt
     sql-psm-mar94.ps
     sql-psm-mar94.txt
完成新版本的文件后,“mar94”会改变来说明新的出版日期(例如“aug94”是估计在 “mar94”之后的版本)。

另外,为照顾不能从 FTP 取得文档名单的读者,我们在目录中放置了一个名为

     ls
的文档。这文档(神奇!)包括了目录内的文档名单。

从 Ftp 直接获得文档

这是使用 FTP 的例子。它特别说明如何连接到 gatekeeper.dec.com, 到达放置这些文档的目录,及把文档传送到你的电脑。要注意的的电脑要有上网功能。 签入名称是?ftp',密码则是你的电邮地址(即所谓?anonymous ftp')。指令?type binary'是用来确保收到的文档中没有位元被截去。?get'一次取得一个文档。 在命令稿 (script) 中的注解会在角括号内 < 即是如此 >。

  % ftp gatekeeper.dec.com
  Connected to gatekeeper.dec.com.
  220- *** /etc/motd.ftp ***
       Gatekeeper.DEC.COM is an unsupported service of DEC Corporate Research.
       <…等一会…>
  220 gatekeeper.dec.com FTP server (Version 5.83 Sat ... 1992) ready.
  Name (gatekeeper.dec.com:<你的登入名称>): ftp  <anonymous 也可>
  331 Guest login ok, send ident as password.
  Password: <键入你的电邮地址>
  230 Guest login ok, access restrictions apply.
  Remote system type is UNIX.  <什么也没所谓>
  Using binary mode to transfer files.
  ftp> cd pub/standards/sql
  250 CWD command successful.
  ftp> dir
  200 PORT command successful.
  150 Opening ASCII mode data connection for /bin/ls.
  total 9529
  -r--r--r--  1 root     system     357782 Feb 25 10:18 x3h2-93-081.ps
  -r--r--r--  1 root     system     158782 Feb 25 10:19 x3h2-93-081.txt
  -r--r--r--  1 root     system     195202 Feb 25 10:20 x3h2-93-082.ps
  -r--r--r--  1 root     system      90900 Feb 25 10:20 x3h2-93-082.txt
  -r--r--r--  1 root     system    5856284 Feb 25 09:55 x3h2-93-091.ps
  -r--r--r--  1 root     system    3043687 Feb 25 09:57 x3h2-93-091.txt
  226 Transfer complete.
  ftp> type binary
  200 Type set to I.
  ftp> get x3h2-93-082.txt
  200 PORT command successful.
  150 Opening BINARY mode data connection for x3h2-93-082.txt (90900 bytes).
  226 Transfer complete.
  90900 bytes received in 0.53 seconds (166.11 Kbytes/s)
  ftp> quit
  % <这文档已成为你的电脑中的 x3h2-93-082.txt>
没有 ftp 支持的情况下取得文档

Digital Equipment Corporation 和数间其他公司相似,提供 ftp email 服务。它可能需要数天才有回应,但它为不能直接上网的人提供了等同 ftp 的服务。伺服器的地址为︰

ftpmail@decwrl.dec.com

以下命令稿会取得最新版本的 SQL3 文件的 PostScript 版︰

     reply joe.programmer@imaginary-corp.com
     connect gatekeeper.dec.com anonymous
     binary
     compress
     uuencode
     chdir /pub/standards/sql
     get x3h2-93-091.ps
     quit
第一句指令告诉伺服器要把文档传给你,你需要把 “joe.programmer@imaginary-corp.com”换为你的电邮地址。这例子中的文档 x3h2-93-091.ps 会以 uuencode 了的 compress 档格式,分成三十四封电邮回覆。 如果你的环境没有提供重组文档的工具,你需要用下列命令稿以纯文字模式取得文档︰
     reply joe.programmer@imaginary-corp.com
     connect gatekeeper.dec.com anonymous
     chdir /pub/standards/sql
     get x3h2-93-091.ps
     quit
但请注意,这 .ps 档大概会被分为超过七十份来回覆!

要取得任何不是 x3h2-93-091.ps 的文档,只需把“x3h2-93-091.ps” 换为你想要的文档的名称。要取得所有文档的名单,把“x3h2-93-091.ps”换为 “dir”。

28.10 第一部分 ISO/ANSI SQL 当前情况

这章是有关 SQL 标准和其当前情况的资料来源。

当前情况︰

目前正在进行开发工作,以改进 SQL 为为计算上完整的语言 (computationally complete language),以可用于持久、复杂的物件。这包括︰一般化和专门化等级 (generalization and specialization hierarchies)、多级继承 (multiple inheritance)、自订资料形态、激发 (triggers) 和判断 (assertions)、知识库系统支持 (support for knowledge based systems)、回递查询式 (recursive query expression) 和附加资料管理工具。它也包括抽象资料型态 (ADTs)、物件识别字 (object identifiers)、方法 (methods)、继承 (inheritance)、多型 (polymorphism)、包装 (encapsulation)、 和所有其他与物件资料管理有关的功能的规格。

一九九六年秋季,SQL3 数个部分进行了一次 ISO CD 不记名投票。这数部分是 SQL/Framework、SQL/Foundation 和 SQL/Bindings。一如所料, 投票结果是在收到约九百个评论下遭否决。一月下旬举行了一次 ISO DBL 编辑会议 (editing meeting),处理了大量在评论中提及或另外提交的问题解决方法。 由于该次会议未能处理所有评论,会议将会延长。 编辑会议定于一九九七年七月在伦敦完成。

据估计,在七月的编辑会议之后,会再提出对有关哪些部分的 SQL 进行最后的 CD 投票。最后 CD 过程会花大约六个月,之后会有 DBL 编辑会议、DIS 投票和快捷的 IS 投票。

ISO 的程序在 SQL/92 之后改变了,所以 SQL 委员会仍在摸索这过程的详情。

如果事事顺利,SQL3 的这些部分会在 1998 年后期成为官方 ISO/IEC 标准,不过时间非常紧迫。

在一九九三年,ANSI 和 ISO 开发委员会决定把之后的 SQL 发展分为多部分的标准。这些部分包括︰

在美国,SQL3 的整体同时当作 ANSI 本土 (Domestic, "D") 专案和 ISO 专案处理。目前估计完成时间是一九九九年。

SQL/CLI 和 SQL/PSM 现正以最高速度处理,以作为 SQL-92 的修订。在美国, 它们只被当作国际 (International, "I") 专案处理。 SQL/CLI 在一九九五年完成了。SQL/PSM 应该会在 1996 年未段完成。

除了 SQL3 外,还有一些附加的计划︰

标准委员会和过程 (Standards Committee and Process)

事实上,世上有多个 SQL 标准委员会。ISO 有一部分是一个国际 SQL 标准小组。多个国家都有以 SQL 为重点的委员会。这些国家(通常)派出代表参与 ISO/IEC JTC1/SC 21/WG3 DBL 会议。主动参与 ISO SQL 标准制定的国家是︰

NIST 确认 (NIST Validation)

在美国,SQL 实践的确认工作由 National Institute of Standards and Training (NIST) 进行。NIST 目前有一套入门级 (entry level) SQL-92 的测试套件。NIST 确认要求的详情被定义为一项 Federal Information Processing Standard (FIPS)。目前对 SQL 的要求定义于 FIPS 127-2。本文件的 Postscript 和文字模式可从 NIST 取得。目前通过 SQL 确认的产品名单也可在 NIST 取得。

标准 SQL 刊物和文件 (Standard SQL Publications and Articles)

SQL 标准有两个版本。两个都可从 ANSI 取得︰

除封面和对其他标准的参考外,SQL 标准的两个版本完全一样。 两个版本都可从以下地方取得︰

     American National Standards Institute
     1430 Broadway
     New York, NY 10018
     USA
     Phone (sales): +1.212.642.4900
除 SQL-92 标准外,现在还有一份技术正误表 (Technical Corrigendum) (除错)︰
   * Technical Corrigendum 1:1994 to ISO/IEC 9075:1992
TC 1 应该可从 ANSI 取得。TC 1 只有 ISO 版本  它适用于 ISO 和 ANSI 版本的 SQL-92。

除标准外,也有关于 1992 SQL 标准的书。这些书提供一个比实际标准易理解的描述。

有关的标准

SQL 社群也对多个其他标准有兴趣。这节包括一些有关这些努力的指针。 当更多资料在网上出现后,这个名单也会更长。

28.11 第二部分 ISO/ANSI SQL 基金 (ISO/ANSI SQL Foundation)

SQL3 努力的一个重要部分在 SQL 基金文件中︰

对物件导向能力有数个先决要求︰

这些能力已定义为 SQL/PSM 的一部分

现在有大量工作于炼制 SQL-3 物件模型,使它和 ODMG 提出的物件模型看齐。这努力在 X3H2 和 ISO DBL 文章中描述过︰容纳 SQL3 和 ODMG。在 SQL3/OQL Merger 最近的更新版也可得到。

SQL3 时间表

有关 SQL3 的工作正在进行,但最终标准还有待数年后才出现。

ANSI 版的标准的编排也差不多。

28.12 第三部分 ISO/ANSI SQL 呼叫级界面 (Call Level Interface)

SQL/CLI 是一种对 SQL 资料库的呼叫级界面。它设计为支持包裹 (shrink-wrapped) 的应用程序。CLI 原本由 SQL Access Group (SAG) 的一个小组委员会创造。 SAG/CLI 规格在 1992 年以微软 Open DataBase Connectivity (ODBC) 规格公布。一九九三年, SAG 把 CLI 提交到 ANSI 和 ISO SQL 委员会中。(SQL Access Group 现已结合到 X/Open consortium 中。)

SQL/CLI 提供了以下事项的国际标准︰

SQL/CLI 时间表

对标准的开发过程,SQL/CLI 正以惊人的速度处理中。

28.13 第四部分  ISO/ANSI SQL 持久储存模块 (Persistent Stored Modules)

SQL/PSM 籍以下功能扩充 SQL︰

除作为有价值的应用程序开发工具,SQL/PSM 为 SQL3 提供了物件导向能力的基础支持。

复句和内存程序

复句和内存程序为主从环境提供多种好处︰

程序语言延伸

程序语言籍流向控制和其他编程技巧为 SQL 加上传统程序语言的功能。

流向控制语句

程序语言延伸还包括其他编程技巧︰

此外,所有传统 SQL 语言都可包含在多句的程序中。

外部函数与程序呼叫

一个经常在大量资料库产品的 wish lists 中出现,而有部分实践到的特色, 是呼叫用者所写,在资料库软件外的程序。

这功能的好处是它让资料库(因此包括资料库应用程序)使用丰富的程序和函数, 丰富得不能由一个标准组织定出。

SQL/PSM 时间表

SQL/PSM 发展迅速︰

28.14 第五部分  ISO/ANSI SQL/结合 (Bindings)

为方便参考,程序语言的结合被抽出成独立的文件。目前的版本即是 SQL-92 的动态和嵌入结合 (dynamic and embedded bindings) 的节录。

程序语言结合仍有不同的问题有待解决。

对传统程序语言来说,资料型态和 SQL-92 的可以互相对应。不过, SQL 物件和程序语言变数之间的对应必须定义。

对物件导向语言来说,目前的 SQL 资料型态、SQL 物件模型和物件导向程序语言之间的对应关系必须定义。

物件模型需在公开这些之前稳定下来。

语言结合完成时会成为 SQL3 的一部分。

28.15 第六部分 ISO/ANSI SQL XA 界面专门化 (SQL/XA)

这规格会为总交易管理员 (global Transaction Manager) 和 SQL 资源管理员 (SQL Resource Manager) 之间应用程序界面 (API) 提供标准。它会根据 ISO/IEC 10026 的内容,“分散交易处理 (Distributed Transaction Processing)” 标准化函数呼叫,SQL 资源管理员会用以支持分二阶段的确定 (two-phase commit)。基础的文件是自经 X/Open 批准而来自一份 X/Open 出版物,它清楚的指明 xa_close, xa_commit, xa_complete, xa_end, xa_forget, xa_open, xa_prepare, xa_recover, xa_rollback 和 xa_start 等多个函数,以 SQL 资料型态的输入和输出参数的语法。

ISO 目前正尝试尽快追上 (fast-tract) X/Open XA 规格。 这个过程原封不动采用一个目前的业界规格。以 ISO SC21,JTC 1 等级的 XA 尽快追上投票在一九九五年四月二十七日开始,一九九五年十月二十七日结束。如果 XA 规格经 75% 票数和 2/3 的 JTC 1 p-members 批准,它会成为一个国际标准。 如果经尽快追上投票批准,SQL/XA 可在 1996 年成为标准。

28.16 第七部分 时态 ISO/ANSI SQL

时态 SQL 处理和时间有关的资料。其概念是在查询资料时利用它在一个特定时间的情况。 时态 SQL 是一份由 Rick Snodgrass 在一九九四年十二月所写,描述这概念的文件。

X3 宣布确认一个新计划,ISO/IEC 9075 Part 7: SQL/Temporal 是一份关于 SQL/Temporal 的新闻稿

----------------------------------------------------------------------------
                                Temporal SQL
                                ************
Rick Snodgrass(TSQL2 委员会主席)
31-Dec-1994
有人质疑过 SQL 3 对附加时间支持的问题(如在 DBL R10-75 提议,要求 SQL 有新的部分来处理时间性的资料库)。其论点是抽象资料形态 (ADT's) 足以支持时态。 在这信息性的项目,我使用具体例子来论证拥有抽象资料形态的栏位不能处理时态查询。 特别来说,很多时间性的查询不是很难用 SQL 模拟,就是需在过程语言中使用嵌入式 SQL。其他选择在 TSQL2,一个对 SQL-92 的时态延伸中提出了。

导言

有效时间 (Valid-time) 的支持超出一个时态 ADT 的能力。使用后者, 一个栏位被指定为时态领域,如 DATE 或 INTERVAL(稍后会有例子)。籍著有效时间, 表格的每行随著时间改变,因为现实改变了。联系到一个有效时间表格的某行的时间戳记 (timestamp),会被查询语言理解为该行中各栏数值的组合有效的时间。 这个无须言明的时间戳记使得查询可以简单易明地表达出来。

个案研究 储存现时资料

The University of Arizona 的 Office of Appointed Personnel 在资料库中有些资料,包括雇员名字、目前薪金和目前职位。 这些可用一个简单的表格表达出来。

        Employee(Name, Salary, Title)
使用这个表格寻找一个雇员的薪金十分简单。
        SELECT Salary
        FROM Employee
        WHERE Name = 'Bob'
现在 OAP 想再记录出生日期。为些,在表格中加了一栏,产生以下纲目 (schema)︰
        Employee(Name, Salary, Title, DateofBirth DATE)
找寻一名雇员的出生日期个寻找薪金类似。
        SELECT DateofBirth
        FROM Employee
        WHERE Name = 'Bob'

个案研究 储存历史资料

OAP 想把受雇历史电脑化。为此,他们加上两栏, 一栏指出表示此行的资料何时开始有效,另一指出资料何时失效。

Employee (Name, Salary, Title, DateofBirth, Start DATE, Stop DATE)

以资料模型 (data model) 说,这些新栏位和 DateofBirth 毫无分别。不过, 它们的存在产生多种结果。

个案研究 投映 (Projection)

要找出雇员目前的薪金会较为困难。

        SELECT Salary
        FROM Employee
        WHERE Name = 'Bob' AND Start <= CURRENT_DATE AND CURRENT_DATE <= Stop
这句查询比之前的复杂。元凶很明显是新增的两栏。OAP 想发出薪金历史给各员工。 特别地,有需要找出每一名雇员在收受一个薪酬的最长时间。不幸地,用 SQL 不能做到。一名雇员在薪酬调整期间职衔可有多次变更。
Name    Salary  Title             DateofBirth   Start           Stop
----    ------  -----             -----------   -----           ----
Bob     60000   Assistant Provost 1945-04-09    1993-01-01      1993-05-30
Bob     70000   Assistant Provost 1945-04-09    1993-06-01      1993-09-30
Bob     70000   Provost           1945-04-09    1993-10-01      1994-01-31
Bob     70000   Professor         1945-04-09    1994-02-01      1994-12-31

                               图 1
要注意有三行 Bob 的薪金停留在 $70,000。所以,结果应该是 Bob 有两行。
Name    Salary  Start           Stop
----    ------  -----           ----
Bob     60000   1993-01-01      1993-05-30
Bob     70000   1993-06-01      1994-12-31
另一方法是把薪金和职级资料印给用者,而由用者找出他的薪酬何时变更。 这方法既不吸引,亦不实际。另一方法是尽量使用 SQL。
CREATE TABLE Temp(Salary, Start, Stop)
AS      SELECT Salary, Start, Stop
        FROM Employee;
repeat
        UPDATE Temp T1
        SET (T1.Stop) = (SELECT MAX(T2.Stop)
                         FROM Temp AS T2
                         WHERE T1.Salary = T2.Salary AND T1.Start < T2.Start
                                AND T1.Stop >= T2.Start AND T1.Stop < T2.Stop)
        WHERE EXISTS (SELECT *
                      FROM Temp AS T2
                      WHERE T1.Salary = T2.Salary AND T1.Start < T2.Start
                                AND T1.Stop >= T2.Start AND T1.Stop < T2.Stop)
        until no rows updated;

DELETE FROM Temp T1

WHERE EXISTS (SELECT *
              FROM Temp AS T2
              WHERE T1.Salary = T2.Salary
                        AND ((T1.Start > T2.Start AND T1.Stop <= T2.Stop)
                        OR (T1.Start >= T2.Start AND T1.Stop < T2.Stop))
回圈中找出重叠或相邻而需要合并的时段。在最坏的情况,回圈会执行 log N 次,N 指一连串重叠或相邻的同薪金纪录的数量。读者可自行模拟查询在以上例子的执行, 以验证它的正确性。

第三种方法是使用 SQL 为表格开启一个游标 (cursor)。为每个薪金管理一个各段落的链表 (linked list)。这链表开始时需为空白。

DECLARE emp_cursor CURSOR FOR
        SELECT Salary, Title, Start, Stop
        FROM Employee;
OPEN emp_cursor;
loop:
        FETCH emp_cursor INTO :salary, :start, :stop;
        if no-data returned then goto finished;
        find position in linked list to insert this information;
        goto loop;
finished:
CLOSE emp_cursor;
重覆至链表结束,印出日期和薪金。

如果游标是 ORDER BY Start,链表并非必要。

无论如何,一句简单的查询是不易用 SQL-92 的功能表达出这目的。使用 TSQL2 的话这查询会很简单。

        SELECT Salary
        FROM Employee

案例研究 连结 (JOIN)

一个更激进的方法是把纲目重整,把薪金、职级、出生日期资料分开, 从而避开抽取薪酬历史时遇到的问题。(为方便计,我们以后的讨论中不再考虑出生日期。)

        Employee1 (Name, Salary, Start DATE, Stop DATE)
        Employee2 (Name, Title, Start DATE, Stop DATE)
Employee1 表格如下︰
Name    Salary  Start           Stop
----    ------  -----           ----
Bob     60000   1993-01-01      1993-05-30
Bob     70000   1993-06-01      1993-12-31
这是 Employee2 表格。
Name    Title                   Start           Stop
----    ------                  -----           ----
Bob     Assistant Provost       1993-01-01      1993-09-30
Bob     Provost                 1993-10-01      1994-01-31
Bob     Professor               1994-02-01      1994-12-31

改变之后,取得雇员薪金资料变得简单。

        SELECT Salary, Start, Stop
        FROM Employee1
        WHERE Name = 'Bob'
但如果 OAP 想一个表格中包括薪金、职位的时段(即 OAP 想一个像图 1 形式的表格)?一个方法是印出两个表格,而让用者找出有关组合。另一方法是完全使用 SQL。不幸地,这查询要分析 Employee1 每行和 Employee2 的重叠情况,有四种可能出现。
SELECT Employee1.Name, Salary, Dept, Employee1.Start, Employee1.Stop
FROM Employee1, Employee2
WHERE Employee1.Name = Employee2.Name
     AND Employee2.Start <= Employee1.Start AND Employee1.Stop < Employee2.Stop
UNION
SELECT Employee1.Name, Salary, Dept, Employee1.Start, Employee2.Stop
FROM Employee1, Employee2
WHERE Employee1.Name = Employee2.Name
     AND Employee1.Start >= Employee2.Start AND Employee2.Stop < Employee1.Stop
        AND Employee1.Start < Employee2.Stop
UNION
SELECT Employee1.Name, Salary, Dept, Employee2.Start, Employee1.Stop
FROM Employee1, Employee2
WHERE Employee1.Name = Employee2.Name
     AND Employee2.Start > Employee1.Start AND Employee1.Stop < Employee2.Stop
        AND Employee2.Start < Employee1.Stop
UNION
SELECT Employee1.Name, Salary, Dept, Employee2.Start, Employee2.Stop
FROM Employee1, Employee2
WHERE Employee1.Name = Employee2.Name
     AND Employee2.Start > Employee1.Start AND Employee2.Stop < Employee1.Stop
正确找出所有情形是一件具挑战性的工作。使用 TSQL2,进行一个具时态的连结就如人们所期望。
        SELECT Employee1.Name, Salary, Dept
        FROM Employee1, Employee2
        WHERE Employee1.Name = Employee2.Name

个案研究 聚集 (AGGREGATES)

现在 OAP 被问及最高薪酬是什么?加上时间前,这很简单。

        SELECT MAX(Salary)
        FROM Employee
现在加上了薪金历史,我们要找出不同时间最高薪金的历史。问题当然是 SQL 并不提供具时态的聚集。简单的方法是印出有关资料,用人手找出最大值。 另一个方法是取巧,把一个当时的 (snapshot) 聚集查询转化为不使用聚集的查询, 再转化为时态聚集。那个不使用聚集的查询用于找出不大于它本身数值的薪金。
        SELECT Salary
        FROM Employee AS E1
        WHERE NOT EXISTS (SELECT *
                          FROM Employee AS E2
                          WHERE E2.Salary > E1.Salary)
把这个查询变为时态查询并不显浅。以下是一种方法。
CREATE TABLE Temp (Salary, Start, Stop)
AS      SELECT Salary, Start, Stop
        FROM Employee;
INSERT INTO Temp
        SELECT T.Salary, T.Start, E.Start
        FROM Temp AS T, Employee AS E
        WHERE E.Start >= T.Start AND E.Start < T.Stop AND E.Salary > T.Salary;

INSERT INTO Temp
        SELECT T.Salary, T.Stop, E.Stop
        FROM Temp AS T, Employee AS E
        WHERE E.Stop > T.Start AND E.Stop <= T.Stop AND E.Salary > T.Salary;
DELETE FROM Temp T
WHERE EXISTS (SELECT *
              FROM Employee AS E
              WHERE ((T.Start => E.Start AND T.Start < E.Stop)
                        OR (E.Start >= T.Start AND E.Start < T.Stop))
                    AND E.Salary > T.Salary;
这方法建立辅助表格。我们在这个表格中加上两个时段中重叠部分的上、下部分。 之后我们把所有子查询中找出的纪录删除,因此影响到 NOT EXISTS。最后我们从辅助表格中找出最长的时段,像之前我们找出薪金信息般。 如大家所料,这样的 SQL 句子执行时效率非常低,因为哪些复杂的巢状不等查询。

第三个方法是尽量少用 SQL,而在主机上所用的语言中用游标找出最长的历史。

使用 TSQL2 再次简单直接。

        SELECT MAX(Salary)
        FROM Employee

摘要

大部分资料库应用程序都需要处理随时间改变的资料。有效时间在 SQL 并不支持。很多时态查询不是很难以 SQL 模拟,就是需要把 SQL 嵌入到程序语言中,因为 SQL 在资料模型和查询语言结构中缺乏对有效时间的支持。

另一方面,我们示范出加上有效时间支持需要对 DBMS 施行作出一些改变, 但能戏剧性地简化一些查询,并使其他查询变得有可能。将来也可于储存结构、 索引方法的最佳化 (optimization)。而最佳化的策略可导致表现大幅提升。

随著 SQL3 的一个新部分支持随时间改变的资料,我们可以开绐处理这类应用,改良 SQL3 处理时态资料的能力。

----------------------------------------------------------------------------
           Accredited Standards Committee* X3, Information Technology
NEWS RELEASE

文件编号︰       PR/96-0002

回覆︰       Barbara Bennett at bbennett@itic.nw.dc.us

             X3 宣布认可一个这专案, ISO/IEC 9075 Part 7:  SQL/Temporal

Washington D.C., 1996 年一月
----------------------------------------------------------------------------
-- Accredited Standards Committee X3, Information Technology 宣布认可一个有关 SQL/Temporal 支持的新专案,ISO/IEC 9075 Part 7,并把有关工作交予 Technical Committee X3H2, Database。这个建议中的标准订明将出现的 SQL3 标准的一个新部分,如第七部分 Temporal SQL 为 SQL 的一个延伸,在 SQL 资料库环境支持存取和处理具时态的资料。下次 X3H2 会议定于一九九六年三月十一至十四日在堪萨斯 (Kansas) 举行。

如有查询,可邮寄往︰

        Chairman of X3H2,
        Dr. Donald R. Deutsch,
        Sybase, Inc., Suite 800,
        6550 Rock Spring
        Drive, Bethesda, MD  20817.
        Email: deutsch@sybase.com.
现正寻求可能的专利和其他恰当的事项(版权、商标)。这把有关资料寄交︰
        X3 Secretariat at
        1250 Eye Street
        NW, Suite 200,
        Washington DC  20005.
        Email: x3sec@itic.nw.dc.us
        FAX:  (202)638-4922.

28.17 第八部分 ISO/ANSI SQL 多媒体 (SQL/MM)

一个为建立用于多媒体应用程序的 SQL 物件函式库的新 ISO/IEC 国际标准化计划在一九九三年初期获批准进行。这个新标准化行动名为 SQL Multimedia (SQL/MM),它会用草拟中的 SQL3 规格中的抽象资料型态(ADT)规格和目标指定 SQL ADT 定义套件。

SQL/MM 目标为标准化科学和工程、全文和文件处理、管理多媒体物件,如影像、声音、 动画、音乐和录像的物件函数库。它多数会提出一种用于其他 JTC1 标准组织(如有关文件的 SC18、影像的 SC24、照片和动作图像的 SC29)定义的物件的 SQL 语言结合 (binding)。

SQL/MM 的专案计划指出它会成为一份多部分标准,包含不定数量的部分。 第一部分会是其他部分如何建成的框架。其他每个部分会专注于一个特定的 SQL 应用程序套件。以下为一九九四年八月存在的 SQL/MM 部分︰

有多个有关空间和地理资料的标准化的工作在进行中︰


Next Previous Contents