SQL

SQL（或，Structured Query Language，結構化查詢語言）是一種特定目的程式語言，用於管理關係資料庫管理系統（RDBMS），或在關係流資料管理系統（RDSMS）中進行流處理。

20 世紀 70 年代推出的 SQL 相比早期的讀寫 API（如 ISAM 或 VSAM）具有兩大優勢：首先，它引入了用一條命令訪問多條記錄的概念；其次，它消除了指定如何訪問記錄的需求（即無論是否使用索引）。

SQL 最初基於關係代數和元組關係演算，包含多種型別的語句，這些語句可被非正式地歸類為以下子語言：資料查詢語言（DQL）；資料定義語言（DDL）；資料控制語言（DCL）；資料操作語言（DML）。

SQL 的應用範圍涵蓋了資料查詢、資料操作（插入、更新和刪除）、資料定義（模式建立與修改）以及資料訪問控制。儘管 SQL 本質上是一種宣告式語言（第四代語言），但它也包含了過程式元素。

SQL 是最早採用埃德加・F・科德提出的關係模型的商用語言之一。該模型在他 1970 年發表的具有重大影響力的論文《大型共享資料庫的關係資料模型》中被詳細闡述。儘管 SQL 並未完全遵循科德所描述的關係模型，但它仍然成為了使用最為廣泛的資料庫語言。

SQL 在 1986 年成為美國國家標準學會（ANSI）的一項標準，在 1987 年成為國際標準化組織（ISO）標準。此後，這一標準經過了一系列的增訂，加入了大量新特性。雖然有這一標準的存在，但大部分的 SQL 程式碼在不同的資料庫系統中並不具有完全的跨平臺性。

歷史

在 1970 年代初，由 IBM 研究院下屬的埃德加・科德發表將資料組成表格的應用原則（Codd's Relational Algebra）。1974 年，同一實驗室的和參考了科德的模型後，在研製關係資料庫管理系統中，開發出了一套規範語言 SEQUEL（Structured English Query Language，結構化英語查詢語言），並在 1976 年 11 月的《》上公佈新版本的 SQL（叫 SEQUEL/2）。1980 年改名為 SQL。

1979 年，甲骨文公司（當時名為關係式軟體公司）首先提供商用的 SQL，IBM 公司在 DB2 和 SQL/DS 資料庫系統中也實現了 SQL。

1986 年 10 月，美國 ANSI 採用 SQL 作為關係資料庫管理系統的標準語言（ANSI X3. 135-1986），後為國際標準化組織（ISO）採納為國際標準。

1989 年，美國 ANSI 採納在 ANSI X3.135-1989 報告中定義的關係資料庫管理系統的 SQL 標準語言，稱為 ANSI SQL 89，該標準替代 ANSI X3.135-1986 版本。該標準為下列組織所採納：

國際標準化組織，為 ISO 9075-1989 報告《Database Language SQL With Integrity Enhancement》
美國聯邦政府，釋出在《The Federal Information Processing Standard Publication (FIPS PUB) 127》

目前，所有主要的關係資料庫管理系統支援某些形式的 SQL，大部分資料庫至少遵守 ANSI SQL89 標準。

標準在交叉連線（cross join）和內部連線之上，新增加了外部連線，並支援在 FROM 子句中寫連線表示式。支援集合的並運算、交運算。支援 Case (SQL) 表示式。支援 CHECK 約束。建立臨時表。支援 cursor。支援事務隔離。

語法

SQL 語言分成了幾種要素，包括：

子句，是語句和查詢的組成成分。（在某些情況下，這些都是可選的。）
表示式，可以產生任何標量值，或由列和行組成的資料庫表
謂詞，給需要評估的 SQL 三值邏輯（3VL）（true/false/unknown）或布林真值指定條件，並限制語句和查詢的效果，或改變程式流程。
查詢，基於特定條件檢索資料。這是 SQL 的一個重要組成部分。
語句，可以持久地影響綱要和資料，也可以控制資料庫事務、程式流程、連線、會話或診斷。
SQL 語句也包括分號（";"）語句終結符。儘管並不是每個平臺都必需，但它是作為 SQL 語法的標準部分定義的。
無意義的空白在 SQL 語句和查詢中一般會被忽略，更容易格式化 SQL 程式碼便於閱讀。

語言特點

SQL 是高階的非過程化程式語言，它允許使用者在高層資料結構上工作。它不要求使用者指定對資料的存放方法，也不需要使用者瞭解其具體的資料存放方式。而它的介面，能使具有底層結構完全不同的資料庫系統和不同資料庫之間，使用相同的 SQL 作為資料的輸入與管理。它以記錄專案〔records〕的合集（set）〔項集，record set〕作為操縱物件，所有 SQL 語句接受項集作為輸入，回送出的項集作為輸出，這種項集特性允許一條 SQL 語句的輸出作為另一條 SQL 語句的輸入，所以 SQL 語句可以巢狀，這使它擁有極大的靈活性和強大的功能。在多數情況下，在其他程式語言中需要用一大段程式才可實踐的一個單獨事件，而其在 SQL 上只需要一個語句就可以被表達出來。這也意味著用 SQL 可以寫出非常複雜的語句，在不特別考慮效能下。

SQL 同時也是資料庫檔案格式的副檔名。

SQL 包含四個部分：

資料定義語言
資料操縱語言
資料控制語言
事務控制語言

3.1 SQL 函式

互操作性和標準化

