結構化查詢語言/SQL:一種用於處理關係型資料庫管理系統 (RDBMS) 的語言
如上所述,RDBMS 使用諸如投影、選擇、聯接、集合運算(並集、差集和交集)等關係代數操作對資料進行操作。關係代數的操作是用一種高度形式化且對終端使用者難以理解的數學語言表示的,並且可能也對許多軟體工程師難以理解。因此,RDBMS 提供了關係代數之上的一層,這層易於理解,但可以對映到底層的關係操作。自 20 世紀 70 年代以來,我們看到了一些執行此工作的語言;其中之一是 SQL - 另一個例子是QUEL。在 20 世紀 80 年代初(由於商標問題,從其原始名稱SEQUEL重新命名後),SQL 實現了市場主導地位。1986 年,SQL 首次被標準化。當前版本是SQL 2023。
SQL 的標記和語法是基於英語口語來建模的,以儘可能降低訪問門檻。像UPDATE employee SET salary = 2000 WHERE id = 511;這樣的 SQL 命令與句子“將 id 為 511 的員工的薪水更改為 2000”相差不遠。
SQL 的關鍵字可以以任何大小寫字元組合表示,即關鍵字不區分大小寫。在 SQL 程式碼中寫UPDATE, update, Update, UpDate或任何其他大小寫組合都沒有區別。
接下來,SQL 是一種描述性語言,而不是過程式語言。它沒有規定關係操作的所有方面(哪個操作,它們的順序,...),這些操作是根據給定的 SQL 語句生成的。RDBMS 可以從一個語句中生成多個執行計劃。它可以將多個生成的執行計劃進行比較,並在給定情況下執行它認為最好的執行計劃。此外,程式設計師無需考慮資料訪問的所有細節,例如:如果將一組 WHERE 條件與 AND 組合使用,應該首先評估哪一個條件?
儘管有上述簡化,但 SQL 非常強大。它允許使用單個語句對一組資料記錄進行操作。UPDATE employee SET salary = salary * 1.1 WHERE salary < 2000;將影響所有實際薪水低於 2000 的員工記錄。可能會有成千上萬條這樣的記錄,也可能只有幾條或甚至沒有。該操作也可能取決於資料庫中已有的資料;語句SET salary = salary * 1.1導致薪水提高 10%,對於某個員工可能是 120,而對於另一個員工可能是 500。
SQL 的設計者試圖正交地定義語言元素。其中包括,任何語言元素都可以在語句的所有位置使用,在這些位置可以使用該元素的結果。例如:如果您有一個函式 power(),它接受兩個數字並返回另一個數字,您可以在允許使用數字的所有位置使用此函式。以下語句在語法上是正確的(如果您已定義函式 power())- 並導致相同的輸出行。
SELECT salary FROM employee WHERE salary < 2048;
SELECT salary FROM employee WHERE salary < power(2, 11);
SELECT power(salary, 1) FROM employee WHERE salary < 2048;
正交性的另一個例子是在 UPDATE、INSERT、DELETE 中或在另一個 SELECT 語句中使用子查詢。
但是,SQL 並非沒有冗餘。通常有幾種可能的表述來表達相同的情況。
SELECT salary FROM employee WHERE salary < 2048;
SELECT salary FROM employee WHERE NOT salary >= 2048;
SELECT salary FROM employee WHERE salary between 0 AND 2048; -- 'BETWEEN' includes edges
這是一個非常簡單的例子。在複雜的語句中,可能需要在聯接、子查詢和exists謂詞之間進行選擇。
核心 SQL 由語句組成。語句由關鍵字、運算子、值、系統和使用者物件或函式的名稱組成。語句以分號結束。在語句SELECT salary FROM employee WHERE id < 100;中,標記 SELECT、FROM 和 WHERE 是關鍵字。salary、employee 和 id 是物件名稱,“<”符號是運算子,“100”是值。
SQL 標準將語句組織成九組
- “SQL 語句的主要類別是
- SQL 模式語句;這些可能對模式集產生持久影響。
- SQL 資料語句;其中一些,SQL 資料更改語句,可能對 SQL 資料產生持久影響。
- SQL 事務語句;除了 <commit 語句> 外,這些語句以及以下類別,在 SQL 會話終止時不會產生任何持久影響。
- SQL 控制語句。
- SQL 連線語句。
- SQL 會話語句。
- SQL 診斷語句。
- SQL 動態語句。
- SQL 嵌入式異常宣告。”
這種詳細的分組在日常用語中並不常見。一種典型的替代方法是將 SQL 語句組織成以下幾組
- 資料定義語言 (DDL):管理資料庫物件的結構(建立/更改/刪除表、檢視、列,...)。
- 資料查詢語言 (DQL):使用 SELECT 語句檢索資料。該組只有一個語句。
- 資料操作語言 (DML):使用 INSERT、UPDATE、MERGE、DELETE、COMMIT、ROLLBACK 和 SAVEPOINT 語句更改資料。
- 資料控制語言 (DCL):管理訪問許可權(授予、撤銷)。
如上所述,核心 SQL 並不圖靈完備。它缺少條件分支、變數、子例程。但標準以及大多數實現都提供了一種擴充套件來滿足對圖靈完備性的需求。在標準的“第 4 部分:持久儲存模組 (SQL/PSM)”中,對 IF-、CASE-、LOOP-、賦值和其他語句進行了定義。該部分的現有實現具有不同的名稱、不同的語法,以及不同的操作範圍:Oracle 中的 PL/SQL,DB2 中的 SQL/PL,SQL Server 和 Sybase 中的 Transact-SQL 或 T-SQL,Postgres 中的 PL/pgSQL 以及 MySQL 中的“儲存過程”。