SQL(i/ˈɛs kjuː ˈɛl/[5]或i/ˈsiːkwəl/[6],Structured Query Language,结构化查询语言[7][8][9][10])是一种特定目的程式语言,用于管理关系数据库管理系统(RDBMS),或在关系流数据管理系统(RDSMS)中进行流处理。
20 世纪 70 年代推出的 SQL 相比早期的读写 API(如 ISAM 或 VSAM)具有两大优势:首先,它引入了用一条命令访问多条记录的概念;其次,它消除了指定如何访问记录的需求(即无论是否使用索引)。
SQL最初基于关系代数和元组关系演算,包含多种类型的语句[11],这些语句可被非正式地归类为以下子语言:数据查询语言(DQL);数据定义语言(DDL);数据控制语言(DCL);数据操作语言(DML)[12]。
SQL 的应用范围涵盖了数据查询、数据操作(插入、更新和删除)、数据定义(模式创建与修改)以及数据访问控制。尽管 SQL 本质上是一种声明式语言(第四代语言),但它也包含了过程式元素。
SQL 是最早采用埃德加・F・科德提出的关系模型的商用语言之一。该模型在他 1970 年发表的具有重大影响力的论文《大型共享数据库的关系数据模型》中被详细阐述[13]。尽管 SQL 并未完全遵循科德所描述的关系模型,但它仍然成为了使用最为广泛的数据库语言[14][15]。
SQL在1986年成为美国国家标准学会(ANSI)的一项标准,在1987年成为国际标准化组织(ISO)标准[16]。此后,这一标准经过了一系列的增订,加入了大量新特性。虽然有这一标准的存在,但大部分的SQL代码在不同的数据库系统中并不具有完全的跨平台性。
在1970年代初,由IBM研究院下属愛曼登研究中心(法语:IBM Almaden Research Center)的埃德加·科德發表將資料組成表格的應用原則(Codd's Relational Algebra)。1974年,同一實驗室的唐纳德·钱柏林(英语:Donald D. Chamberlin)和雷蒙德·博伊斯(英语:Raymond F. Boyce)参考了科德的模型后,在研制关系数据库管理系统System R(英语:IBM System R)中,开发出了一套規範語言SEQUEL(Structured English Query Language,结构化英语查询语言),並在1976年11月的《IBM研究与开发杂志(英语:IBM Journal of Research and Development)》上公布新版本的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同時也是数据库文件格式的扩展名。
SQL包含四个部分:
供應商之間的SQL實現不兼容,不一定完全遵循標準。各种数据库的SQL方言通常不可移植,特别是在日期时间语法、字符串连接、NULL、比较的大小写敏感方面。只有PostgreSQL与Mimer SQL努力遵从标准。
NULL
SQL在1986年被ANSI标准化,1987年被ISO标准化。由ISO/IEC JTC 1, Information technology, Subcommittee SC 32, Data management and interchange(英语:ISO/IEC JTC 1/SC 32)维护。标准名称通常为如下模式:ISO/IEC 9075-n:yyyy Part n: title。
该标准通常用以下模式表示: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)。
DROP TABLE
DROP DATABASE
DELETE * FROM myTable
目前實務上較有效的防禦方法,就是全面改用參數化查詢。