SQL标准
為什么要建立標(biāo)準(zhǔn)?
??
為什么說技術(shù)標(biāo)準(zhǔn)相當(dāng)重要?原因很多,最首要的一條就是產(chǎn)品的用戶在購(gòu)買產(chǎn)品之前能保證產(chǎn)品能達(dá)到它所宣稱的功能。如果你能和某家廠商形成伙伴關(guān)系,保證 你的數(shù)據(jù)管理系統(tǒng)一切正常,難道這樣不好嗎?再比如,你在選擇RDMS的時(shí)候首先考慮的是其穩(wěn)定、資源的有效利用率還是因?yàn)樗С指?jìng)爭(zhēng)產(chǎn)品并不擁有的視圖 和事務(wù)功能呢?
有一個(gè)標(biāo)準(zhǔn)千般好,至少,第3方廠商能由此創(chuàng)建出可應(yīng)用于整個(gè)市場(chǎng)而非某一特定平臺(tái)的工具和實(shí)用程序。同樣的,單一成品在通過標(biāo)準(zhǔn)認(rèn)證的情況下更可以增加 其可用資源的比重。產(chǎn)品認(rèn)證有助于保證產(chǎn)品具有合格的質(zhì)量和功能特性,反之,那些沒有經(jīng)過標(biāo)準(zhǔn)認(rèn)證的“假冒品”到底能在多大程度上遵守標(biāo)準(zhǔn)規(guī)范就要大打折 扣了!
針對(duì)產(chǎn)品的標(biāo)準(zhǔn)認(rèn)證程序具有很多優(yōu)點(diǎn)。然而,不幸的是,恰恰是SQL不具有能滿足這一目標(biāo)的標(biāo)準(zhǔn)控制體。
為什么標(biāo)準(zhǔn)沒人聽?
將近10年來,美國(guó)標(biāo)準(zhǔn)和技術(shù)研究所(NIST,該組織接受美國(guó)商務(wù)部的管理)一直負(fù)責(zé)提供RDMS的標(biāo)準(zhǔn)測(cè)試。6年前,NIST停止執(zhí)行 ANSI/SQL標(biāo)準(zhǔn)的強(qiáng)制檢測(cè),他們認(rèn)為,由于廠商缺乏標(biāo)準(zhǔn)兼容性的義務(wù)而令標(biāo)準(zhǔn)測(cè)試流于形式,標(biāo)準(zhǔn)本身在很大程度上被嚴(yán)重忽略了。
今天,大多數(shù)數(shù)據(jù)庫(kù)開發(fā)商都宣稱其產(chǎn)品遵守SQL-92標(biāo)準(zhǔn),該標(biāo)準(zhǔn)于1992年發(fā)布。然而,當(dāng)前的標(biāo)準(zhǔn)實(shí)際上已經(jīng)發(fā)展到了SQL-99。NIST放棄對(duì) 標(biāo)準(zhǔn)的控制原因在于: (1)數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)領(lǐng)域的范圍太大。(2)由于財(cái)政上的原因,只有業(yè)內(nèi)財(cái)大氣粗的頂級(jí)RDMS開發(fā)商才有能力制定和實(shí)現(xiàn)標(biāo)準(zhǔn)。這兩大因素在極大程度上促使具 體的數(shù)據(jù)庫(kù)產(chǎn)品背離了相關(guān)的標(biāo)準(zhǔn),從而導(dǎo)致數(shù)據(jù)管理領(lǐng)域的技術(shù)混亂,而這卻正是ANSI標(biāo)準(zhǔn)所試圖防范的結(jié)果。
哎,這樣一來還談什么標(biāo)準(zhǔn)!
產(chǎn)品的一致性造就平庸
各類數(shù)據(jù)庫(kù)開發(fā)商僅在不同程度上遵守ANSI/SQL標(biāo)準(zhǔn),其目的無非是令他們的產(chǎn)品能具有更具競(jìng)爭(zhēng)性的優(yōu)勢(shì),同時(shí)滿足客戶的需求。不過,這些產(chǎn)品好歹還能說是遵守ANSI/SQL規(guī)范的。為了實(shí)現(xiàn)產(chǎn)品的兼容性和標(biāo)準(zhǔn)性,數(shù)據(jù)庫(kù)產(chǎn)品基本上必須滿足以下3個(gè)條件:
生產(chǎn)商必須創(chuàng)建可以設(shè)置的標(biāo)志,通過它在用到非標(biāo)準(zhǔn)查詢語句或者功能時(shí)可以產(chǎn)生有關(guān)的警告。
生產(chǎn)商必須明確地指出違背ANSI/SQL標(biāo)準(zhǔn)的函數(shù)屬于產(chǎn)品本身的“擴(kuò)展(extensions)”,并按照第1條所規(guī)定的那樣提供標(biāo)志特性。
數(shù)據(jù)庫(kù)必須支持“Entry Level SQL92”,該標(biāo)準(zhǔn)版本由以下要素組成:表、列、數(shù)據(jù)類型、鍵索引、schema操作、行和表約束、視圖、基本關(guān)系操作以及編程語言綁定等。
舉個(gè)例子,我從Oracle產(chǎn)品下特有的SQL,也就是PL/SQL總結(jié)出以下并不遵守規(guī)范的技術(shù)擴(kuò)展。
PL/SQL標(biāo)志擴(kuò)展:
數(shù)組接口包括FOR子句
SQLCA、ORACA和SQLDA數(shù)據(jù)結(jié)構(gòu)
動(dòng)態(tài)SQL包括DESCRIBE語句
嵌入式PL/SQL代碼塊
自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換
DATE、COMP-3、NUMBER、RAW、LONG RAW、VARRAW、ROWID和VARCHAR數(shù)據(jù)類型
ORACLE OPTION語句用于指定運(yùn)行時(shí)選項(xiàng)
用于用戶退出的EXEC IAF和EXEC TOOLS語句
CONNECT語句
TYPE和VAR數(shù)據(jù)類型等價(jià)語句
AT db_name子句
DECLARE...DATABASE, ...STATEMENT和 ...TABLE語句
WHENEVER語句的SQLWARNING約束
WHENEVER語句的DO 和STOP行為
COMMIT語句中的COMMENT和FORCE TRANSACTION子句
ROLLBACK語句的FORCE TRANSACTION和TO SAVEPOINT子句
COMMIT和ROLLBACK語句的RELEASE參數(shù)
INTO子句中主機(jī)變量和WHENEVER...DO標(biāo)簽的Optional冒號(hào)前綴
我本來還想給大家提出一個(gè)針對(duì)MS SQL Server的查詢語言Transact-SQL的類似兼容性列表,但我沒有找到有關(guān)的ANSI/SQL標(biāo)準(zhǔn)兼容性說明文檔。如果你想知道你在使用SQL Server時(shí)所用到的函數(shù)是否與標(biāo)準(zhǔn)相一致,你不妨利用 ‘set fipsflagger’選項(xiàng)顯示警告信息。
我舉出以上的例子是為了說明以下事實(shí):雖然數(shù)據(jù)庫(kù)開發(fā)商宣稱自己的產(chǎn)品仍然處于ANSI RDMS標(biāo)準(zhǔn)的參數(shù)控制范圍之內(nèi),但是,就算你達(dá)到了應(yīng)用程序編程的技術(shù)水準(zhǔn),在沒有綜合考慮的情況下你也無法在不同類型的數(shù)據(jù)庫(kù)產(chǎn)品之間順利遷移。
標(biāo)準(zhǔn)失去了應(yīng)有的意義。沒有強(qiáng)制標(biāo)準(zhǔn)的執(zhí)行部門,因而也不存在真正的標(biāo)準(zhǔn)產(chǎn)品。所謂的“遵守ANSI/SQL標(biāo)準(zhǔn)”不過是在市場(chǎng)銷售時(shí)的一個(gè)漂亮口號(hào)而已。對(duì)數(shù)據(jù)庫(kù)的應(yīng)用或者應(yīng)用程序的開發(fā)而言并沒有太大的意義。
ANSI SQL建議
自1996年NIST的數(shù)據(jù)管理標(biāo)準(zhǔn)程序被放棄之后,現(xiàn)在已經(jīng)沒有什么認(rèn)證或者其他機(jī)制能檢驗(yàn)數(shù)據(jù)庫(kù)廠商是否遵守了ANSI SQL標(biāo)準(zhǔn)。市場(chǎng)上的公眾要求和主流產(chǎn)品都一個(gè)勁地只為保護(hù)客戶投資的利益著想,生產(chǎn)商寧肯向客戶提供更好的產(chǎn)品特性而不刻意追求產(chǎn)品的標(biāo)準(zhǔn)性,其情勢(shì)宛 如標(biāo)準(zhǔn)蕩然無存。
我們只有兩個(gè)選擇:要不推出某種形式的標(biāo)準(zhǔn)強(qiáng)制執(zhí)行系統(tǒng),要不在某些違背標(biāo)準(zhǔn)的特性成為事實(shí)上的標(biāo)準(zhǔn)之前把SQL標(biāo)準(zhǔn)降格為某種產(chǎn)品建議。
SQL標(biāo)準(zhǔn)
SQL是Structured Query Language的縮寫,一般讀作/`si:kju:/或“ess-que-el”,即字母“S”、“Q”、“L”的發(fā)音。作為一種訪問關(guān)系型數(shù)據(jù)庫(kù)的標(biāo) 準(zhǔn)接口,SQL自問世以來得到了廣泛的應(yīng)用,不僅是著名的大型商用數(shù)據(jù)庫(kù)產(chǎn)品Oracle、Sybase、Informix、DB2、Ingres、 Microsoft SQL Server支持它,一些小型的產(chǎn)品如Visual Foxpro、Access等也支持SQL,很多開源的數(shù)據(jù)庫(kù)產(chǎn)品PostgreSQL、MySQL、Firebird等也支持SQL。如果您是一個(gè)初學(xué) 者,不妨到sqlcourse.com和sqlcourse2.com去練習(xí)一下,很快就能掌握最基本的SQL語句。
藍(lán)色巨人IBM對(duì)SQL語言的形成和規(guī)范化產(chǎn)生了重大的影響,著名的關(guān)系數(shù)據(jù)庫(kù)原型系統(tǒng)System R就是IBM的研究成果,它就提供了初步的SQL語言,不過那時(shí)稱為SEQUL2。Oracle在1979年率先推出了支持SQL的商用產(chǎn)品,當(dāng)然,那時(shí) 的Oracle并不好用。隨著數(shù)據(jù)庫(kù)技術(shù)和應(yīng)用的發(fā)展,為各種不同的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)提供一致的訪問接口成了一種現(xiàn)實(shí)需要。
對(duì)SQL標(biāo)準(zhǔn)影響最大的機(jī)構(gòu)自然是那些著名的數(shù)據(jù)庫(kù)產(chǎn)商,而具體的制訂者則是一些所謂的非營(yíng)利機(jī)構(gòu),例如ISO、ANSI等。各國(guó)通常會(huì)按照 ISO標(biāo)準(zhǔn)和ANSI標(biāo)準(zhǔn)(這兩個(gè)東西的標(biāo)準(zhǔn)很多時(shí)候是差不多的)制定自己的國(guó)標(biāo),我國(guó)大致就是翻譯一個(gè)對(duì)應(yīng)的中文版,也許外加一點(diǎn)中國(guó)特色。其實(shí)標(biāo)準(zhǔn)這 個(gè)東西本來就很難讀,翻譯成中文也往往是詞不達(dá)意,對(duì)于學(xué)習(xí)者和數(shù)據(jù)庫(kù)系統(tǒng)實(shí)現(xiàn)者而言,還不如直接讀英文的好。另外,通常的標(biāo)準(zhǔn)都是要MONEY才能得到 的,窮學(xué)生們要拜讀一下還真是不容易。雖然正式的標(biāo)準(zhǔn)不像RFC那樣可以輕易從網(wǎng)絡(luò)上免費(fèi)獲得,標(biāo)準(zhǔn)草案還是比較容易找到的。想粗略的學(xué)習(xí)一下標(biāo)準(zhǔn),有一 個(gè)標(biāo)準(zhǔn)草案也可以了。
下面是SQL發(fā)展的簡(jiǎn)要?dú)v史:
1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86
1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89
1992年,ANSI X3.135-1992, ISO/IEC 9075:1992,SQL-92(SQL2)
1999年,ISO/IEC 9075:1999, SQL:1999(SQL3)
2003年,ISO/IEC 9075:2003, SQL:2003(SQL4)
200N年,ISO/IEC 9075:200N, SQL:200N(SQL5)
??? 細(xì)心的讀者能發(fā)現(xiàn),從SQL:1999開始,標(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年問題。
?? 從SQL:1999開始,SQL標(biāo)準(zhǔn)的個(gè)頭就非常大了,其內(nèi)容可以說是包羅萬象,已經(jīng)不僅僅限于SQL語言本身了。SQL:2003就包括以下9個(gè)部分:
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: Java Routines and Types Using the Java Programming Language (SQL/JRT).
ISO/IEC 9075-14: XML-Related Specifications (SQL/XML).
??? 負(fù)責(zé)具體制定工作的是ISO和IEC聯(lián)合成立的一個(gè)技術(shù)委員會(huì)JTC1/SC32,其全名是:Joint Technical Committee ISO/IEC JTC 1, Information technology, Subcommittee SC 32, Data management and interchange。
文章《Is SQL a Real Standard Anymore?》對(duì)SQL標(biāo)準(zhǔn)化進(jìn)程提出了置疑?作者是:
Michael M. Gorman - Whitemarsh Information Systems, Corp.
Secretary - ANSI NCITS H2 Technical Committee on Database
參考文獻(xiàn):
http://www.ansi.orghttp://www.iso.ch
http://sqlstandards.org
http://www.wiscorp.com
SQL99, SQL/MM, and SQLJ: An SQL99, SQL/MM, and SQLJ: An Overview of the SQL Overview of the SQL Standards
SQL:1999, Formerly known as SQL3
ISO/IEC 9075系列標(biāo)準(zhǔn)或其草案
總結(jié)
- 上一篇: SwiftyJSON
- 下一篇: 2017年IT类公司世界500强企业及其