1 歷史背景
1970 年 IBM 的 E.F. Codd 博士發表了論文https://link.springer.com/chapter/10.1007/978-3-642-59412-0_16
並創建了關係模型,通過一個簡單的二維表結構實現數據的存儲。
1979 年 Relational Software, Inc.(後來改名為 Oracle)
發佈了第一個商用的關係數據庫產品。隨後出現了大量的關係數據庫管理系統,包括 MySQL、SQL Server、PostgreSQL 以及大數據分析平臺 Apache Hive、Spark SQL、Presto 等。至今,關係數據庫仍然是數據庫領域的主流。
以下是著名的數據庫系統排名網站 https://db-engines.com/en/ranking 上各種數據庫的排名情況,關係數據庫佔據了絕對的優勢。
2 SQL(Structured Query Language,結構化查詢語言)
SQL 是訪問和操作關係數據庫的標準語言。只要是關係數據庫,都可以使用 SQL 進行訪問和控制。SQL 同樣由 IBM 在
1970s 開發1986 年成為 ANSI 標準在 1987 年成為 ISO 標準SQL 標準隨後經歷了多次修訂,最新的版本為 SQL:2019,增加了多維數組(MDA)的支持。下圖是 SQL 標準的發展歷程和主要的新增功能。
對於 SQL 標準,最熟悉的就是 SQL92 或者 SQL99。但實際上經過多次修改,SQL 早已不是 40 年前的 SQL;如今它已經相當完備,功能強大,並且能夠同時支持關係模型和非關係(XML、JSON)模型。具體來說,最新的 SQL 標準包含 10 個部分:
ISO/IEC 9075-1 信息技術 – 數據庫語言 – SQL – 第1部分:框架(SQL/框架)ISO/IEC 9075-2 信息技術 – 數據庫語言 – SQL – 第2部分:基本原則(SQL/基本原則)ISO/IEC 9075-3 信息技術 – 數據庫語言 – SQL – 第3部分:調用級接口(SQL/CLI)ISO/IEC 9075-4 信息技術 – 數據庫語言 – SQL – 第4部分:持久存儲模塊(SQL/PSM)ISO/IEC 9075-9 信息技術 – 數據庫語言 – SQL – 第9部分:外部數據管理(SQL/MED)ISO/IEC 9075-10 信息技術 – 數據庫語言 – SQL – 第10部分:對象語言綁定(SQL/OLB)ISO/IEC 9075-11 信息技術 – 數據庫語言 – SQL – 第11部分:信息與定義概要(SQL/Schemata)ISO/IEC 9075-13 信息技術 – 數據庫語言 – SQL – 第13部分:使用 Java 編程語言的 SQL 程序與類型(SQL/JRT)ISO/IEC 9075-14 信息技術 – 數據庫語言 – SQL – 第14部分:XML 相關規範(SQL/XML)ISO/IEC 9075-15 信息技術 – 數據庫語言 – SQL – 第15部分:多維數組(SQL/MDA)為了便於學習,通常將主要的 SQL 語句分為以下幾個類別:
SQL 是一種標準,不同廠商基於 SQL 標準實現了自己的數據庫產品,例如 Oracle、MySQL 等。這些數據庫都在一定程度上兼容 SQL 標準,具有一定的可移植性。但另一方面,它們都存在許多專有的擴展,沒有任何一種產品完全遵循標準。
NoSQL
隨著互聯網的發展和大數據的興起,出現了各種各樣的非關係(NoSQL)數據庫。NoSQL 代表 Not only SQL,表明它是針對傳統關係數據庫的補充和升級,而不是為了替代關係數據庫。
NoSQL 數據庫主要用於解決關係數據庫在某些特定場景下的侷限性,比如海量存儲和水平擴展;但同時也會為此犧牲某些關係數據庫的特性,例如對事務強一致性的支持和標準 SQL 接口。因此,這類數據庫主要用於對一致性要求不是非常嚴格的互聯網業務。常見的 NoSQL 數據庫可以分為以下幾類:
另一方面,關係數據庫也在積極擁抱變化,添加了許多非關係模型(XML 和 JSON)支持。以最流行的開源關係數據庫 MySQL 為例,最新的 MySQL 8.0 版本增加了 JSON 文檔存儲的支持,並且推出了一個新的概念:NoSQL + SQL = MySQL。以下是 MySQL 官方的宣傳圖。
Oracle、SQL Server 以及 PostgreSQL 同樣也進行了類似的擴展,可以支持原生的 XML 和 JSON 數據,並且提供了許多標準的 SQL 接口。
NewSQL
為了同時獲得關係數據庫對於事務的支持和標準的 SQL 接口,以及非關係數據庫的高度擴展性和高性能。如今市場上已經出現了一類新型關係型數據庫系統:NewSQL 數據庫。
比較有代表性的 NewSQL 數據庫包括 Google Spanner、VoltDB、PostgreSQL-XL 以及國產的 TiDB。這類新型數據庫是數據庫領域最新的發展方向,有志於在數據庫行業發展的同學可以加以關注。
誰要學習 SQL?
讓我們回到專欄的主題,為什麼要學習 SQL 呢?簡單來說,因為有用。下圖是 Stack Overflow 在 2019 年關於最流行編程技術的調查結果。
作為數據處理領域的專用語言,SQL 排在了第三位,超過 50% 的開發者都需要使用到 SQL。那麼,具體什麼職位需要使用 SQL,用 SQL 來做什麼?
數據分析師:顯然這是一群依靠分析數據為生的人,必不可少需要與數據庫打交道,SQL 是他們必備技能之一。數據科學家:與數據分析師一樣,數據科學家的日常工作也離不開數據的處理,不可避免需要使用 SQL。數據庫開發工程師:這個職位基本就是寫 SQL 代碼,實現業務邏輯。數據庫管理員:也就是 DBA,主要職責是管理和維護數據庫,除了會寫 SQL,還需要負責審核開發人員編寫的 SQL 代碼。後端工程師:後端開發必然需要涉及數據的處理,需要通過 SQL 與數據庫進行交互。全棧工程師:既然是全棧,自然包括後端數據的處理。移動開發工程師:作為一名移動開發工程師,一定對 SQLite 數據庫不會陌生,它是在移動設備中普遍存在的嵌入式數據庫。產品經理:產品經理需要了解產品的情況,而數據是最好的說明方式,瞭解 SQL 非常有利於對產品的把握。SQL 不但應用廣泛,而且簡單易學。因為它在設計之初就考慮了非技術人員的使用需求,SQL 語句全都是由簡單的英語單詞組成,使用者只需要聲明自己想要的結果,而將具體的實現過程交給數據庫管理系統。
學習編程,你可能會猶豫選擇 C++ 還是 Java;入門數據科學,你可能會糾結於選擇 Python 還是 R;但無論如何,SQL 都是 IT 從業人員不可或缺的一項技能!
教程內容
本專欄主要討論 SQL 編程技術和思想,分為四個部分:基礎篇、進階篇、開發篇以及擴展篇。