数据库系统概念读书笔记-SQL标准简介
SQL 的起源
通常認(rèn)為,SQL 是 Structured Query Language 的縮寫,規(guī)范的發(fā)音是 “??s?kju???l”。但是它的前身是著名的關(guān)系數(shù)據(jù)庫(kù)原型系統(tǒng) System R 所采用的 SEQUEL 語(yǔ)言,這也是為什么有很多人將其讀作 “?si?kw?l” 的來(lái)源。也有人類比 GNU 這個(gè)詞的定義(GNU’s Not UNIX),認(rèn)為 SQL 是 SQL Query Language 的縮寫。 作為一種訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言,SQL 自問(wèn)世以來(lái)得到了廣泛的應(yīng)用,不僅著名的大型商用數(shù)據(jù)庫(kù)產(chǎn)品如 Oracle、DB2、Sybase、SQL Server 等支持它,很多開(kāi)源的數(shù)據(jù)庫(kù)產(chǎn)品如 PostgreSQL、MySQL 等也支持它,甚至一些小型的產(chǎn)品如 Access 也支持 SQL。近些年蓬勃發(fā)展的 NoSQL 系統(tǒng)最初是宣稱不再需要 SQL 的,后來(lái)也不得不修正為 Not Only SQL,來(lái)?yè)肀?SQL。
藍(lán)色巨人 IBM 對(duì)關(guān)系數(shù)據(jù)庫(kù)以及 SQL 語(yǔ)言的形成和規(guī)范化產(chǎn)生了重大的影響,第一個(gè)版本的 SQL 標(biāo)準(zhǔn) SQL86 就是基于 System R 的手冊(cè)而來(lái)的。可惜的是, IBM 起先并沒(méi)有什么產(chǎn)品化的想法,倒是 Oracle 富有遠(yuǎn)見(jiàn),在 1979 年率先推出了支持 SQL 的商用產(chǎn)品。隨著數(shù)據(jù)庫(kù)技術(shù)和應(yīng)用的發(fā)展,為各種不同的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)提供一致的語(yǔ)言成了一種現(xiàn)實(shí)需要。
SQL 的標(biāo)準(zhǔn)化
對(duì) SQL 標(biāo)準(zhǔn)影響最大的機(jī)構(gòu)自然是那些著名的數(shù)據(jù)庫(kù)產(chǎn)商,而具體的制訂者則是一些非營(yíng)利機(jī)構(gòu),例如國(guó)際標(biāo)準(zhǔn)化組織 ISO、美國(guó)國(guó)家標(biāo)準(zhǔn)委員會(huì) ANSI 等。世界各國(guó)通常會(huì)按照 ISO 標(biāo)準(zhǔn)和 ANSI 標(biāo)準(zhǔn)(這兩個(gè)機(jī)構(gòu)的很多標(biāo)準(zhǔn)是差不多等同的)制定自己的國(guó)家標(biāo)準(zhǔn)。中國(guó)也是 ISO 標(biāo)準(zhǔn)委員會(huì)的成員國(guó),積極參與標(biāo)準(zhǔn)的制定工作,也會(huì)經(jīng)常翻譯一些國(guó)際標(biāo)準(zhǔn)對(duì)應(yīng)的中文版。標(biāo)準(zhǔn)為了避免采用具體產(chǎn)品的術(shù)語(yǔ),往往會(huì)抽象出很多名詞,從而增加了閱讀和理解的難度,翻譯成中文之后更容易增加理解難度。對(duì)于數(shù)據(jù)庫(kù)系統(tǒng)實(shí)現(xiàn)者而言,很多時(shí)候還不如直接讀英文版本為好。雖然正式的 ISO 標(biāo)準(zhǔn)不總是像 RFC 那樣可以從網(wǎng)絡(luò)上免費(fèi)獲得,標(biāo)準(zhǔn)草案還是比較容易找到的。待批準(zhǔn)的標(biāo)準(zhǔn)草案和最終的標(biāo)準(zhǔn)也沒(méi)有什么實(shí)質(zhì)上的區(qū)別,能夠滿足日常工作的需要。ISO 網(wǎng)站現(xiàn)在也提供了一些標(biāo)準(zhǔn)和技術(shù)報(bào)告的免費(fèi)下載1。
SQL 標(biāo)準(zhǔn)的歷史
下面是 SQL 標(biāo)準(zhǔn)簡(jiǎn)要的發(fā)展與演化歷史:
- 1986 年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86。這是 ANSI 首次將 SQL 語(yǔ)言標(biāo)準(zhǔn)化的版本。
- 1989 年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89。增加了完整性約束。
- 1992 年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2)。最重要的一個(gè)版本。 引入了標(biāo)準(zhǔn)的分級(jí)概念。
- 1999 年,ISO/IEC 9075:1999,SQL:1999(SQL3)。變動(dòng)最大的一個(gè)版本。改變了標(biāo)準(zhǔn)符合程度的定義;增加了面向?qū)ο筇匦?、正則表達(dá)式、存儲(chǔ)過(guò)程、Java 等支持。
- 2003 年,ISO/IEC 9075:2003,SQL:2003。引入了 XML、Window 函數(shù)等。
- 2008 年,ISO/IEC 9075:2008,SQL:2008。引入了 TRUNCATE 等。
- 2011 年,ISO/IEC 9075:2011,SQL:2011。引入了時(shí)序數(shù)據(jù)等。
- 2016 年,ISO/IEC 9075:2016,SQL:2016。引入了 JSON 等。
細(xì)心的讀者能發(fā)現(xiàn),從 SQL:1999 開(kāi)始,標(biāo)準(zhǔn)簡(jiǎn)稱中的短橫線(-)被換成了冒號(hào)(:),而且標(biāo)準(zhǔn)制定的年份也改用四位數(shù)字了。前一個(gè)修改的原因是 ISO 標(biāo)準(zhǔn)習(xí)慣上采用冒號(hào),ANSI 標(biāo)準(zhǔn)則一直采用短橫線。后一個(gè)修改的原因是標(biāo)準(zhǔn)的命名也遇到了 2000 年問(wèn)題。
SQL86 大概只有幾十頁(yè),SQL92 正文大約有 500 頁(yè),而 SQL99 則超過(guò)了 1000 頁(yè)??梢钥闯?#xff0c;從 SQL99 開(kāi)始,SQL 標(biāo)準(zhǔn)的個(gè)頭就非常龐大了,內(nèi)容包羅萬(wàn)象,可以說(shuō)已經(jīng)沒(méi)有人能夠掌握標(biāo)準(zhǔn)的所有內(nèi)容了。以 SQL:2003 為例,它包括以下 9 個(gè)部分(中間編號(hào)空缺是曾經(jīng)被占用,之后被廢棄的標(biāo)準(zhǔn)造成的):
- ISO/IEC 9075-1: Framework (SQL/Framework)
- ISO/IEC 9075-2: Foundation (SQL/Foundation)
- ISO/IEC 9075-3: Call Level Interface (SQL/CLI)
- ISO/IEC 9075-4: Persistent Stored Modules (SQL/PSM)
- ISO/IEC 9075-9: Management of External Data (SQL/MED)
- ISO/IEC 9075-10: Object Language Bindings (SQL/OLB)
- ISO/IEC 9075-11: Information and Definition Schemas (SQL/Schemata)
- ISO/IEC 9075-13: SQL Routines and Types Using the Java Programming Language (SQL/JRT)
- ISO/IEC 9075-14: XML-Related Specifications (SQL/XML)
學(xué)習(xí) SQL 標(biāo)準(zhǔn)
負(fù)責(zé)具體制定工作的是 ISO 和 IEC 聯(lián)合成立的一個(gè)技術(shù)委員會(huì) JTC1/SC32。正因?yàn)殛P(guān)系數(shù)據(jù)庫(kù)市場(chǎng)非常成熟,競(jìng)爭(zhēng)不夠激烈,標(biāo)準(zhǔn)本身變得過(guò)于龐大等原因,SQL3 制定的周期很長(zhǎng),制定期間也存在很多爭(zhēng)議。例如文章 Is SQL a Real Standard Anymore? 就對(duì) SQL 標(biāo)準(zhǔn)化進(jìn)程提出了置疑。WISCorp 2 網(wǎng)站曾經(jīng)收集了很多相關(guān)的文檔,JCC3 網(wǎng)站則提供了比較新的更新。
如果要了解標(biāo)準(zhǔn)的內(nèi)容,比較推薦的方法是泛讀 SQL92(因?yàn)樗婕傲?SQL 最基礎(chǔ)和最核心的一些內(nèi)容),然后增量式的閱讀其他標(biāo)準(zhǔn)。標(biāo)準(zhǔn)在每次更新的時(shí)候,委員會(huì)的成員們都為大家提供比較好的介紹文檔。例如,針對(duì) SQL:2011,SIGMOD Record 上就有很不錯(cuò)的介紹4。針對(duì) SQL:2016,這是一個(gè)很好的更新5,這6也是一個(gè)很好的補(bǔ)充。
大約從 2011 年開(kāi)始,標(biāo)準(zhǔn)委員會(huì)還提供了 SQL Technical Reports,雖然它們不是正式標(biāo)準(zhǔn)的一部分,但卻非常有助于理解標(biāo)準(zhǔn)。ISO 的這個(gè)網(wǎng)頁(yè)1提供了技術(shù)報(bào)告的免費(fèi)下載,注意它們的編號(hào)是 19075,而且標(biāo)題中帶 TR 這個(gè)縮寫詞。
SQL 標(biāo)準(zhǔn)的符合性
提及標(biāo)準(zhǔn),大家容易想到的一個(gè)問(wèn)題就是產(chǎn)品對(duì)標(biāo)準(zhǔn)的遵循程度,也就是標(biāo)準(zhǔn)的符合性到底如何,因?yàn)樗鼤?huì)影響代碼在不同系統(tǒng)之間遷移的難度。很遺憾的是,SQL 標(biāo)準(zhǔn)因?yàn)槎x過(guò)于寬泛等技術(shù)和非技術(shù)原因,不同產(chǎn)品對(duì)標(biāo)準(zhǔn)的符合程度存在很大的差異。大到功能特性,小到語(yǔ)法語(yǔ)義的細(xì)節(jié),在不同產(chǎn)品之間都存在很多差異,造成實(shí)際的應(yīng)用遷移遠(yuǎn)比 C/C++ 程序的遷移要復(fù)雜很多。因此,盡管很多產(chǎn)品都號(hào)稱自己符合 SQL 標(biāo)準(zhǔn),并不意味著應(yīng)用可以容易的在它們之間切換。除了 Oracle、DB2 等經(jīng)典的商業(yè)產(chǎn)品,以及 PostgreSQL、MySQL 等開(kāi)源產(chǎn)品總體上對(duì) SQL 標(biāo)準(zhǔn)的符合程度較高以外,很多產(chǎn)品提到的 SQL 標(biāo)準(zhǔn),涉及的內(nèi)容其實(shí)是 SQL92 里頭最基本或最核心的一部分(屬于入門級(jí)的范疇。SQL92 本身是分級(jí)的,包括入門級(jí)、過(guò)渡級(jí)、中間級(jí)和完全級(jí))。
為了驗(yàn)證具體的產(chǎn)品對(duì)標(biāo)準(zhǔn)的遵從程度,NIST 還曾經(jīng)專門發(fā)起了一個(gè)項(xiàng)目,來(lái)做標(biāo)準(zhǔn)符合程度的測(cè)試集合7。不過(guò),SQL 標(biāo)準(zhǔn)包含的內(nèi)容實(shí)在太多了,而且有很多特性對(duì)新的 SQL 產(chǎn)品而言也越來(lái)越不重要了。從 SQL99 之后,標(biāo)準(zhǔn)中符合程度的定義就不再分級(jí),而是改成了核心兼容性和特性兼容性;也沒(méi)有機(jī)構(gòu)來(lái)推出權(quán)威的 SQL 標(biāo)準(zhǔn)符合程度的測(cè)試認(rèn)證了。開(kāi)源的 MySQL 曾經(jīng)在 6.0 的開(kāi)發(fā)過(guò)程中試圖大幅度改善對(duì) SQL 標(biāo)準(zhǔn)的符合程度,不過(guò)后來(lái)似乎不了了之了。國(guó)產(chǎn)數(shù)據(jù)庫(kù)作為數(shù)據(jù)庫(kù)領(lǐng)域的后來(lái)者,曾經(jīng)對(duì)標(biāo)準(zhǔn)的符合程度非常重視,還組織了專門的機(jī)構(gòu)來(lái)做產(chǎn)品的標(biāo)準(zhǔn)符合性測(cè)試。在數(shù)據(jù)庫(kù)百科全書(shū)8中也有很多有關(guān)標(biāo)準(zhǔn)的章節(jié)。
參考:
1 http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html
2 https://www.wiscorp.com/free_downloads.html
3 http://www.jcc.com/resources/sql-standards
4 http://www.sigmod.org/publications/sigmod-record/1203/pdfs/10.industry.zemke.pdf
5 https://s3.amazonaws.com/artifacts.opencypher.org/website/materials/SQLStandards_2017-10-20.pdf
6 https://modern-sql.com/blog/2017-06/whats-new-in-sql-2016
7 http://itl.nist.gov/div897/ctg/sql_form.htm
8 http://mall.cnki.net/reference/detail_R201109078.html
總結(jié)
以上是生活随笔為你收集整理的数据库系统概念读书笔记-SQL标准简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用Java实现文本编辑器
- 下一篇: 论文---基于B/S中小型酒店客房管理系