SQL标准已经存在30多年了,它改变了吗?绝对的!了解从SQL-86到现代SQL(当今的标准数据语言)的过程。
SQL是IBM在20世纪70年代由IBM公司创建的。1974年,Donald Chamberlin和Raymond Boyce发表了SEQUEL:《A Structured English Query Language》,将SQL引入了世界。这篇文章包含了该语言的BNF语法(对该语言语法的详细技术描述),IBM后来认为这是一个错误。该语法的发布允许不同的供应商在他们自己的数据库引擎中实现SQL。然而,各供应商的SQL实现之间有相当多的变化,因为每个供应商都引入了自己的SQL扩展。到20世纪80年代中期,不同SQL版本之间出现了大量的不兼容。
也是在20世纪80年代,美国国家标准协会(ANSI)开始研究SQL标准。引入一个标准的目的是支持SQL应用程序在符合标准的产品之间的可移植性。
SQL-86
第一个SQL标准是SQL-86。它于1986年作为ANSI标准和1987年作为国际标准化组织(ISO)标准发布。ISO标准的起点是IBM的SQL标准实现。这个版本的SQL标准也被称为SQL1。
SQL-86标准共120页。它包含SELECT、INSERT、UPDATE和DELETE语句的语法。SELECT语法允许使用WHERE进行过滤,使用带有几个列的GROUP BY(但不允许使用表达式),并使用HAVING过滤GROUPS。没有显示的JOIN语法:可以在FROM子句中列出多个表,从而获得一个交叉连接,随后你可以使用WHERE进行筛选。无法使用OUTER JOINs语法执行。但是,SELECT语法允许子查询。
该标准还具有模式定义语法:你可以创建表(仅使用UNIQUE和NOT NULL约束)、创建视图和授予特权。标准中引入的数据类型是字符串和数字(NUMERIC、DECIMAL、INTERGER、SMALLINT、FLOAT和DOUBLE PRECISION)。没有ALTER、DROP或REVOKE语句。还可以将SQL嵌入到各种编程语言中(Cobol、Fortran、Pascal和PL/1)。
通常,你可以从ISO或ANSI购买标准文档,甚至是旧的和退出的版本。然而,正如Evan Carroll在他的Stack Overflow文章中所分享的那样,现在掌握SQL-86标准并不容易。但是如果你感兴趣,可以在FIPS-127的名称下找到SQL-86.
SQL-89
下一个SQL标准是1989年发布的SQL-89。这是早期标准的一个小修订,是取代SQL-86的SQL-86的超集。标准的尺寸没有改变。
最重要的新特性是完整性约束:除了已经可用的视图中的UNIQUE、NOT NULL和CHECK选项之外,它还添加了主键、外键以及DEFAULT和CHECK约束。该标准还为C和Ada添加了新的语言绑定。
SQL-92
该标准的下一个修订版是SQL-92——这是一个重大的修订版。由SQL-92引入的语言有时被称为SQL2。标准文件从120页增加到579页。然而,增长的主要原因是现有功能的更精确规范。
最重要的新特性如下:
- 显示的JOIN语法和outer joins的引入:LEFT JOIN,RIGHT JOIN,FULL JOIN。
- NATURAL JOIN和CROSS JOIN的介绍
- 集合操作的介绍(set union, set intersection, set difference)
- 条件表达式CASE WHEN的引入
- 新的标量操作:string concatenation, substring extraction和日期和时间数学。
- CAST操作符,它允许显示地将值转换为类型。
SQL-92还引入了新的数据定义语句:表和视图的ALTER和DROP,以及新的数据类型(date日期,time时间,timestamp时间戳,interval间隔,bit string位串,varchar string字符串和national character strings国家字符串)。这个版本增加了一个信息模式(获取数据库元数据的标准方法,如表名、表列、列类型和表约束)。它还引入了临时表、事务隔离级别和查询的动态执行(动态SQL)。
SQL标准被划分为三个一致性级别:条目(条目级SQL-92类似于SQL-89,具有完整性约束),中间和完全。
SQL-92是当今关系数据库中使用的查询语言的基础。当人们谈论“SQL”时,大多数人指的是SQL-92。1992年就已经存在的数据库修改了它们的SQL实现,以符合该标准。较新的数据库使用该标准作为其实现的参考。
SQL-92仍然是人们在学校里教授的“SQL”。当然,SQL-92是学习SQL的一个很好的起点。对很多人来说,做他们日常的工作,它是足够了。当你需要高级特性时,你可以稍后再学习它们。大多数数据库支持SQL-92。没有一个实现是100%符合标准的,但是不兼容性并不是那么重要,特别是当你刚刚开始的时候。
SQL:1999
SQL:1999(也称为SQL3)是SQL标准的第四版。从这个版本开始,标准名称使用冒号而不是连字符,以与其他ISO标准的名称一致。该标准在1999年至2002年期间分多次发布。
SQL:1999的第一部分有5个部分:
第1部分:SQL/Framework(100页)定义了SQL的基本概念。
第2部分:SQL/Foundation(1050页)定义了SQL的基本语法和操作:类型、schemas模式、表、视图、查询和更新语句、表达式等等。这部分对于普通SQL用户来说是最重要的。
第3部分:SQL/CLI(调用级接口)(514页)为SQL定义了一个应用程序编程接口。
第4部分:SQL/PSM(持久存储模块)(193页)定义了SQL变得过程化SQL procedural的扩展。
第5部分:SQL/Bindings(270页)定义了在标准编程语言编写的应用程序中嵌入SQL语句的方法。
后来又发布了另外三个部分,它们也被认为是SQL:1999的一部分。
1999引入了许多现代SQL的重要特性。其中最重要的是公共表达式(Common Table expression, CTEs)。这是一个非常有用的特性,它使你可以组织长而复杂的SQL查询,并使它们更具可读性。当使用WITH [RECURSIVE]语法时,CTEs还可以递归地处理分层数据。
SQL:1999还引入了OLAP(在线分析处理)功能,其中包括在准备业务报告时很有帮助的特性。此时,GROUP BY扩展ROLLUP、CUBE和GROUPING SETS进入了标准。
SQL:1999标准中对SQL的一些小的补充包括使用ORDER BY中的表达式,包含大型二进制对象(LOB和CLOB)的数据类型,以及引入触发器。
SQL标准的规模在1992年到1999年间显著增长。SQL-92标准几乎有600个页面,但是普通SQL用户仍然可以访问它。Christopher Date和Hugh Darwen的《SQL标准指南》等书讨论并解释了SQL-92标准。
从SQL:1999开始,这个标准——现在已经有2000多页了——普通的SQL用户不再可以访问。它已经成为数据库专家和数据库供应商的资源。该标准指导了SQL在主要数据库中的开发;它展示了哪些新的语言特性值得实现以保持最新。它还标准化了新的SQL特性的语法,确保主要数据库以类似的方式实现它们,使用类似的语法和语义。
SQL标准角色的变化是因为不再有一个官方机构对标准的符合性进行认证。直到1996年,国家标准与技术协会(NIST)的数据管理标准项目认证SQL DBMS符合SQL标准。现在,供应商自我认证其产品的符合性。
SQL:2003及以上版本
在21世纪,SQL标准定期更新。
SQL:2003标准于2004年3月1日发布。它的主要新增功能是窗口函数,这是一个强大的分析特性,允许您在不折叠行的情况下计算汇总统计信息。窗口函数极大地增强了SQL的表达能力。它们在准备各种商业报告、分析时间序列数据和分析趋势方面非常有用。在标准中添加窗口功能与OLAP和数据仓库的流行相一致。人们开始使用数据库来进行数据驱动的商业决策。由于所有企业收集的数据越来越多,这一趋势只会越来越强劲。