SQL

出自Local Chinese Wikipedia
imported>Evilreality0012025年6月16日 (一) 05:43的修訂
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
跳至導覽 跳至搜尋

Template:NoteTA

腳本錯誤:沒有「Infobox」這個模塊。腳本錯誤:沒有「Check for unknown parameters」這個模塊。 腳本錯誤:沒有「Infobox」這個模塊。腳本錯誤:沒有「Check for unknown parameters」這個模塊。

SQL腳本錯誤:沒有「IPAc-en」這個模塊。[1]腳本錯誤:沒有「IPAc-en」這個模塊。[2]Structured Query Language結構化查詢語言[3][4][5][6])是一種特定目的程式語言,用於管理關係數據庫管理系統(RDBMS),或在關係流數據管理系統(RDSMS)中進行流處理。

20 世紀 70 年代推出的 SQL 相比早期的讀寫 API(如 ISAMVSAM)具有兩大優勢:首先,引入了用一條命令訪問多條記錄的概念;其次,也消除了指定如何訪問記錄的需求(即無論是否使用索引)。

SQL最初基於關係代數元組關係演算,包含多種類型的語句[7],這些語句可被非正式地歸類為以下子語言:數據查詢語言(DQL);數據定義語言(DDL);數據控制語言(DCL);數據操作語言(DML)[8]

SQL 的應用範圍涵蓋了數據查詢、數據操作(插入、更新和刪除)、數據定義(模式創建與修改)以及數據訪問控制。儘管 SQL 本質上是一種聲明式語言第四代語言),但是也包含了過程式元素。

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

SQL在1986年成為美國國家標準學會(ANSI)的一項標準,在1987年成為國際標準化組織(ISO)標準[12]。此後,這一標準經過了一系列的增訂,加入了大量新特性。雖然有這一標準的存在,但大部分的SQL代碼在不同的數據庫系統中並不具有完全的跨平台性。

歷史[編輯]

在1970年代初,由IBM研究院下屬腳本錯誤:沒有「ilh」這個模塊。埃德加·科德發表將資料組成表格的應用原則(腳本錯誤:沒有「Lang」這個模塊。)。1974年,同一實驗室的腳本錯誤:沒有「ilh」這個模塊。腳本錯誤:沒有「ilh」這個模塊。參考了科德的模型後,在研製關係數據庫管理系統腳本錯誤:沒有「ilh」這個模塊。中,開發出了一套規範語言腳本錯誤:沒有「Lang」這個模塊。腳本錯誤:沒有「Lang」這個模塊。,結構化英語查詢語言),並在1976年11月的《腳本錯誤:沒有「ilh」這個模塊。》上公佈新版本的腳本錯誤:沒有「Lang」這個模塊。(叫腳本錯誤:沒有「Lang」這個模塊。/2)。1980年改名為腳本錯誤:沒有「Lang」這個模塊。

1979年,甲骨文公司(當時名為關係式軟件公司)首先提供商用的腳本錯誤:沒有「Lang」這個模塊。,IBM公司在DB2腳本錯誤:沒有「Lang」這個模塊。數據庫系統中也實現了腳本錯誤:沒有「Lang」這個模塊。

1986年10月,美國腳本錯誤:沒有「Lang」這個模塊。採用腳本錯誤:沒有「Lang」這個模塊。作為關係數據庫管理系統的標準語言(腳本錯誤:沒有「Lang」這個模塊。),後為國際標準化組織(腳本錯誤:沒有「Lang」這個模塊。)採納為國際標準。

1989年,美國腳本錯誤:沒有「Lang」這個模塊。採納在腳本錯誤:沒有「Lang」這個模塊。報告中定義的關係數據庫管理系統的腳本錯誤:沒有「Lang」這個模塊。標準語言,稱為腳本錯誤:沒有「Lang」這個模塊。,該標準替代腳本錯誤:沒有「Lang」這個模塊。版本。該標準為下列組織所採納:

  • 國際標準化組織,為腳本錯誤:沒有「Lang」這個模塊。報告《腳本錯誤:沒有「Lang」這個模塊。
  • 美國聯邦政府,發佈在《腳本錯誤:沒有「Lang」這個模塊。

目前,所有主要的關係數據庫管理系統支持某些形式的腳本錯誤:沒有「Lang」這個模塊。,大部分數據庫至少遵守腳本錯誤:沒有「Lang」這個模塊。標準。

腳本錯誤:沒有「Lang」這個模塊。標準在交叉連接(腳本錯誤:沒有「Lang」這個模塊。)和內部連接之上,新增加了外部連接,並支持在腳本錯誤:沒有「Lang」這個模塊。子句中寫連接表達式。支持集合的並運算、交運算。支持Case (SQL)表達式。支持腳本錯誤:沒有「Lang」這個模塊。約束。創建臨時表。支持腳本錯誤:沒有「Lang」這個模塊。。支持事務隔離

語法[編輯]

腳本錯誤:沒有「main」這個模塊。

File:SQL ANATOMY wiki.svg
圖表顯示了SQL語言元素組成的一個語句

SQL語言分成了幾種要素,包括:

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

語言特點[編輯]

