SQL标准简介

Table of Contents


  1. SQL 的起源
  2. SQL 的标准化
  3. SQL 标准的历史
  4. 学习 SQL 标准
  5. SQL 标准的符合性

SQL 的起源


通常认为,SQL 是 Structured Query Language 的缩写,规范的发音是 “ˌɛsˌkjuːˈɛl”。但是它的前身是著名的关系数据库原型系统 System R 所采用的 SEQUEL 语言,这也是为什么有很多人将其读作 “ˈsiːkwəl” 的来源。也有人类比 GNU 这个词的定义(GNU’s Not UNIX),认为 SQL 是 SQL Query Language 的缩写。 作为一种访问关系型数据库的标准语言,SQL 自问世以来得到了广泛的应用,不仅著名的大型商用数据库产品如 Oracle、DB2、Sybase、SQL Server 等支持它,很多开源的数据库产品如 PostgreSQL、MySQL 等也支持它,甚至一些小型的产品如 Access 也支持 SQL。近些年蓬勃发展的 NoSQL 系统最初是宣称不再需要 SQL 的,后来也不得不修正为 Not Only SQL,来拥抱 SQL。

蓝色巨人 IBM 对关系数据库以及 SQL 语言的形成和规范化产生了重大的影响,第一个版本的 SQL 标准 SQL86 就是基于 System R 的手册而来的。可惜的是, IBM 起先并没有什么产品化的想法,倒是 Oracle 富有远见,在 1979 年率先推出了支持 SQL 的商用产品。随着数据库技术和应用的发展,为各种不同的关系数据库系统提供一致的语言成了一种现实需要。

SQL 的标准化


对 SQL 标准影响最大的机构自然是那些著名的数据库产商,而具体的制订者则是一些非营利机构,例如国际标准化组织 ISO、美国国家标准委员会 ANSI 等。世界各国通常会按照 ISO 标准和 ANSI 标准(这两个机构的很多标准是差不多等同的)制定自己的国家标准。中国也是 ISO 标准委员会的成员国,积极参与标准的制定工作,也会经常翻译一些国际标准对应的中文版。标准为了避免采用具体产品的术语,往往会抽象出很多名词,从而增加了阅读和理解的难度,翻译成中文之后更容易增加理解难度。对于数据库系统实现者而言,很多时候还不如直接读英文版本为好。虽然正式的 ISO 标准不总是像 RFC 那样可以从网络上免费获得,标准草案还是比较容易找到的。待批准的标准草案和最终的标准也没有什么实质上的区别,能够满足日常工作的需要。ISO 网站现在也提供了一些标准和技术报告的免费下载1。

SQL 标准的历史


下面是 SQL 标准简要的发展与演化历史:

  • 1986 年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86。这是 ANSI 首次将 SQL 语言标准化的版本。
  • 1989 年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89。增加了完整性约束。
  • 1992 年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2)。最重要的一个版本。 引入了标准的分级概念。
  • 1999 年,ISO/IEC 9075:1999,SQL:1999(SQL3)。变动最大的一个版本。改变了标准符合程度的定义;增加了面向对象特性、正则表达式、存储过程、Java 等支持。
  • 2003 年,ISO/IEC 9075:2003,SQL:2003。引入了 XML、Window 函数等。
  • 2008 年,ISO/IEC 9075:2008,SQL:2008。引入了 TRUNCATE 等。
  • 2011 年,ISO/IEC 9075:2011,SQL:2011。引入了时序数据等。
  • 2016 年,ISO/IEC 9075:2016,SQL:2016。引入了 JSON 等。

细心的读者能发现,从 SQL:1999 开始,标准简称中的短横线(-)被换成了冒号(:),而且标准制定的年份也改用四位数字了。前一个修改的原因是 ISO 标准习惯上采用冒号,ANSI 标准则一直采用短横线。后一个修改的原因是标准的命名也遇到了 2000 年问题。

