SQL标准1986年制定第一版,到最新的2023版,已经有38年的历史,现在依然是计算机非常活跃的语言,50%的程序员都能掌握SQL,数据分析师也是SQL的主要使用人员之一。
从早期的基本语法,到融合了XML、JSON等复杂数据类型,存储过程标准,元数据标准等等等,SQL语言规范发生巨大的变化,但是SQL标准总是落后市场太多,虽然名为标准,但是各大数据库厂商基本只遵守早期的内容,后期新的规范缺少指导意义,有如东周王室与各诸侯国关系。(一言难尽,后面待续 ...)
本文来自 Matthew Mullins(Coginiti公司CTO)发表的博客文章,并增加了一些配图和注解,可以带大家快速了解SQL近40年的发展历史:
---------------
在数据管理领域,SQL(结构化查询语言,Structured Query Language)的出现标志着数据库系统历史上的一个关键时刻。SQL最初由IBM的Donald D. Chamberlin和Raymond F. Boyce在20世纪70年代初开发,是旨在利用Edgar F. Codd的关系数据库模型潜力的项目的一部分。该模型提出了一种以行和列的结构化数据的方式,这一概念彻底改变了计算机系统中信息的存储、检索和操作方式。
SQL的标准化始于SQL-86,由美国国家标准协会(ANSI)支持。这个第一版标准为SQL奠定了基础,使其成为关系数据库管理系统(RDBMS)中管理和查询数据的通用语言。多年来,SQL标准已经发生了显著的演变,以适应数据存储、检索和处理需求的变化。这些标准不仅反映了数据库技术的进步,而且塑造了跨不同应用程序和平台的数据管理方式。
我们从SQL-86到最新的SQL:2023的演变之旅,不仅仅是技术增强的编年史。这是对其创造者的持久愿景和不断努力使数据更易于访问和操作的证明。当我们深入研究每个版本的SQL标准时,我们强调了已经成为现代数据管理实践不可或缺的功能的引入和完善。无论您是数据库专业人员、开发人员还是爱好者,了解SQL标准的历程和进步都为您提供了对这项基础技术的功能和多功能性的宝贵见解。
SQL-86 – 起点
标准化SQL历史的第一章以SQL-86开始,也正式称为SQL-87。这个版本标志着首次尝试标准化SQL语言,以用于关系数据库管理系统,这是确保不同数据库系统之间一致性和互操作性的关键一步。
SQL-86的特点在于其简单性和对SQL核心方面的关注。该标准定义了SQL的基本框架,包括基本的数据定义语言(DDL)和数据操作语言(DML)操作。SQL-86中的DDL操作包括创建(CREATE TABLE
)和删除(DROP TABLE
)表,构成了数据库结构管理的基础。同时,DML操作涵盖了与存储数据交互的基本功能:查询数据(SELECT
)、插入新行(INSERT
)、更新现有数据(UPDATE
)和删除数据(DELETE
)。
除了这些操作外,SQL-86还引入了基本的查询功能。它支持简单的WHERE
子句进行数据过滤,基本的算术和比较运算符,以及一些聚合函数,如COUNT
、SUM
、AVG
、MIN
和MAX
。这些功能为数据检索和基本分析提供了基本工具。
SQL-86中可用的数据类型是基础的,侧重于像INTEGER、SMALLINT和VARCHAR这样的主要类型。这种有限的范围反映了当时数据库系统的主要需求,优先考虑简单的数据存储和检索。
然而,SQL-86的简单性也意味着它有明显的局限性。它缺乏后来成为SQL标准功能的高级功能,如JOIN操作、外键约束、视图和复杂的事务控制。这些局限性反映了关系数据库技术的早期阶段和对数据库查询语言所需内容的不断发展的理解。
SQL-86为SQL的未来奠定了基础。它在标准化查询语言的概念仍然新颖的时候为数据库建立了一种共同语言。虽然它只提供了一个基本的工具包,但它是将SQL发展成为今天能够处理无数应用程序和系统中复杂和多样化的数据管理任务的丰富和多功能语言的第一步。
(阅读完整的SQL-86标准)
https://archive.org/details/federalinformati127nati/mode/2up
SQL-89 – 早期增强
在建立第一个SQL标准仅仅几年后,引入了SQL-89更新。虽然SQL-89是一个相对较小的修订,但它解决了初始标准中未涵盖的关键数据库管理方面。这些增强在将SQL从基本数据操作语言发展为更强大的数据库管理和安全工具方面至关重要。
SQL-89中的关键添加之一是引入了完整性约束。这些约束对于维护数据库中数据的准确性和可靠性至关重要。SQL-89特别关注主键约束,确保表中的每一行都通过其在指定列中的值唯一标识。这一添加标志着向更复杂的数据完整性和关系数据建模迈出了重要一步。
SQL-89中的另一个重大增强是包括了基本安全功能,特别是GRANT
和REVOKE
语句。这些命令使数据库管理员能够更细粒度地控制对数据的访问。GRANT
语句允许将权限分配给用户或角色,使他们能够对给定表执行特定操作,如选择、插入、更新或删除数据。相反,REVOKE
语句用于移除这些权限。这种对数据访问的控制对于管理数据安全和确保只有授权用户才能对数据库执行某些操作至关重要。
尽管SQL-89没有引入大量功能,但它所做的添加在加强SQL的基础方面具有重要意义。引入完整性约束和基本安全功能为后续版本中将添加的更高级功能奠定了基础。通过解决这些基本需求,SQL-89在SQL作为可靠和安全的数据库管理语言的发展中发挥了关键作用。
SQL-92 (SQL2) – 重大飞跃
SQL-92的发布,也称为SQL2,标志着SQL演变中的一个里程碑时刻。这个版本不仅仅是一个增量更新,而是一个重大的改革,显著扩展了SQL语言的功能。SQL-92为数据库系统设定了新的基准,并为今天我们使用的现代SQL奠定了基础。
SQL-92中最重要的增强之一是引入了JOIN操作。这一功能在构建查询方面带来了根本性的变化,允许跨多个表进行更复杂的数据检索。JOIN操作,包括INNER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN和FULL OUTER JOIN,使用户能够基于它们之间的相关列组合两个或多个表中的行。这种能力对于关系数据库操作至关重要,促进了更复杂和有意义的数据关系和分析。(注:没有SQL标准前,Oracle曾经使用(+)来表示outer join,让新手一头雾水)
子查询是SQL-92中的另一个重要添加。这些是嵌套在其他查询中的查询,为创建更动态和灵活的SQL语句提供了强大的工具。子查询增强了语言处理复杂数据检索场景的能力,使SQL在满足多样化的数据操作需求方面变得更加多功能和有效。
SQL-92还引入了一系列新的数据类型,以适应更广泛的数据表示范围。这些包括DATE、TIME、TIMESTAMP、INTERVAL以及各种数值和字符串类型。数据类型的扩展是对数据库中存储和处理的数据复杂性日益增加的直接响应,反映了数据库应用程序不断演变的需求。
此外,SQL-92在事务控制和数据完整性方面取得了显著进展。它引入了事务隔离级别、约束(如CHECK、UNIQUE、FOREIGN KEY)和声明式引用完整性的概念。这些功能为维护数据一致性、完整性和管理并发数据库操作提供了更强大的机制。
(注:INFORMATION_SCHEMA也是SQL92的标准metadata视图,除了MySQL外,遵守的数据库比较少,有些数据库元数据体系早已建立,也只是草草适配了下INFORMATION_SCHEMA的格式,里面可用的内容太少)
SQL-92的进步对数据库系统产生了深远影响。通过显著扩大SQL的范围和功能,它使更复杂的数据建模、查询和分析成为可能。这一标准对于巩固SQL作为关系数据库的主要语言的地位至关重要,并为数据库技术的持续创新奠定了基础。SQL-92的全面功能集使其转变为一个更强大的工具,能够处理现代数据环境中的复杂需求。
SQL:1999 (SQL3) – 超越传统模型
SQL:1999的发布,也称为SQL3,标志着SQL标准的一个重要进步,引入了一系列复杂的功能,显著扩展了SQL超越传统关系数据库模型的能力。
-
引入对象关系特性:SQL:1999带来了对象关系能力,将面向对象编程概念与已建立的关系模型相结合。这种集成允许更复杂和自然的数据结构,包括表继承和用户定义类型(UDT)。这些UDT使用户能够创建自定义数据类型,使数据库模式更紧密地符合现实世界数据的复杂性。(注:对象关系特性目前主要是PostgreSQL系列支持,没有得到市场广泛推广,这也是SQL标准与实际脱离的早期迹象之一)
-
触发器、递归查询和公共表表达式(CTE,Common Table Expressions):触发器的引入是一个重大增强,它使得在数据库发生特定变化(如插入、更新或删除)时可以自动执行程序化操作。递归查询是SQL查询能力的显著增加,允许处理层次或嵌套数据结构。公共表表达式(CTE),包括
WITH
子句,被引入,提供了一种更易于阅读和灵活的方式来编写复杂查询。CTE使得定义可以在SELECT、INSERT、UPDATE或DELETE语句中引用的临时结果集成为可能。 -
高级分析功能 - OLAP扩展:SQL:1999引入了对
GROUP BY
子句的几个扩展,特别是ROLLUP
、CUBE
和GROUPING SETS
。这些扩展是OLAP(在线分析处理)功能的核心,增强了SQL的数据汇总和分析能力。ROLLUP
有助于层次数据汇总,允许在多个级别上进行累积总数。CUBE
提供了一种生成所有可能的属性组合的聚合数据的方法,适用于多维数据分析。GROUPING SETS
提供了一种更灵活的方式来在单个查询中指定多个分组集,增强了生成全面汇总报告的能力。(注:数据分析场景,应用软件比较少用) -
(注:存储过程也是SQL:1999引入,但是各个数据库引擎都有自己的语言编译系统,这部分基本没有统一,大家都是各干各的,比如T-SQL、PL/SQL等等)
SQL:1999引入的进步显著扩大了SQL的范围。通过将SQL与当代编程范式对齐并增强其分析能力,这个版本的标准对于适应现代数据环境日益复杂的需求至关重要。SQL:1999的丰富功能集为SQL语言的进一步发展奠定了坚实的基础,为未来的创新铺平了道路。
SQL:2003 – XML集成
SQL:2003标志着SQL演变中的另一个重要里程碑,引入了进一步弥合传统关系数据库和现代数据处理新兴需求之间差距的功能。这个标准以其XML集成而特别引人注目,反映了这种格式在数据交换和Web服务中日益增长的重要性。
-
引入SQL/XML特性:SQL:2003最突出的添加是XML的集成。该标准引入了
XML
数据类型,使得在SQL数据库中存储和操作XML文档成为可能。这一功能是对XML在各种应用程序中广泛采用的直接响应,并且需要关系数据库有效地处理XML数据。SQL:2003包括了几个用于处理XML数据的函数和操作符,例如XML解析和序列化。这些工具允许在XML和关系数据之间进行转换,使不同来源的数据集成更加容易。(注:XML曾经被给予了过高的预期,SQLServer、IBM、Oracle在数据库上都投入了大量的心血,但是开发者更喜欢简洁的语法,XML标准逐渐被JSON、YAML等格式取代) -
序列生成器(Sequence)和自增列:SQL:2003引入了序列生成器,提供了一种标准化的方法来生成唯一的、顺序的值,通常用于主键生成。这一功能对于确保数据完整性和一致性至关重要,尤其是在数据插入量很大的环境中。对自增列的增强也进行了改进,提供了更多的控制和灵活性。自增列在添加新行时自动生成唯一值,简化了数据输入过程。(注:自增列在SQLServer、MySQL很早就有,但是语法差异非常大,现在大家也是谁也不鸟)
-
窗口函数的扩展:SQL:2003的另一个关键特性是窗口函数的扩展。这些函数允许对与当前行相关的一组行执行计算,这对于复杂的分析任务特别有用。SQL:2003引入了新的窗口函数并扩展了现有窗口函数的能力,允许进行更复杂的数据分析和报告。这一增强对于依赖SQL进行数据驱动决策的企业和分析师来说具有重要意义。(注:窗口函数比较难掌握,但是在数据分析中非常有价值)
SQL:2003引入的SQL/XML和其他高级功能是将SQL与数据管理演变趋势对齐的重要一步。通过适应XML的日益普及并增强分析能力,SQL:2003不仅扩大了SQL的多功能性,还确保了其在快速变化的技术格局中的持续相关性。该标准代表了SQL持续旅程中的关键发展,加强了其作为现代数据库系统的全面工具的地位。
SQL:2006和SQL:2008 – 改进
SQL的发展在SQL:2006和SQL:2008的更新中继续进行。虽然这些修订没有它们的前身那么广泛,但它们引入了特定改进和功能,以应对数据库技术中的新兴趋势和需求。
-
SQL:2006的增强:SQL:2006继续了SQL:2003中开始的XML集成,进一步巩固了SQL和XML之间的关系。它专注于增强SQL数据库中XML的功能性和易用性,反映了XML在数据交换和Web服务中持续的重要性。这个版本的标准引入了额外的功能来查询和操作XML数据。这些增强旨在提高处理XML的效率和灵活性,确保SQL数据库能够无缝地将XML作为其核心功能的一部分。(注:SQL标准花了大量时间在XML上,现在看起来不太重要的事情...)
-
SQL:2008的关键特性:虽然SQL:2008被认为是一个小修订,但它引入了一些值得注意的功能,增加了SQL的健壮性和易用性。SQL:2008中
INSTEAD OF
触发器的引入是一个重要的增强。这些触发器允许指定在视图上执行标准操作(如插入、更新或删除)时执行的自定义操作,提供了对数据操作的更多控制,增强了语言的灵活性。另一个重要的添加是TRUNCATE TABLE
语句。这个功能提供了一种更有效的方式来删除表中的所有行,对于大型表来说特别有用,在大型表中逐行删除将是耗时和资源密集型的。 -
(补充)分页语法:分页语法标准各种数据库都是五花八门,也是应用软件适配各种数据库的主要工作之一
-
SELECT * FROM T LIMIT 10 OFFSET 20 -- Netezza, MySQL, PostgreSQL (also supports the standard, since version 8.4), SQLite, HSQLDB, H2 SELECT * from T WHERE ROWNUM <= 10 -- Oracle (also supports the standard, since Oracle8i) SELECT FIRST 10 * from T -- Ingres SELECT FIRST 10 * FROM T order by a -- Informix SELECT SKIP 20 FIRST 10 * FROM T order by c, d -- Informix (row numbers are filtered after order by is evaluated. SKIP clause was introduced in a v10.00.xC4 fixpack) SELECT TOP 10 * FROM T -- MS SQL Server, Sybase ASE, MS Access SELECT TOP 10 START AT 20 * FROM T -- Sybase SQL Anywhere (also supports the standard, since version 9.0.1) SELECT FIRST 10 SKIP 20 * FROM T -- Interbase, Firebird SELECT * FROM T ROWS 20 TO 30 -- Firebird (since version 2.1) SELECT * FROM TWHERE ID_T > 10 FETCH FIRST 10 ROWS ONLY -- DB2 SELECT * FROM TWHERE ID_T > 20 FETCH FIRST 10 ROWS ONLY -- DB2 (new rows are filtered after comparing with key column of table T)
SQL:2008全新制定了SQL的分页语法标准规范,使用了类似下面的offset fetch语法(注:标准出台太晚,也远不如MySQL、PostgreSQL方便)
OFFSET 10 ROWS FETCH 100 ROWS ONLY
SQL:2006和SQL:2008通过其专注的更新展示了对SQL能力的持续承诺和扩展。这些修订确保了SQL的适应性和相关性,能够满足数据库管理系统不断发展的要求。SQL:2006中增强的XML功能和SQL:2008中引入的实用功能如INSTEAD OF
触发器和TRUNCATE TABLE
是SQL持续发展中的关键步骤,保持了其作为数据管理中强大和多功能工具的地位。
SQL:2011和SQL:2016 – 现代特性增强和JSON引入
SQL的发展在SQL:2011和SQL:2016的更新中继续,专注于现代数据管理需求和集成新兴数据格式。
-
SQL:2011 – 时态数据和增强索引:SQL:2011引入了对时态数据的支持,允许跨不同时间维度管理和查询数据。这一功能对于需要历史数据分析、审计和基于时间的报告的应用程序至关重要(注:核心是数据库支持查询历史某个时间数据的能力,如查询3天前customers表的数据状态:SELECT * FROM customers AS OF SYSTEM TIME current_date - 3 days ;) 。SQL:2011中的增强索引提高了查询的性能和效率,这对于大型和复杂的数据库至关重要。这些新的索引技术优化了数据检索和存储,解决了可扩展性和性能挑战。
-
SQL:2016 – 引入JSON和高级分析:SQL:2016的标志性是引入了JSON数据处理。这一功能迎合了JSON作为数据交换格式的广泛使用,尤其是在Web应用程序中。SQL:2016提供了一套函数和操作符,用于高效地存储、操作和查询JSON数据。JSON语法的关键方面包括:
-
JSON_VALUE
和JSON_QUERY
用于从JSON字符串中提取数据。 -
JSON_OBJECT
和JSON_ARRAY
用于创建JSON结构。 -
IS JSON
谓词用于验证字符串是否包含有效的JSON。 -
标准化的JSON路径语言用于指定JSON数据内的位置。
-
-
SQL:2016中的高级分析通过新的和增强的分析功能得到了加强,增强了更复杂的数据分析和商业智能能力。
SQL:2011和SQL:2016共同丰富了SQL的功能集,确保了其在不断发展的数据管理环境中的适应性和相关性。引入对临时数据的支持、高级索引技术和JSON数据处理,以及分析功能的改进,强调了SQL作为现代数据库系统的全面工具的作用。这些版本标志着SQL发展中的重要步伐,满足了当代数据环境的复杂需求。
SQL:2023 – 最新的前沿
SQL:2023作为SQL标准的最新和最现代的迭代,包含了一系列与数据管理的最新趋势和需求一致的增强和功能。这个版本的SQL反映了向前迈出的重大飞跃,引入了关键更新,以满足数据库技术和用户多样化需求的演变。
-
引入属性图查询:SQL:2023中一个突出的功能是增加了属性图查询(SQL/PGQ)。这一新功能显著缩小了关系数据库管理系统(RDBMS)和图数据库系统之间的差距。SQL/PGQ允许用户将关系表中的数据作为图数据库存储的数据进行查询。这对于处理复杂关系和相互连接的数据集的应用程序特别有益,例如社交网络、推荐系统和网络分析。
-
增强JSON支持:在SQL:2016中引入的JSON功能的基础上,SQL:2023进一步增强了JSON数据处理。它引入了本地
JSON
数据类型,简化了SQL数据库中JSON的存储和操作。增强的JSON支持包括操作如JSON_SERIALIZE
、JSON_SCALAR
和IS JSON
,以及额外的JSON相关语法,为处理JSON数据提供了更全面的工具。这一增强是对JSON作为数据交换格式持续普及的响应,尤其是在基于Web和网络的应用程序中。 -
简化数据处理和其他改进:SQL:2023简化了数据处理的几个方面,使语言更易于访问和使用。这包括允许在某些操作中使用更直观和简化的语法,旨在提高编写和维护SQL代码的效率。其他改进包括新功能和对现有功能的增强,进一步增强了SQL在各个数据处理和分析领域的能力。
SQL:2023代表了SQL持续发展的一个重要里程碑。通过引入属性图查询和增强JSON支持,这个版本的SQL不仅迎合了现代数据建模概念,而且扩大了其在各种复杂数据场景中的适用性。数据处理的简化和改进反映了根据用户需求和技术进步发展SQL的承诺。作为最新的标准,SQL:2023展示了SQL的持久适应性及其在不断变化的数据管理和分析世界中的关键作用。
SQL不断发展的格局
当我们从SQL-86的起源到SQL:2023的最新进展进行调查时,很明显SQL经历了显著的演变。SQL标准的每一次迭代不仅应对了数据管理中出现的挑战,而且主动塑造了我们与数据的互动和思考方式。从简单的表操作到复杂的对象关系特性、高级分析能力,再到现在的基于图的查询和增强的JSON支持的集成,SQL的演变强调了其在不断变化的技术环境中的韧性和多功能性。
从简单的表操作到复杂的对象关系特性、高级分析能力,再到现在的基于图的查询和增强的JSON支持的集成,SQL的演变强调了其在不断变化的技术环境中的韧性和多功能性。这一旅程反映了为数据专业人员提供更强大、更高效、更直观的工具的持续努力。
展望未来,SQL标准可能会继续这一创新和适应的轨迹。潜在的发展方向可能包括集成向量索引,这将增强SQL处理大规模、高维数据的能力,这在机器学习和数据科学领域是常见的需求。此外,可能会更加强调对度量的支持,进一步完善SQL的分析和商业智能功能。
随着数据的体积、种类和复杂性的不断增长,SQL在管理和从这些数据中提取价值方面的作用变得越来越重要。未来的标准可能会专注于使SQL更加强大、高效,并与数据库技术和数据分析方法的最新发展保持一致。
SQL的故事是一个持续增长和适应的故事,由技术创新的无情步伐和数据管理不断扩展的前沿所驱动。展望未来,我们可以期待SQL将继续演变,保持其作为数据管理世界中的基础和不可或缺的工具的地位。
注:SQL是一门非常成功的语言,这个与早期SQL标准组织在2000年以前的工作息息相关,但从2000年后,SQL标准是落后时代的,在面向对象、XML等特性上浪费了大量的时间,很多实际需要的特性没有及时跟上,现在数据库厂商之间群雄割据,也很难统一,这个也变成了数据库各个生态的壁垒。事实上,2001年,SQL标准委员会的秘书长就开始质疑SQL标准是否还存在?
在大模型AI时代,期待SQL早点跟上向量数据库的国际标准。
参考:
https://www.coginiti.co/blog/the-evolution-of-sql-from-sql-86-to-sql-2023/
https://dba.stackexchange.com/questions/30452/ansi-iso-plans-for-limit-standardization
https://wiki.postgresql.org/images/6/64/Fosdem20150130PostgresqlTemporal.pdf
https://en.wikipedia.org/wiki/SQL-92
原文:云数据库技术
来源:一文介绍SQL标准1986~2023的演变