供應商之間的 SQL 實現不相容，不一定完全遵循標準。各種資料庫的 SQL 方言通常不可移植，特別是在日期時間語法、字串連線、NULL、比較的大小寫敏感方面。只有 PostgreSQL 與 Mimer SQL 努力遵從標準。

4.1 標準化歷史

SQL 在 1986 年被 ANSI 標準化，1987 年被 ISO 標準化。由維護。標準名稱通常為如下模式：ISO/IEC 9075-n:yyyy Part n: title。

4.2 當前標準

該標準通常用以下模式表示：ISO/IEC 9075-n：yyyy 第 n 部分：標題，或者簡稱為 ISO/IEC 9075。

ISO / IEC 9075 補充了 ISO / IEC 13249：SQL 多媒體和應用程式包（SQL/MM），該程式包定義了基於 SQL 的介面和包，給諸如影片，音訊和空間資料之類的廣泛的應用程式。感興趣的各方可以從 ISO、IEC 或 ANSI 購買 SQL 標準文件。SQL：2008 的草稿可作為 zip 存檔免費獲得。

4.2.1 SQL 標準剖析

SQL 標準包含 10 部分：

ISO/IEC 9075-1:2016 Part 1: Framework (SQL/Framework). 提供邏輯概念
ISO/IEC 9075-2:2016 Part 2: Foundation (SQL/Foundation). 包含語言的主要內容，強制與可選特性。
ISO/IEC 9075-3:2016 Part 3: Call-Level Interface (SQL/CLI). 定義了介面成分 (structures, procedures, variable bindings) 用於編寫能執行 SQL 的應用程式的語言：Ada，C/C++，COBOL，Fortran，MUMPS，Pascal，PL/I。對於 Java 語言見標準第 10 部分。ODBC 是一個著名的 SQL/CLI 的超集。這部分標準主要包含強制的特性。
ISO/IEC 9075-4:2016 Part 4: Persistent stored modules (SQL/PSM)。SQL 的過程式擴充套件，包括控制流、條件處理、語句條件 signals 與 resignals、cursors、本地變數、表示式賦值到變數與引數。此外，SQL/PSM 形式化宣告與維護了持續性（persistent）資料庫語言例程（例如儲存過程）。這部分標準主要包含可選的特性。
Part-6: Support for JavaScript Object Notation (JSON). 2017 年首次整合 JSON 資料型別到 SQL 標準。
ISO/IEC 9075-9:2016 Part 9: Management of External Data (SQL/MED). 這部分標準主要包含可選的特性。
ISO/IEC 9075-10:2016 Part 10: Object language bindings (SQL/OLB)。定義了 SQLJ，SQL 嵌入到 Java，保證了 SQLJ 應用程式二進位制可移植。這部分標準主要包含可選的特性。
ISO/IEC 9075-11:2016 Part 11: Information and definition schemas (SQL/Schemata). 定義了 Information Schema 與 Definition Schema，提供了常用工具集使得 SQL 資料庫與物件自描述。這些工具包括 SQL object identifier、structure 與 integrity constraints、security 與 authorization specifications, features 與 packages。這部分標準主要包含強制與可選的特性。
ISO/IEC 9075-13:2016 Part 13: SQL Routines and types using the Java TM programming language (SQL/JRT). SQL 應用程式呼叫靜態方法作為子程式的能力 ('Java-in-the-database')；Java 類作為 SQL 結構化使用者定義型別。這部分標準主要包含可選的特性。
ISO/IEC 9075-14:2016 Part 14: XML-Related Specifications (SQL/XML). 這部分標準主要包含可選的特性。
ISO/IEC 9075-15:2019 Part 15: 多維陣列 (SQL/MDA)。 它為 SQL 指定了多維陣列型別（MDarray），以及對 MDarray，MDarray 切片，MDarray 單元和相關功能的操作。 標準的這一部分僅包含可選功能。

4.2.2 ISO / IEC 標準的擴充套件

ISO/IEC 9075 被 ISO/IEC 13249: SQL Multimedia and Application Packages (SQL/MM) 補充。後者定義了基於 SQL 的音影片、空間資料的介面與包。包括：

ISO/IEC 13249-1:2016 Part 1: Framework
ISO/IEC 13249-2:2003 Part 2: Full-Text
ISO/IEC 13249-3:2016 Part 3: Spatial
ISO/IEC 13249-5:2003 Part 5: Still image
ISO/IEC 13249-6:2006 Part 6: Data mining
ISO/IEC 13249-7:2013 Part 7: History
ISO/IEC 13249-8:xxxx Part 8: Metadata Registry Access MRA (work in progress)

安全問題

由於 SQL 指令在部份進階使用時，語法會依照特定條件來變換，而且若是表格中的欄位過多時，許多開發人員都會習慣以字串組立的方式建立 SQL 指令，而且又使用系統管理員級的帳戶連到資料庫，因此讓駭客有機會利用 SQL 的組立方式進行攻擊，像是在指令中新增部份刺探性或破壞性的指令（例如 DROP TABLE、DROP DATABASE 或是 DELETE * FROM myTable 等具破壞性的指令），讓資料庫的資料或實體伺服器被破壞，導致服務中斷或是系統癱瘓等後果，或是以邏輯的漏洞，在密碼欄寫入特殊字串 (例如 ' or '1'='1)，讓該字串形成的邏輯判斷永遠為真，或直接取得非查詢條件的資料，而不需要知道密碼，以達成非法登入系統的目的，此種攻擊手法稱為 SQL 注入（SQL injection）。

目前實務上較有效的防禦方法，就是全面改用引數化查詢。