SQL86 大概只有几十页,SQL92 正文大约有 500 页,而 SQL99 则超过了 1000 页。可以看出,从 SQL99 开始,SQL 标准的个头就非常庞大了,内容包罗万象,可以说已经没有人能够掌握标准的所有内容了。以 SQL:2003 为例,它包括以下 9 个部分(中间编号空缺是曾经被占用,之后被废弃的标准造成的):

  • ISO/IEC 9075-1: Framework (SQL/Framework)
  • ISO/IEC 9075-2: Foundation (SQL/Foundation)
  • ISO/IEC 9075-3: Call Level Interface (SQL/CLI)
  • ISO/IEC 9075-4: Persistent Stored Modules (SQL/PSM)
  • ISO/IEC 9075-9: Management of External Data (SQL/MED)
  • ISO/IEC 9075-10: Object Language Bindings (SQL/OLB)
  • ISO/IEC 9075-11: Information and Definition Schemas (SQL/Schemata)
  • ISO/IEC 9075-13: SQL Routines and Types Using the Java Programming Language (SQL/JRT)
  • ISO/IEC 9075-14: XML-Related Specifications (SQL/XML)

学习 SQL 标准


负责具体制定工作的是 ISO 和 IEC 联合成立的一个技术委员会 JTC1/SC32。正因为关系数据库市场非常成熟,竞争不够激烈,标准本身变得过于庞大等原因,SQL3 制定的周期很长,制定期间也存在很多争议。例如文章 Is SQL a Real Standard Anymore? 就对 SQL 标准化进程提出了置疑。WISCorp 2 网站曾经收集了很多相关的文档,JCC3 网站则提供了比较新的更新。

如果要了解标准的内容,比较推荐的方法是泛读 SQL92(因为它涉及了 SQL 最基础和最核心的一些内容),然后增量式的阅读其他标准。标准在每次更新的时候,委员会的成员们都为大家提供比较好的介绍文档。例如,针对 SQL:2011,SIGMOD Record 上就有很不错的介绍4。针对 SQL:2016,这是一个很好的更新5,这6也是一个很好的补充。

大约从 2011 年开始,标准委员会还提供了 SQL Technical Reports,虽然它们不是正式标准的一部分,但却非常有助于理解标准。ISO 的这个网页1提供了技术报告的免费下载,注意它们的编号是 19075,而且标题中带 TR 这个缩写词。

SQL 标准的符合性


提及标准,大家容易想到的一个问题就是产品对标准的遵循程度,也就是标准的符合性到底如何,因为它会影响代码在不同系统之间迁移的难度。很遗憾的是,SQL 标准因为定义过于宽泛等技术和非技术原因,不同产品对标准的符合程度存在很大的差异。大到功能特性,小到语法语义的细节,在不同产品之间都存在很多差异,造成实际的应用迁移远比 C/C++ 程序的迁移要复杂很多。因此,尽管很多产品都号称自己符合 SQL 标准,并不意味着应用可以容易的在它们之间切换。除了 Oracle、DB2 等经典的商业产品,以及 PostgreSQL、MySQL 等开源产品总体上对 SQL 标准的符合程度较高以外,很多产品提到的 SQL 标准,涉及的内容其实是 SQL92 里头最基本或最核心的一部分(属于入门级的范畴。SQL92 本身是分级的,包括入门级、过渡级、中间级和完全级)。

为了验证具体的产品对标准的遵从程度,NIST 还曾经专门发起了一个项目,来做标准符合程度的测试集合7。不过,SQL 标准包含的内容实在太多了,而且有很多特性对新的 SQL 产品而言也越来越不重要了。从 SQL99 之后,标准中符合程度的定义就不再分级,而是改成了核心兼容性和特性兼容性;也没有机构来推出权威的 SQL 标准符合程度的测试认证了。开源的 MySQL 曾经在 6.0 的开发过程中试图大幅度改善对 SQL 标准的符合程度,不过后来似乎不了了之了。国产数据库作为数据库领域的后来者,曾经对标准的符合程度非常重视,还组织了专门的机构来做产品的标准符合性测试。在数据库百科全书8中也有很多有关标准的章节。

Footnotes


1 http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html
2 https://www.wiscorp.com/free_downloads.html
3 http://www.jcc.com/resources/sql-standards
4 http://www.sigmod.org/publications/sigmod-record/1203/pdfs/10.industry.zemke.pdf
5 https://s3.amazonaws.com/artifacts.opencypher.org/website/materials/SQLStandards_2017-10-20.pdf
6 https://modern-sql.com/blog/2017-06/whats-new-in-sql-2016
7 http://itl.nist.gov/div897/ctg/sql_form.htm
8 http://mall.cnki.net/reference/detail_R201109078.html

