作者 | 董旭陽TonyDong
出品 | CSDN博客
封圖 | CSDN付費下載於視覺中國
![春眠不觉晓,SQL 知多少?| 原力计划](http://p2.ttnews.xyz/loading.gif)
SQL 的誕生
一九七零年,那是一個夏天。
有一位來自 IBM 聖約瑟研究實驗室的高級研究員 Edgar Frank Codd 在 Communications of ACM 上發表了名為《A Relational Model of Data for Large Shared Data Banks》的文章,從而創建了關係數據模型。時至今日,基於該模型的關係數據庫仍然是數據庫領域的主流;數據庫排名網站 DB-Engines 給出了各類數據庫的排名。
Codd 也因此在 1981 年獲得了計算機領域最高獎圖靈獎,被人們稱為關係數據庫之父。
1974 年,同樣是來自 IBM 的 Donald D. Chamberlin 和 Raymond F. Boyce 基於關係模型開發了 SQL 的初始版本:SEQUEL(Structured English Query Language)。SEQUEL 被設計用於 IBM 最初的準關係數據庫管理系統 SystemR。IBM 隨後基於其 SystemR 原型開發商業產品,分別於 1979 年、1981 年和 1983 年上市了 system/38、SQL/DS 和 DB2 數據庫管理系統。
不過早在 1979 年 6 月,Relational Software,Inc.(現在的 Oracle 公司)發現了關係模型的潛力,開發出了第一個商用 SQL 實現:Oracle V2(Version2)。隨著收購開源數據庫 MySQL,Oracle 公司已經牢牢佔據了數據庫市場的領先地位,同時也導致了 MariaDB 分支的出現。
SQL 是關係模式的第一個商業實現,同時也是最成功的一個實現。SQL 是使用最廣泛的數據庫查詢語言。
SQL 標準化
時間來到了 1986 年,美國國家標準學會(ANSI)首先發布了 SQL 標準;隨後 ISO 標準組織於 1987 年創建了“數據庫語言 SQL”標準。在經歷了 1989、1992、1996、1999、2003、2006、2008、2011、2016 以及 2019 年的多次修訂之後,如今的 SQL 標準包含了大量的功能,內容多達數千頁。
目前,ISO 組織正則定製第 16 部分,屬性圖查詢(SQL/PGQ)。此前,Neo4j 於 2019 年 9 月 17 宣佈圖形查詢語言(GQL)成為了繼 SQL 之後另一種新的 ISO 標準數據庫查詢語言。
新的第 16 部分(SQL/PGQ)主要是為了在 SQL 中直接提供一些 GQL 功能。
SQL:2019
目前最新的 SQL 標準是 SQL:2019,增加了第 15 部分:ISO/IEC 9075-15:2019 多維數組(SQL/MDA)。SQL/MDA 允許存儲、訪問和處理規模的多維數組,例如 N 通道的衛星圖像。這意味著 SQL 現在可以解碼圖像,並且通過像素座標直接訪問和處理圖像區域。
以下是當前 SQL 標準的組成部分,其中有一些編號被棄用:
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)
ISO 組織提供了一些相關的技術報告:
https://standards.iso.org/ittf/PubliclyAvailableStandards/
SQL:2016
SQL:2016 增加了 44 個可選的新特性,其中 22 個與 JSON 功能相關,10 多個與多態表函數相關。
-
JSON:創建 JSON 文檔、訪問 JSON 文檔節點以及 JSON 格式驗證的函數。
行模式識別:通過 MATCH_RECOGNIZE 子句指定一個跨行匹配的模式(正則表達式),同時可以對這些匹配的行組進行過濾、分組和聚合操作。行模式識別可以用於分析數據流或者時間序列數據,例如股票行情或事件日誌。
日期和時間的格式化與解析。
LISTAGG 函數:可以將多行數據轉換成指定分隔符的字符串。
多態表函數:不需要預先定義返回類型的表函數,允許開發人員利用動態 SQL 創建強大而複雜的自定義函數。
新的數據類型 DECFLOAT。
這篇文章詳細介紹了 SQL:2016 的新功能:https://modern-sql.com/blog/2017-06/whats-new-in-sql-2016
SQL:2011
SQL:2011 最主要的新功能之一就是增強了對時態數據庫的支持,具體包括:
時段定義:使用兩個標準的字段作為一個時段的開始和結束,包含開始時間點、不包含結束時間點。這種方式與已有的數據模型、應用程序以及工具一致。
使用 PERIOD FOR 定義應用程序時段表(也稱為有效時間表)。
使用自動時段拆分更新和刪除應用程序的時間數據行。
通過 WITHOUT OVERLAPS 子句為應用程序時間段增加可選的非重疊約束,構成時態主鍵。
支持應用程序時間表的時間引用完整性約束。
使用常規查詢語法或者為時段數據定義的新的時態謂詞查詢應用程序時間表,包括 CONTAINS、OVERLAPS、EQUALS、PRECEDES、SUCCEEDS、IMMEDIATELY PRECEDES、IMMEDIATELY SUCCEEDS。
使用 PERIOD FOR SYSTEM_TIME 和 WITH SYSTEM VERSIONING 選項定義系統版本表(也稱為事務時間表)。系統時間段由數據庫自動維護。系統版本表的約束不要求是時態約束,並且只在當前的數據行上強制執行。
使用 AS OF SYSTEM TIME 和 VERSIONS BETWEEN SYSTEM TIME … AND 子句查詢系統時間表中的時間切片和順序數據。
應用程序時間和系統版本可以一起使用,構成雙重時態表。
這篇文章介紹了 SQL:2011 的新特性:
https://sigmodrecord.org/publications/sigmodRecord/1203/pdfs/10.industry.zemke.pdf
這個網站可以下載一些 SQL 標準草稿文件:https://www.wiscorp.com/SQLStandards.html
https://sigmodrecord.org/publications/sigmodRecord/1209/pdfs/07.industry.kulkarni.pdf
SQL:2008
SQL:2008 新增的功能主要包括:
增強了 MERGE 和 DIAGNOSTIC 語句。
支持 TRUNCATE TABLE 語句
CASE 表達式支持逗號分隔的 WHEN 子句。
INSTEAD OF 觸發器。
JOIN 分區表。
FETCH 子句。
允許遊標定義之外的 ORDER BY。
支持各種 XQuery 正則表達式/模式匹配。
派生字段名增強。
SQL:2006
SQL:2006 定義了 SQL 操作 XML 的方式。它定義了在 SQL 數據庫中導入和存儲 XML 數據、在數據庫中操作 XML 數據,以及以 XML 形式發佈 XML 和常規 SQL 數據的方法。此外,它還允許應用程序將查詢與 XQuery 集成到 SQL 代碼中,以便同時訪問 SQL 數據和 XML 文檔。
SQL:2003
SQL:2003 標準引入的新功能主要包括:
XML 相關功能(SQL/XML)。
窗口函數(分析函數)。
序列生成器,用於定義序列(sequence)。
兩種新的字段類型:自動生成值(generated always as)和標識列(identity)。
合併語句(MERGE)。
CREATE TABLE 擴展,支持“CREATE TABLE AS”和“CREATE TABLE LIKE”。
刪除了 BIT 和 BIT VARYING 數據類型。
OLAP 功能擴展,支持窗口函數。
這裡是一些關於 SQL:2003 標準的文檔:http://www.wiscorp.com/sql_2003_standard.zip
SQL:1999
SQL:1999 增加了大量的新功能,並且將 SQL 標準分為了幾個部分。
數據類型:支持布爾數據類型,用戶定義的獨特類型,用戶定義的結構類型。
通用表表達式和遞歸查詢。
OLAP 功能:GROUP BY 支持 ROLLUP、CUBE 以及 GROUPING SETS 選項。
基於角色的訪問控制,CREATE ROLE 語句。
UNNEST 關鍵字。
正則表達式匹配。
觸發器。
支持過程或控制流語句。
Java 中使用 SQL(SQL/OLB)以及 SQL 中使用 Java(SQL/JRT)。
這個網站提供了完整的 SQL:1999 教程:https://crate.io/docs/sql-99/en/latest//index.html
SQL-92
SQL-92 主要的新增功能包括:
新的數據類型:DATE、TIME、TIMESTAMP、INTERVAL、BIT 字符串、VARCHAR 以及 NATIONAL CHARACTER 。
支持除了表示 SQL 語句之外的其他字符集。
新的標量運算,例如字符串連接和獲取子串、日期和時間運算以及條件語句。
新的集合運算,例如 UNION JOIN、NATURAL JOIN、集合的差集以及交集。
CASE 條件表達式。
支持 ALTER 和 DROP 修改模式定義。
C、Ada 以及 MUMPS 語言綁定。
用戶權限。
新的完整性檢查,例如 CHECK 約束。
新的 information schema,定義了關於元數據的只讀視圖,例如 SELECT * FROM INFORMATION_SCHEMA.TABLES 可以查看數據庫中的表。
查詢語句的動態執行(非預編譯語句)。
更好地支持遠程數據庫訪問。
臨時表,CREATE TEMP TABLE 等。
事務隔離級別。
通過 CAST (expr AS type) 動態修改數據類型。
可移動的遊標。
兼容性標識,可以定義與其他 SQL 標準的前向以及後向兼容。
隨後,SQL 標準發佈了兩個重要的擴展:
1995 年的 SQL/CLI(調用級接口);
1996 年的 SQL/PSM(存儲過程)。
這裡是一篇 SQL-92 標準的原文:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
語言特性
SQL(Structured Query Language)是用於管理關係型數據庫或者關係型數據流管理系統的專用語言。SQL 是一種聲明式的語言,類似於英語。以下是一個查詢語句:
-- 註釋:查詢員工信息
SELECT emp_name, sex, salary * 12
FROM employee
WHERE emp_id = 1;
SQL 語句由幾個部分組成:
子句, 它們是 SQL 語句組成部分。上面的示例中有 SELECT、FROM 和 WHERE 三個子句。
表達式,結果可以是一個標量值,也可以是一個結果集。salary * 12 就是一個表達式。
謂詞,用於指定一個過濾條件,通常出現在 WHERE 子句中。emp_id = 1 用於過濾編號等於 1 的員工。
常量,指定一個字面常量值。例如 3.14、‘SQL’ 和 ‘2020-02-26’ 等。
標識符,用於指定數據庫中的對象,例如表、字段等。示例中的 emp_name、employee 都是標識符。
註釋,使用 -- 開始的行或者 /* */ 之間的內容表示註釋。註釋不會被執行,用於幫助我們理解代碼。
分號,表示語句的結束。
另外,SQL 中一些具有固定意義的單詞被稱為關鍵字,例如 SELECT、CREATE、BEGIN 等。關鍵字一般大寫。
SQL 基於關係代數與元組關係演算,表和查詢結果都是由行(元組)的組成的集合;不同之處在於 SQL中的相同行可以出現多次,並且可以指定查詢結果的順序(ORDER BY)。
語句分類
SQL 提供的主要功能包括:數據定義、數據操作、數據查詢以及數據訪問控制等。
數據定義語言 DDL,定義數據庫的邏輯結構,包括數據庫、表、視圖和索引等。主要的語句有 CREATE、ALTER 和 DROP 等。
數據操作語言 DML,包括數據的增加(INSERT)、修改(UPDATE)、刪除(DELETE)以及合併(MERGE)。
數據查詢語言 DQL,SELECT 語句,用於查詢數據。
數據控制語言 DCL,對於控制用戶對數據的訪問權限。包括授權(GRANT)和撤銷(REVOKE)。
事務控制語言 TCL,用於管理數據庫事務。包括 BEGIN 、COMMIT、ROLLBACK 等。
除了這些聲明式的語句之外,SQL 也定義了過程語言的擴展(SQL/PSM),也就是存儲過程。
SQL 實現
基於以上 SQL 標準,許多廠商和組織實現了自己的數據庫產品。常見的數據庫產品包括:
Oracle,第一個商業 SQL 數據庫,也是數據庫領域的領導者。Oracle 數據庫支持關係數據、列式、XML、JSON、空間、圖形和非結構化數據,最新的版本為 Oracle Database 19c。Oracle Database Express Edition 是一個免費版本。
MySQL,最流行的開源關係數據庫。MySQL 支持關係數據、文檔存儲以及 KV 存儲,最新版本為 MySQL 8.0。MySQL 還有一些衍生版本,例如 MariaDB、Percorna Server。
Microsoft SQL Server,Microsoft 的關係數據庫產品,支持關係數據、文檔和圖形數據。最新的版本為 SQL Server 2019,支持 Windows 和 Linux 系統。
PostgreSQL,最先進的開源關係數據庫,支持關係數據、文檔和圖形數據。最新版本為 PostgreSQL 12.2。
SQLite,最流行的嵌入式數據庫。SQLite 是安裝最多的數據庫,最新版本為 SQLite 3.31。
雖然這些數據庫大部分的 SQL 語句相同,但是它們都提供了自己的擴展語法和功能;因此,我們通常不能直接將一種數據庫中的代碼遷移到另一種數據庫,需要進行一些代碼修改。
除此之外,這些數據庫還實現了自己的存儲過程,增加了一些編程元素。例如變量定義、控制流語句、異常處理等。
這篇文章列出了 11 種常見數據庫對於 SQL 的功能實現和示例,包括 Oracle、PostgreSQL、SQL Server、IBM DB2、MySQL、MariaDB、Firebird、H2、HSQLDB、Derby 以及 SQLite:
https://www.sql-workbench.eu/dbms_comparison.html
NewSQL
除了基於關係模型的傳統數據庫之外,市場上還出現了許多 NoSQL 數據庫。例如 MongoDB、Redis、Apache Cassandra 等。NoSQL 數據庫提供了更高的可用性和可擴展性,通過放棄強一致性大幅提升性能,並且沒有固定模式的限制。
但是由於 NoSQL 數據庫不支持事務的強一致性(ACID),無法適應業務關鍵性的應用;而且NoSQL 數據庫不提供 SQL 接口,各種系統使用自己的實現。
因此,出現了一種新型的數據庫 NewSQL。簡單來說,NewSQL = SQL + NoSQL 。NewSQL 即提供了與 NoSQL 相同的可擴展性,也保留了關係數據庫的 ACID 事務特性和標準的 SQL 接口。
常見的 NewSQL 產品包括:VoltDB、TiDB、MemSQL。
原文鏈接:https://blog.csdn.net/horses/article/details/104451843
閱讀更多 CSDN 的文章