SQL是高級的非過程化編程語言,允許用戶在高層數據結構上工作。不要求用戶指定對數據的存放方法,也不需要用戶了解其具體的數據存放方式。而且界面,能使具有底層結構完全不同的數據庫系統和不同數據庫之間,使用相同的SQL作為數據的輸入與管理。由以記錄項目〔records〕的合集(set)〔項集,record set〕作為操縱對象,所有SQL語句接受項集作為輸入,回送出的項集作為輸出,這種項集特性允許一條SQL語句的輸出作為另一條SQL語句的輸入,所以SQL語句可以嵌套,這使得擁有極大的靈活性和強大的功能。在多數情況下,在其他編程語言中需要用一大段程序才可實踐的一個單獨事件,而其在SQL上只需要一個語句就可以被表達出來。這也意味着用SQL可以寫出非常複雜的語句,在不特別考慮效能下。

SQL同時也是數據庫文件格式擴展名

SQL包含四個部分:

SQL函數[編輯]

函數 描述
AVG 平均值
COUNT 計數(不含Null)
FIRST 第一個記錄的值
MAX 最大值
MIN 最小值
STDEV 樣本標準差
STDEVP 總體標準差
SUM 求和
VAR 樣本方差
VARP 總體方差
UCASE 轉化為全大寫字母
LCASE 轉化為全小寫字母
MID 取中值
LEN 計算字符串長度
INSTR 獲得子字符串在母字符串的起始位置
LEFT 取字符串左邊子串
RIGHT 取字符串右邊子串
ROUND 數值四捨五入取整
MOD 取餘
NOW 獲得當前時間的值
FORMAT 字符串格式化
DATEDIFF 獲得兩個時間的差值

互操作性和標準化[編輯]

供應商之間的SQL實現不兼容,不一定完全遵循標準。各種數據庫的SQL方言通常不可移植,特別是在日期時間語法、字符串連接、NULL、比較的大小寫敏感方面。只有PostgreSQLMimer SQL努力遵從標準。

標準化歷史[編輯]

SQL在1986年被ANSI標準化,1987年被ISO標準化。由腳本錯誤:沒有「ilh」這個模塊。維護。標準名稱通常為如下模式:ISO/IEC 9075-n:yyyy Part n: title

年份 名字 別名 註釋
1986 SQL-86 SQL-87 ANSI首次標準化
1989 SQL-89 FIPS 127-1 小修改,增加了integrity constraint
1992 SQL-92 SQL2, FIPS 127-2 大修改,成為現代SQL的基礎
1999 腳本錯誤:沒有「ilh」這個模塊。 SQL3 增加了正則表達式匹配、遞歸查詢(傳遞閉包)、數據庫觸發器、過程式與控制流語句、非標量類型(arrays)、面向對象特性。在Java中嵌入SQL(SQL/OLB)及其逆(SQL/JRT)
2003 腳本錯誤:沒有「ilh」這個模塊。 增加XML相關特性(SQL/XML)、window functions、標準化sequences、自動產生值的列。對SQL:1999的新特性重新描述其內涵。
2006 腳本錯誤:沒有「ilh」這個模塊。 導入/導出XML數據與SQL數據庫。XQuery
2008 腳本錯誤:沒有「ilh」這個模塊。 在cursor之外的ORDER BY語句。INSTEAD OF觸發器。TRUNCATE語句。FETCH子句
2011 腳本錯誤:沒有「ilh」這個模塊。 增加時態數據(PERIOD FOR)。增強了window functions與FETCH子句
2016 腳本錯誤:沒有「ilh」這個模塊。 增加行模式匹配、多態表函數、JSON
2019 SQL:2019 增加了第15部分,多維數組(MDarray類型和運算符)。

當前標準[編輯]

該標準通常用以下模式表示: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存檔免費獲得。

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單元和相關功能的操作。 標準的這一部分僅包含可選功能。

ISO / IEC標準的擴展[編輯]

ISO/IEC 9075ISO/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為基礎的其他延伸語言[編輯]

微軟MS SQL-Server,以及腳本錯誤:沒有「ilh」這個模塊。系列資料庫所用的SQL
Oracle 資料庫所使用的SQL

安全問題[編輯]

腳本錯誤:沒有「main」這個模塊。

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

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

參考文獻[編輯]

  1. Template:Cite book
  2. Template:Cite web
  3. Template:Cite web
  4. From Oxford Dictionaries: "Definition of SQL - abbreviation, Structured Query Language, an international standard for database manipulation." Template:Cite web
  5. Template:Cite web腳本錯誤:沒有「Unsubst」這個模塊。
  6. From Microsoft: "Structured Query Language, invented at IBM in the 1970s. It is more commonly known by its acronym, SQL .." Template:Cite web
  7. SQL-92, 4.22 SQL-statements, 4.22.1 Classes of SQL-statements "There are at least five ways of classifying SQL-statements:", 4.22.2, SQL statements classified by function "The following are the main classes of SQL-statements:"; SQL:2003 4.11 SQL-statements, and later revisions.
  8. Template:Cite book
  9. Template:Cite journal
  10. Template:Cite web
  11. Template:Cite web
  12. Template:Cite web
  13. ANSI/ISO/IEC International Standard (IS). Database Language SQL—Part 2: Foundation (SQL/Foundation). 1999.

參見[編輯]

外部連結[編輯]

Template:Sister

Template:SQL Template:查詢語言 腳本錯誤:沒有「Navbox」這個模塊。 Template:NavboxV2 Template:Computer Science 腳本錯誤:沒有「Navbox」這個模塊。 Template:規範控制