从存储路径转向数据关系

结构化查询语言(Structured Query Language,SQL)是一种定义和操作数据库的语言,不能只按字面把它理解为一条“查询语句”。它的形成与国际商业机器公司(IBM)圣何塞研究实验室的关系数据库研究密切相连。1970年,埃德加·科德提出关系模型,希望使用者不必知道数据在机器内部怎样排列,应用程序也不应因内部存储方式改变而反复改写。

在这种思路中,资料可表示为具有行和列的关系,检索重点成为哪些数据符合条件,而非沿哪条物理链接逐项寻找。关系模型提供理论方向,但要使会计师、工程师和应用程序员能够使用,还需要一种可读、可组合的表达方式,以及把表达转换成机器操作的数据库系统。

参考:[1] [2]

钱伯林与博伊斯的语言设计

唐纳德·钱伯林与雷蒙德·博伊斯在研究中尝试用较熟悉的英语关键词替代紧凑的数学符号。1974年发表的论文把方案称作SEQUEL,即Structured English Query Language。它承接早期SQUARE数据子语言的表格操作思路,采用可嵌套的语句块,使复杂问题能由较简单的问题构成。

论文的目标并不是让机器毫无限制地理解自然英语。使用者仍要学习固定语法和数据结构,只是不必为每次检索详细编写遍历过程。作者特别考虑那些具有业务知识、愿意学习高层语言,却并非计算机专家的人群。这一面向使用者的选择,是语言设计的重要动机。

参考:[2]

一个百货商店查询

原论文以百货商店的数据说明方法。假设EMP表记录员工姓名NAME和部门DEPT,查询“SELECT NAME FROM EMP WHERE DEPT = 'TOY'”就表示从员工表中取出部门为玩具部的姓名。SELECT说明要返回哪一列,FROM指出所用表,WHERE限定哪些行符合条件。这里展示的是论文中的基本模板,而非对后续所有SQL语法的完整说明。

从这个例子可看出,语句描述了期望的结果,却没有规定从磁盘哪个位置开始读,也没有指定索引或扫描顺序。表格内容、查询表达和执行方法被分开讨论。对于更复杂的查询,这种区分尤其重要:同一个数据要求可能有多种执行办法,选择工作必须交给实现语言的系统。

参考:[2] [3]

System R把表达变成可执行工作

IBM的System R项目是关键试验场。系统不只要看懂语法,还需处理多用户访问、事务和高效执行。帕特里夏·塞林格与同事1979年的论文具体讨论了如何为SQL请求选择访问路径,包括单表检索以及多表连接;优化器同时考虑连接顺序和各表的访问方式,比较完成整条语句的代价。

钱伯林的回忆记载,System R曾在三个IBM客户地点作实验性安装,早期使用经验又反馈到1976年的语言设计中。1977年,SEQUEL因商标问题缩短为SQL。此后商业实现逐渐出现,研究语言开始进入实际业务环境,但原型试验、商品交付和标准批准仍是不同阶段。

参考:[3] [4]

1986年究竟标志什么

1986年10月16日,美国国家标准学会(ANSI)批准ANSI X3.135-1986《数据库语言SQL》。原标准前言说明,技术工作由数据库技术委员会X3H2完成,内容涉及定义、查询和修改关系数据库的接口。因而,1986年是SQL标准化的重要节点,不能写成钱伯林与博伊斯到这一年才设计或首次发布该语言。

国际标准化组织(ISO)随后出版ISO 9075:1987,其正式目录把第1版列为1987年6月,生命周期记录的出版日为6月25日。两套记录应分别注明,不宜把美国标准获批和国际标准出版合并成同一天。标准为实现者与用户提供共同的语法、语义参照,也为产品兼容性讨论提供明确对象。

参考:[5] [6]

共同语言及其未解问题

SQL把业务问题与物理存储细节拉开距离,使数据库工具、应用开发和人员培训能够围绕相近的语言展开。钱伯林后来指出,标准有助于竞争产品共享一个基础,但厂商仍可能只实现部分功能或加入自有扩展。使用共同名称,因此并不保证程序在各系统间无需修改。

实际SQL也不能等同于科德关系模型的逐条翻译。重复行、空值和三值逻辑等设计会影响查询结果,业务人员仍须理解数据含义。后续版本继续补充和修订功能,属于另一段发展史;早期SQL的核心贡献,是把声明式数据要求、可工作的数据库实现与公共标准逐步连接起来。

参考:[4] [5]