Next Previous Contents

23. 文件和參考書

23.1 用戶指引和說明書

PostgreSQL 散佈中已包括以下各項的 postscript、HTML 格式 和 unix man-pages。如果你能上網,你可在以下地方找到下列文件︰ http://www.postgresql.org/docs

23.2 線上文件

23.3 有用的參考書

還有數以百計有關 SQL 的書!到書店看看吧。

23.4 ANSI/ISO SQL 規格文件—SQL 1992, SQL 1998

ANSI/ISO SQL 規格文件可在下列網站找到︰

23.5 ANSI/ISO SQL 1992 的語法

請參閱本文件的附錄甲 Appendix A

23.6 ANSI/ISO SQL 1998 的語法

SQL 1998 (SQL 3) 規格仍在開發中。參看本文件的“電子途徑取得 SQL3 草案” SQL 1998

23.7 初學者 SQL 導引

參看本文附錄乙 Appendix B

23.8 SQL92 的時態延伸 (Temporal Extension)

這目錄中包括一個 SQL-92 語言規格的時態延伸。這種新語言被名為 TSQL2。

這裡的語言規格是這語言的最終版本。

可直接聯絡 TSQL2 的主席︰ Design Committee, 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).

23.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’一次取得一個檔案。在命令稿中的注解會在角括號內 < 即是如此 >。

  % ftp gatekeeper.dec.com
  Connected to gatekeeper.dec.com.
  220- *** /etc/motd.ftp ***
       Gatekeeper.DEC.COM is an unsupported service of DEC Corporate Research.
       <...this goes on for a while...>
  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.  <or whatever>
  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
(譯按︰以上只是確保檔案會被壓縮及以二元格式傳送,但沒下傳任何資料。另外 迪吉多已被康柏 (Compaq) 收購。) 以下命令稿會取得最新版本的 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”。

23.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 Testing (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 標準的書。這些書提供一個比實際標準易理解的描述。

有關的標準 (Related Standards)

SQL 社群也對多個其他標準有興趣。這節包括一些有關這些努力的指針。當更多資料在網上出現後,這個名單也會更長。

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

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

對物件導向能力有數個先決要求︰

這些能力已定義為 SQL/PSM 的一部分

現在有大量工作在煉製 SQL 物件模型,使它和 ODMG 提出的物件模型看齊。這努力在 X3H2 和 ISO DBL 文章中描述過︰容納 SQL3 和 ODMG。在 SQL3/OQL Merger 最近的更新版也可得到。

SQL3 時間表

有關 SQL3 的工作正在進行,但最終標準還有待數月後才出現。

ANSI 版的標準的編排也差不多。

23.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 正以驚人的速度處理中。

23.13 第四部分— ISO/ANSI SQL 持久儲存模組 (Persistent Stored Modules)

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

除作為有價值的應用程式開發工具,SQL/PSM 為 SQL3 提供了物件導向能力的基礎支援。

複句和儲存程序

複句和儲存程序為主從環境提供多種好處︰

程序語言延伸

程序語言籍流向控制和其他編程技巧為 SQL 加上傳統程式語言的功能。

流向控制語句

程序語言延伸還包括其他編程技巧︰

此外,所有傳統 SQL 語言都可包含在多句的程序中。

外部函數與程序呼叫

一個經常在大量資料庫產品的 wish lists 中出現,而有部分實踐到的特色,是呼叫用者所寫,在資料庫軟件外的程序。

這功能的好處是它讓資料庫(因此包括資料庫應用程式)使用豐富的程序和函數,數 量多得不能由一個標準組織定出。

SQL/PSM 時間表

SQL/PSM 發展迅速︰

23.14 第五部分— ISO/ANSI SQL/結合 (Bindings)

為方便參考,程式語言的結合被抽出成獨立的文件。目前的版本即是 SQL-92 的動態和嵌入結合 (dynamic and embedded bindings) 的節錄。

程式語言結合仍有不同的問題有待解決。

對傳統程式語言來說,資料型態和 SQL-92 的可以互相對應。不過, SQL 物件 和程式語言變數之間的對應必須定義。

對物件導向語言來說,目前的 SQL 資料型態、SQL 物件模型和物件導向程式語言之間 的對應關係必須定義。

物件模型需在公開這些之前穩定下來。

語言結合完成時會成為 SQL3 的一部分。

23.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 年成為標準。

23.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;
重覆
        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.

23.17 第八部分—ISO/ANSI SQL MULTIMEDIA (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