腾讯数据库技术团队对内支持QQ空间、微信红包、腾讯广告、腾讯音乐、腾讯新闻等公司自研业务,对外为腾讯云提供各种数据库产品,如CynosDB、CDB、CTSDB、CMongo等。腾讯数据库技术团队专注于持续优化数据库内核和架构能力,提升数据库性能和稳定性,为腾讯自研业务和腾讯云客户提供“省心、放心”的数据库服务。此公众号和广大数据库技术爱好者一起,推广和分享数据库领域专业知识,希望对大家有所帮助。

文章分享自微信公众号:
腾讯数据库技术

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • [医疗信息化][DICOM教程]DICOM标准简介

    DICOM是一种医疗保健标准,负责管理医学成像的几乎所有方面,例如图像传输,图像解释,打印管理,程序管理和离线存储,并且几乎用于与医疗保健相关的所有成像“模态”...

    landv
  • python 标准库简介

    一定要使用 import os 而不是 from os import * 。这将避免内建的 open() 函数被 os.open() 隐式替换掉,它们的使用方式...

    py3study
  • Python configparser标准库简介

    如果你要使用Python处理类似ini这种格式的文件,那么肯定离不开configparser标准库,它使用起来很简单而且非常方便。下面就让我们来看看吧。

    乐百川
  • Python标准库base64用法简介

    base64模块提供了大量函数用来把二进制数据编码为可打印的ASCII字符,以及将其解码为二进制数据。提供了RFC3548中Base16、Base32、Base...

    Python小屋屋主
  • PKW: asyncio 标准库简介(第 4 期)

    ”事情很少有根本做不成的;其所以做不成,与其说是条件不够,不如说是由于决心不够。“ ”Few things are impossible in themselv...

    周萝卜
  • SQL简介

    注意:insert 只有new,delete 只有old ,oracle 自动添加id

    Dean0731
  • SQL 简介

    SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如 MS Ac...

    用户7657330
  • 《TPC测试系列》II:TPC-C 标准简介

    1 TPC-C概述 TPC-C是TPC(事务处理性能委员会)推出的一系列性能测试标准中的一款,自1992年推出,便成为了数据库性能测试的标杆,各个数据库大厂都...

    腾讯数据库技术
  • My SQL 简介

    Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management Syste...

    rare0502
  • TIA Portal 中标准化和逆标准化模拟量值-原理简介

    与二进制信号相比 , 模拟量信号数值有特定的区间范围 。在计算、显示、输出之前必须转换或标准化和逆标准化。

    科控自动化
  • 高帧率视频标准与规范简介

    帧率(High Frame Rate, HFR)是指利用比正常帧率(如24帧/秒)更高的技术拍摄而成的影片。欧洲已经对高于每秒50帧的视频有了广泛的研究。

    用户1324186
  • MPEG-G基因数据压缩标准简介

    本文是来自Stanford Compression Workshop 2019的演讲,作者是来自于伊利诺伊大学香槟分校(UIUC)Carr R. Woese基因...

    用户1324186
  • EMC 标准介绍

    制定EMC标准的有国际组织,如IEC,它制定的标准被其它组织广泛引用,另外还有地区及国家标准,如欧洲标准,中国国家标准,英国标准等。一般地区和国家标准都能在IE...

    用户2366192
  • .NET 新标准介绍

    本文介绍如何使用 .NET 标准,更容易地实现向 .NET Core 迁移。文中会讨论计划包含的 APIs,跨构架兼容性如何工作以及这对 .NET Core 意...

    葡萄城控件
  • SQL优化器简介

    我们在工作中经常会听到这样的声音:“SQL查询慢?你给数据库加个索引啊”。虽然加索引并不一定能解决问题,但是这初步的体现了SQL优化的思想。

    叁金
  • 0643-Spark SQL Thrift简介

    这是一个复杂的历史,基本上是一个“忒修斯船”(Ship of Theseus)的故事。最开始的时候,Spark SQL的代码几乎全部都是Hive的照搬,随着时间...

    Fayson
  • 常用的标准SQL 语句

    1.创建数据库的语句如下:     Create database databaseName     上述语句创建一个名字叫 databaseName 的数据库...

    用户1197315
  • golang 标准库 time/rate 介绍

    golang官方库中有一个rate包,实现了令牌桶算法。仓库地址:https://github.com/golang/time

    用户5705150

扫码关注云+社区

领取腾讯云代金券