喜歡SQL。因為它有我喜歡的語言的幾個要素:
1. 扎實的數學基礎SQL的數學基礎是關系代數,你所編寫的SQL語句最終都可以翻譯為關系代數上的運算。這種扎實的數學基礎可以使語言具有良好而自洽的表達能力,同時不會因為一些不合理的Ad hoc設計而處處留坑。(數學基礎不強的語言基本上都有很多坑,比如早期的PHP)另外,你可以重新發明很多種SQL的方言(真的,Google里面就有好幾種)但萬變不離其宗,畢竟你不能重新發明關系代數。具有類似性質的好幾門語言,我都挺喜歡,比如:LISP,背后是λ演算,這個數學基礎給了LISP非常強大的表達能力;(雖然多數人不直接用LISP,但挺值得了解一下)至少,LISP給現在各種支持函數式編程的語言提供了借鑒;正則表達式。背后是正則文法。凡是可以使用正則文法定義的語言,都可以使用正則表達式定義。當然,可能因為正則表達式太成功,經常有人試圖用它來匹配各種編程語言的代碼,這基本上是肯定要出bug的。原因很簡單,多數主流編程語言都是『上下文無關語言』,它是正則語言的超集;BNF,背后是上下文無關文法。這也是為什么各種編程語言(即使復雜如C++或C#,還包括SQL和正則表達式)的spec,甚至不少『標準格式』(如JSON,URI等)的spec 都喜歡用BNF或EBNF定義。更好玩的是,當你用BNF定義好一門語言時,還可以使用一種稱為編譯器之編譯器(Compiler's Compiler)的程序(如YACC及各語言上的移植,ANTLR等)來生成這門語言的解析程序!為什么能做到這么利害的功能?這涉及到編譯原理的很多知識,但歸根到底,就是上下文無關文法的數學基礎。
2. 平易近人的語法糖衣SQL以自然語言英語為藍本設計,易學易記,很多非專業編程人員也能很快掌握。(不會編程但會寫SQL的,我們把他們稱為數據分析師 (逃))不要當作這點是理所當然的。同樣基于關系代數,你可以基于LISP采用的S-expression來設計一門有與SQL同樣表達能力的語言,還可以基于JSON來設計一門有與SQL同樣表達能力的語言(比如Mongo DB的JSON API,如果你把它看作一門語言的話)但非專業編程人員可能就沒有那么容易上手了。
3. 解決了重要的問題SQL解決了結構化數據的查詢和更新問題。這種能力使得它在編程界幾乎無處不在。你的手機上可能跑著很多個SQLlite的數據庫;你訪問的很多中小型網站,可能跑著很多MySQL數據庫。你存錢的銀行,很可能跑著許多Oracle的數據庫。這些數據庫都主要以SQL作為查詢和操作數據的語言。就算強如Google,能夠設計出有全球擴展性和異地容災的分布式數據庫F1(見https://research.google.com/pubs/pub38125.html ),也得乖乖地提供SQL語言的支持。
4. 高級聲明式語言SQL通常被j認為是第四代編程語言,語言每過一代通過意味著它有高一個層次的抽象(抽象層次:機器語言 < 匯編語言 < 多數高級編程語言 < SQL)注意抽象的層次和語言是否優秀并沒有必然關系,也不意味著高抽象層次的語言可以完全替代低抽象層次的語言。但是高級的抽象往往意味著編程人員可以更少地關心實現細節,更多地關心業務邏輯的表達。使用SQL時,普通用戶主要關心的是如何表達查詢的邏輯,也就等價于關系代數上的運算。至于這種運算如何翻譯成具體的執行計劃(Execution Plan),使用哪些算法和數據結構進行高效存取和運算則交給了數據庫去完成。當然,高級用戶也可以通過各種手段去優化SQL的執行(比如表設計、建立合適的索引、改寫優化器無法良好優化的查詢等)。-------------------------(現在是我這邊深夜了,下次再更)