Remove ads
计算机中用于检索和管理关系数据库管理系统中的数据以及数据库模式和访问控制管理的语言 来自维基百科,自由的百科全书
SQL(i/ˈɛs kjuː ˈɛl/[5]或i/ˈsiːkwəl/[6],Structured Query Language,結構化查詢語言[7][8][9][10])是一種特定目的程式語言,用於管理關聯式資料庫管理系統(RDBMS),或在關係流數據管理系統(RDSMS)中進行流處理。
SQL基於關係代數和元組關係演算,包括一個數據定義語言和數據操縱語言。SQL的範圍包括數據插入、查詢、更新和刪除,資料庫模式建立和修改,以及數據訪問控制。儘管SQL經常被描述為,而且很大程度上是一種聲明式編程(4GL),但是其也含有程序式編程的元素。
SQL是對埃德加·科德的關係模型的第一個商業化語言實現,這一模型在其1970年的一篇具有影響力的論文《一個對於大型共用型資料庫的關係模型》[11]中被描述。儘管SQL並非完全按照科德的關係模型設計,但其依然成為最為廣泛運用的資料庫語言。 [12][13]
SQL在1986年成為美國國家標準學會(ANSI)的一項標準,在1987年成為國際標準化組織(ISO)標準[14]。此後,這一標準經過了一系列的增訂,加入了大量新特性。雖然有這一標準的存在,但大部分的SQL代碼在不同的資料庫系統中並不具有完全的跨平台性。
在1970年代初,由IBM研究院下屬愛曼登研究中心的埃德加·科德發表將資料組成表格的應用原則(Codd's Relational Algebra)。1974年,同一實驗室的唐納德·錢柏林和雷蒙德·博伊斯參考了科德的模型後,在研製關聯式資料庫管理系統System R中,開發出了一套規範語言SEQUEL(Structured English Query Language,結構化英語查詢語言),並在1976年11月的《IBM研究與開發雜誌》上公佈新版本的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版本。該標準為下列組織所採納:
目前,所有主要的關聯式資料庫管理系統支援某些形式的SQL,大部分資料庫至少遵守ANSI SQL89標準。
ANSI SQL92標準在交叉連接(cross join)和內部連接之上,新增加了外部連接,並支援在FROM子句中寫連接表達式。支援集合的並運算、交運算。支援Case (SQL)表達式。支援CHECK約束。建立臨時表。支援cursor。支援事務隔離。
SQL語言分成了幾種要素,包括:
SQL是進階的非過程化編程語言,它允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解其具體的數據存放方式。而它的介面,能使具有底層結構完全不同的資料庫系統和不同資料庫之間,使用相同的SQL作為數據的輸入與管理。它以記錄專案〔records〕的合集(set)〔項集,record set〕作為操縱對象,所有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
、比較的大小寫敏感方面。只有PostgreSQL與Mimer SQL努力遵從標準。
SQL在1986年被ANSI標準化,1987年被ISO標準化。由ISO/IEC JTC 1, Information technology, Subcommittee SC 32, Data management and interchange維護。標準名稱通常為如下模式: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 | SQL:1999 | SQL3 | 增加了正則表達式匹配、遞歸查詢(傳遞閉包)、資料庫觸發器、程序式與控制流陳述式、非純量類型(arrays)、物件導向特性。在Java中嵌入SQL(SQL/OLB)及其逆(SQL/JRT) |
2003 | SQL:2003 | 增加XML相關特性(SQL/XML)、window functions、標準化sequences、自動產生值的列。對SQL:1999的新特性重新描述其內涵。 | |
2006 | SQL:2006 | 匯入/匯出XML數據與SQL資料庫。XQuery | |
2008 | SQL:2008 | 在cursor之外的ORDER BY陳述式。INSTEAD OF觸發器。TRUNCATE陳述式。FETCH子句 | |
2011 | SQL:2011 | 增加時態數據(PERIOD FOR)。增強了window functions與FETCH子句 | |
2016 | SQL:2016 | 增加行模式匹配、多型表函數、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標準包含10部分:
ISO/IEC 9075被ISO/IEC 13249: SQL Multimedia and Application Packages (SQL/MM)補充。後者定義了基於SQL的音影片、空間數據的介面與包。包括:
由於SQL指令在部份進階使用時,語法會依照特定條件來變換,而且若是表格中的欄位過多時,許多開發人員都會習慣以字串組立的方式建立SQL指令,而且又使用系統管理員級的帳戶連到資料庫,因此讓黑客有機會利用SQL的組立方式進行攻擊,像是在指令中添加部份刺探性或破壞性的指令(例如DROP TABLE
、DROP DATABASE
或是DELETE * FROM myTable
等具破壞性的指令),讓資料庫的資料或實體伺服器被破壞,導致服務中斷或是系統癱瘓等後果,或是以邏輯的漏洞,在密碼欄寫入特殊字串(例如' or '1'='1),讓該字串形成的邏輯判斷永遠為真,或直接取得非查詢條件的資料,而不需要知道密碼,以達成非法登入系統的目的,此種攻擊手法稱為SQL注入(SQL injection)。
目前實務上較有效的防禦方法,就是全面改用參數化查詢。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.