SQL

SQL（i/ˈɛs kjuː ˈɛl/或i/ˈsiːkwəl/，Structured Query Language，结构化查询语言）是一种特定目的程式语言，用于管理关系数据库管理系统（RDBMS），或在关系流数据管理系统（RDSMS）中进行流处理。 SQL基于关系代数和元组关系演算，包括一个数据定义语言和数据操纵语言。SQL的范围包括数据插入、查询、更新和删除，数据库模式创建和修改，以及数据访问控制。尽管SQL经常被描述为，而且很大程度上是一种声明式编程（4GL），但是其也含有过程式编程的元素。 SQL是对埃德加·科德的关系模型的第一个商业化语言实现，这一模型在其1970年的一篇具有影响力的论文《一个对于大型共享型数据库的关系模型》中被描述。尽管SQL并非完全按照科德的关系模型设计，但其依然成为最为广泛运用的数据库语言。 SQL在1986年成为美国国家标准学会（ANSI）的一项标准，在1987年成为国际标准化组织（ISO）标准。此后，这一标准经过了一系列的增订，加入了大量新特性。虽然有这一标准的存在，但大部分的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版本。该标准为下列组织所采纳： 国际标准化组织，为ISO 9075-1989报告《Database Language SQL With Integrity Enhancement》 美国联邦政府，发布在《The Federal Information Processing Standard Publication(FIPS PUB)127》 目前，所有主要的关系数据库管理系统支持某些形式的SQL，大部分数据库至少遵守ANSI SQL89标准。 ANSI SQL92标准在交叉连接（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包含四个部分： 資料定義語言 資料操縱語言 資料控制語言 事务控制語言 供應商之間的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 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-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 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) Transact-SQL 微軟MS SQL-Server，以及Sybase Adaptive Server（英语：Sybase Adaptive Server）系列資料庫所用的SQL PL-SQL Oracle 資料庫所使用的SQL 由於SQL指令在部份進階使用時，語法會依照特定條件來變換，而且若是表格中的欄位過多時，許多開發人員都會習慣以字串組立的方式建立SQL指令，而且又使用系統管理員級的帳戶連到資料庫，因此讓駭客有機會利用SQL的組立方式進行攻擊，像是在指令中添加部份刺探性或破壞性的指令（例如DROP TABLE、DROP DATABASE或是DELETE * FROM myTable等具破壞性的指令），讓資料庫的資料或實體伺服器被破壞，導致服務中斷或是系統癱瘓等後果，或是以邏輯的漏洞，在密碼欄寫入特殊字串(例如' or '1'='1)，讓該字串形成的邏輯判斷永遠為真，或直接取得非查詢條件的資料，而不需要知道密碼，以達成非法登入系統的目的，此種攻擊手法稱為SQL注入（SQL injection）。 目前實務上較有效的防禦方法，就是全面改用參數化查詢。 SQL:2023 is out. 2023年6月1日 [2023年6月26日].  Paul, Ryan. A guided tour of the Microsoft Command Shell. Ars Technica. [10 April 2011]. （原始内容存档于2018-12-25）.  Media Type registration for application/sql. Internet Assigned Numbers Authority. 10 April 2013 [10 April 2013]. （原始内容存档于2018-01-24）.  The application/sql Media Type, RFC 6922. Internet Engineering Task Force: 3. April 2013 [10 April 2013]. （原始内容存档于2016-10-18）.  Beaulieu, Alan. Mary E Treseler , 编. Learning SQL 2nd. Sebastapol, CA, USA: O'Reilly. April 2009. ISBN 978-0-596-52083-0.  SQL, n.. Oxford English Dictionary. Oxford University Press. [2014-11-27].  Encyclopedia Britannica. SQL. [2013-04-02]. （原始内容存档于2018-12-25）.  From Oxford Dictionaries: "Definition of SQL - abbreviation, Structured Query Language, an international standard for database manipulation." Oxford Dictionaries. SQL. [2017-10-10]. （原始内容存档于2016-08-03）.  IBM. SQL Guide. [永久失效連結] From Microsoft: "Structured Query Language, invented at IBM in the 1970s. It is more commonly known by its acronym, SQL .." Microsoft. Structured Query Language (SQL). [2017-10-10]. （原始内容存档于2016-03-12）.  Codd, Edgar F. A Relational Model of Data for Large Shared Data Banks. Communications of the ACM (Association for Computing Machinery). June 1970, 13 (6): 377–87 [2007-06-09]. doi:10.1145/362384.362685. （原始内容存档于2007-06-12）.  Chapple, Mike. SQL Fundamentals. Databases. About.com. [2009-01-28]. （原始内容存档于2009-02-22）.  Structured Query Language (SQL). International Business Machines. October 27, 2006 [2007-06-10].  ISO/IEC 9075-1:2008: Information technology – Database languages – SQL – Part 1: Framework (SQL/Framework). [2017-10-10]. （原始内容存档于2012-02-03）.  ANSI/ISO/IEC International Standard (IS). Database Language SQL—Part 2: Foundation (SQL/Foundation). 1999. 关系数据库 语言集成查询 維基教科書中的相關電子教程：:en:SQL_Dialects_Reference Comparison of different SQL implementations （页面存档备份，存于互联网档案馆）