想精通SQL Server, T-SQL的全歷史你聽過嗎?
- 2019 年 12 月 26 日
- 筆記

01, SQL 的淵源
人類開始思考,上帝開始發笑。
早在20世紀70年代,兩位年輕人Ray Boyce 和 Donald D. Chamberlin,成功將上帝語言(關係數學)編譯為凡人的工具。
上帝語言是這樣的:

而凡人的工具長這樣:

沒錯,這就是SQL.
更多的歷史,可以參考我的兩篇原創文章:
這位70後語言大叔,歷經40餘載的風風雨雨,送走古往今來多少挑戰者,其中不乏幾乎顛覆整個資料庫界的 NoSQL 王者,比如 MongoDB, ElasticSearch, HBase, Hive, 但迄今依然是首座,亦有大幅收復丟失戰地的氣魄。
02, ISO 與 ANSI
俗話說,沒有標準,就沒有方圓。
在 SQL 行業,有兩個標準,作為基本常識,不可不知,那就是 ISO 與 ANSI.
ISO: International Organization for Standardization. 我們常稱之為國際標準組織。

這家總部設在瑞士日內瓦的組織,就幹了一件事:把164個國家的標準採納到自己的標準清單上,坐收全世界的認證費,是不是夠牛皮?所以說,人生只要干好一件事就足矣!
那麼全世界的企業都傻了么,為什麼要費錢拿個 ISO 認證?其實這是一套玩法,在這個圈子裡玩,就要遵守規矩,尤其是信任規矩。如果沒有坐下來好好談,把規矩形成大家的共識,那麼背叛和出賣也就難免了。
就拿5G來說,如果沒有個標準通訊信道,華為的5G跑到人家歐洲市場,就不靈了。因為華為的5G通訊信道標準是 Polar, 但歐洲人採用的是 Colar, 那妥妥的歐洲人的錢就掙不到了嘛。
回到 SQL 上來,大家都知道關係代數和關係計算是 SQL 的基礎,那如果不用 SELECT 標明是選擇, 用 INSERT 標明是插入,那麼可以想像,幾個地區的查詢語句就好玩了:
Retrieve * At TblUsers; Grab * In TblUsers;
其實大家都說的是同一個事兒:
Select * From TblUsers;
所以還是得感謝 ISO 組織,要不然我們得學多少門 SQL 方言。
作為一家盈利公司,只要你能符合 ISO SQL 的標準,無論你的資料庫底層怎麼實現,用什麼作業系統,用什麼程式語言,只能 CRUD 都遵循了 ISO 標準,就可以推向全世界。
剛才提到,ISO 是國際標準組織,由164個國家的標準化組織聯盟組成。其中就有 ANSI, 而 ANSI 就是首次提出 SQL 作為 ISO 標準的美國國家標準研究院(American National Standard Institute).
這步操作,全美國都要感謝 ANSI,如果不是 ANSI 這麼及時的給 SQL 按上一個名分,三大資料庫軟體 Oracle, DB2, SQL Server 就只能在美國玩了。
ANSI 在 1986 年提出第一版 SQL 標準,簡稱 ANSI X3.135-1986 . 實際上, ANSI 與 ISO 一樣是個組織,自己本身並不開發任何標準,都是由認證成員自己提出標準,組織批准和認證。本質上來說, ANSI X3.135-1986 並不是 ANSI 自己提出的,而是 ANSI 認證的組織,叫做 Accredited Standards Committee (ASC) X3,就是現在的 INCITS,向 ANSI 提交的。ANSI X3.135-1986 一炮而紅之後, ISO 在 1987 年也就提出了 ISO 9075-1987 標準。從此 SQL 標準登錄了世界舞台。
如果說 ANSI X3.135-1986 催生了 ISO 9075-1987 ,那麼之後 ANSI 就順延了 ISO 的各種標準,ISO 有啥新標準,ANSI 就執行新標準。比如隨後的 SQL 新版本有 SQL89, SQL 92, SQL93, SQL2003, SQL2008, SQL2011,SQL2013, SQL2016, ANSI 也跟上了這些標準。
看到上面的故事,是不是已經窒息了,這麼枯燥,我都看不下去。讓我舉個更簡單的例子:比如我們費盡要考取的清華大學。
考入清華,是每個人的理想。但現實是這隻能成為大部分人的夢想。因為標準高啊。而一旦考入清華,再出來找工作,是不是簡單很多?HR 一聽清華出來的,眼睛都綠了。這就是清華認證的魅力。
當有一天,你經過千山萬水的努力,讓自己在德智體美勞全面開花了,終於進入清華了,發現這特么太簡單了,我要加大難度,於是把分數線提高了30分。你看,這就是改標準。於是,又有學弟學妹千山萬水的衝突了你的標準,進來了。這些學霸一看,這誰定的分數線,太簡單,於是又拉高了30分。成了標準清華標準3.0. 如此循環,生生不息。
你看,這就是標準組織與成員之間的互相促進。強者恆強!
03, T-SQL 的過去
- SQL 99 (included some OLAP concepts, Boolean data types, role-based access)
- SQL 2003 (included some XML features, windows functions, more OLAP features, and other features)
- SQL 2006 (includes more features related to Storing XML, XQuery, etc.)
- SQL 2008 (includes definitions for TRUNCATE statements, FETCH Clauses, INSTEAD OF)
- SQL 2011 (includes revisions for temporal data, some additional definitions for Windows Functions and also the FETCH clause
- SQL 2016 includes features related to JSON data, polymorphic table functions, and row pattern matching
- SQL 2019 is related to the multidimensional arrays
很多前端開發朋友都會問我,為什麼 SQL Server 不支援 Json 啊,這麼弱雞。我也只能笑笑,其實 SQL 也是受版本控制的,如果你也受到類似問題的困惑,大概上面的清單就可以幫助你。
T-SQL, Transaction-SQL,最先用於 Sybase, 之後 Sybase 移交給了 MS SQL Server, 自然 T-SQL 也是 SQL Server 的專屬語言了。
如果想要看 IBM 與 Microsoft 之間的恩怨,還有 Sybase 與 SQL Server 之間的蜜月,可以看這篇 《深扒SQL的歷史,說點秘密給你聽》,保證你大呼小叫。
在我看來,SQL Server 的更新版本是很快的,我從 SQL Server 2000開始用起來,慢慢熟悉了 T-SQL, Dts, Reporting. 當我主導完第一個 Cube 項目,收到集團公司的好評開始,我就斷定了,SQL Server 完全具備提供全套資訊服務工具的能力。當 SQL Server 2005 出來時,我毫不猶豫的就在公司的下一個 OLAP 中使用上了,SSIS/SSAS/SSRS 簡直就是福星。
拋去這些資料庫本身的特性帶來的震撼之外,T-SQL本身也在緊跟 SQL 標準發展。當我開始在項目中使用,OffSET … Rows Fetch Only…Rows, 身邊的朋友們還在放肆的大笑,這麼風騷的程式碼,也只有你黃師傅才敢寫。分頁不就是 RowNumber 嘛,搞那麼複雜。
哈哈,ISO SQL2011 標準早就有了,現在才用,是這些人太不懂SQL!
如果你們跟上了SQL的步伐,果斷採用新特性,我支援。並且有空就要給你們的朋友普及,雖然換來的可能是質疑的聲音,但不用多久,你就會得到他們的正面回饋「我X,你發我的新語法,管用,省事兒!」 這一切,都是值得的。
End