为什么说SQL是最成功的第四代语言?

2019 年 4 月 11 日

为什么说SQL是最成功的第四代语言?

45 年前,两名年轻的 IBM 研究员将一门关系型语言带到了数据库领域,旨在使用声明性的方式来操作数据。从 Don Chamberlin 和 Ramond Boyce 发表“SEQUEL:一门结构化的英语查询语言”以来,关系型模型和 SQL 已经得到了广泛扩展,并被用在大量的技术中,如 OLTP、OLAP、对象数据库、对象关系型数据库,甚至是 NoSQL 数据库。SQL 也为非关系型数据库带去了设计灵感,比如用于对象数据库的 SQL、用于对象关系的 SQL、用于 XML 的 SQL、用于空间数据的 SQL、用于搜索的 SQL、用于 JSON 的 SQL、用于时序数据的 SQL、用于流的 SQL,等等。各种与数据打交道的 BI 工具也使用了 SQL。事实上,SQL 是最成功的第四代语言。


SQL之所以神秘,是因为它的强大。


SQL 以关系代数为基础,目标是提供一种接近英语的查询语言:


  • 具有声明性;

  • 可以通过组合的方式写出复杂的查询;

  • 可以利用由Edger F Codd开发的关系型模型。


大数据试图在数据仓库领域补足或替换关系型系统,但它们仍然使用了 SQL。Hive、Impala、drill、BigSQL 都使用了基于 SQL 的语言、优化器,并使用了与 SQL 相似的大规模并行处理。它们还时不时地增加新的 SQL 特性。SQL 中的数据存储格式、数据模型和查询处理的分离带来了一些非常重要的好处。在 SQL 诞生以来的 45 年当中,很多数据库来了又去。NoSQL 运动浪潮甚至在无意中暗示了 SQL 和 SQL 数据库即将死掉。但 SQL 阵营很坦然地面对这个问题,Don Chamberlin 最近表示:“当一门语言被广泛认可,以至于其他语言开始标榜自己不同于这一门语言时,说明这门语言一定表现得很好”。


另一个数据库阵营是 NoSQL。虽然现在对 NoSQL 的定义是“Not Only SQL”,但其实 NoSQL 在最开始想要远离 SQL,并尝试使用其他语言和框架,比如 map-reduce。但在十年之后,几乎每一个流行的 NoSQL 数据库都有了 SQL 变种:Couchbase 的 N1QL、Cassandra 的 CQL 和 Elasticsearch 的 ElasticSearch SQL。你可能会说:“MongoDB 并没有 SQL”。但我敢肯定地说:“它将会有一个非常简单的 SQL 实现”。


关系型模型已经非常成功了,不过数据库还支持其他各种数据模型:JSON、图、XML、时序、空间、长列、列式、文档,等等。这些数据库当中大部分都有自己的 SQL 实现版本,即使是 NoSQL 数据库也实现了 SQL 或者受 SQL 启发的查询语言。即使是在最性感的“数据科学”领域,SQL 仍然是一项非常被看重的技能。


现在,NoSQL数据库中的SQL项目比SQL数据库中的SQL项目还要多。



为什么 SQL 会如此成功?


  1. 可声明性:你只要声明好要输出什么,查询引擎会为你找到最优化的方式来执行查询。Pat Seliner等人在1979年发明的基于成本的优化器一直在持续地提升SQL的查询速度。这也提高了其他新进者的准入门槛。最近的一篇Apache Hive论文解释了优化器的复杂性。

  2. SQL不只是被用在“查询”方面,它也被用来更新数据,而存储过程、UDF(用户自定义函数)通过结合过程语言和声明性的SQL扩展了SQL的能力。

  3. SQL具有非常好的可延展性。SQL标准经过多次扩展,每次都加入了很多新特性、新语法和新的关键字。可以肯定的是,并不是所有SQL标准都是一样的。即使是RDBMS的传统SQL实现也不会完全兼容,除非在写SQL时非常小心地考虑兼容性问题。除了这些之外,SQL的精髓都是一样的。SQL++是SQL进化的一个很好的例子。Don Chamberlin和Mike Carey就SQL是否需要支持复杂的数据模型进行过讨论,以便让用户和开发人员可以方便地访问JSON格式的数据。Don撰写的“SQL++ For SQL User: A Tutorial”一书介绍了SQL++的发展情况,SQL++是一门被设计用来处理JSON数据模型的语言,同时与SQL兼容。

  4. SQL为我们带来了新的想法,扩展了新的数据类型、访问方式和应用场景。

  5. SQL本身与数据表示是分离的,可以被用在非关系型数据上,比如CSV、JSON以及其他所有的大数据格式。有些人认为关系型模型表示非常死板,所以认为SQL也是死板的。但事实上,对于给定的schema,SQL可以实现任意数据格式的SELECT、连接、分组、聚合。


SQL 的支持情况


既然 SQL 现在已经无处不在,我们就有必要对 SQL 的支持情况进行一番了解。


  1. 了解每种工作负载的特点和目标。例如,是交互式的应用程序还是交互式分析?抑或是批次分析或BI?

  2. SQL所支持的语句反应了运维能力。

  3. 在表达式(标量、聚合、布尔值)、连接(内连接、左/右/全连接)、子查询、视图、排序、分页(LIMIT/OFFSET)方面的能力。

  4. 索引:没有索引的SQL只是一个图灵机原型。

  5. 优化器:查询重写、选择正确的访问路径、创建最优的查询执行路径让SQL成为最成功的第四代语言。有一些带有基于规则的优化器,有一些则带有基于成本的优化器,有一些二者兼而有之。优化器是非常重要的一个因素,一般的测试基准(如TPC-C、TPC-DS、YCSB、YCSB-JSON)在这方面帮不上什么忙。

  6. 有句话是这么说的:“性能、性能和性能是数据库最重要的三件东西”。对工作负载进行性能方面的测试是非常关键的,YCSB和它的扩展YCSB-JSON可以在这方面帮上忙。

  7. SDK:丰富的SDK和语言支持可以加快开发速度。

  8. BI工具支持:对于大型的数据分析来说,BI工具的支持是非常重要的。


N1QL 作者 Gerald Sangudi 曾经表示,SQL 是非常成功的,因为它代表了数据处理的基本操作。SQL 支持一组丰富的操作,SELECT、连接、嵌套、分组、聚合、HAVING、WINDOW、排序、分页,等等。在谈到数据操作时,这些就是我们要考虑的所有东西吗?这个问题还有待观察,不过我们可以肯定的是,其他语言(比如 Python 和 Java)正在为这些数据操作添加运算符。或许其他的语言也会跟风。SQL 已经走到了关系型模型没能走到的地方。


原文链接https://blog.couchbase.com/unreasonable-effectiveness-of-sql/


2019 年 4 月 11 日 08:007476
用户头像

发布了 731 篇内容, 共 359.6 次阅读, 收获喜欢 1824 次。

关注

评论 1 条评论

发布
用户头像
很强大的语言,简单到你只需要有一点计算机知识就可以写出来一句sql语句,但是如果要深入学习还是很复杂的。一个声明性质的语言能做到这么强大已经很厉害了。
2019 年 04 月 16 日 21:08
回复
没有更多评论了
发现更多内容

机会,是不会让你准备好的

Winann

学习 生活 知识管理 机会

游戏夜读 | Scikit-learn迎来0.21版本

game1night

笔记:《如何系统思考》之如何应用系统思考

wiflish

思维方式

微服务为什么要有服务发现与注册?

攀岩飞鱼

微服务 微服务冶理 微服务发现

回“疫”录(19):都什么时候了,还在搞“填表抗疫”

小天同学

疫情 回忆录 现实纪录 纪实 形式主义

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

江南一点雨

spring Spring Boot spring security

EasyExcel最权威教程

知春秋

Java Excel EasyExcel

2020第一篇技术博客

java劝退师首席大弟子

生活

Collaboration on SaaS

zhenglei

SaaS Collaboration Cisco Webex

Java如何处理异常情况

Rayjun

Java 异常

【高级进阶】写给大忙人看的JDK14新特性

知春秋

Java java 14 java 14 新特性

计算机中的递归对普通人有什么启示?

BitSea

算法

少说废话,先干起来

白鸽

学习 个人成长 自律

如何搞定Kafka重复消费?

奈学教育

kafka kafka配置

程序员的晚餐 | 5 月 17 日 当西红柿遇上鱼

清远

美食

2020年比以往任何时候更想做成的使命感

乐少

有问必答(2020-05-09):如何督促自己做好一件事情?

冯夷

生活

从连续两届图灵奖(2018-2019)看GPU发展史

GPU

人工智能 gpu 计算机基础 计算机图形学 计算机体系结构

写作对我的意义

Neco.W

总结 思考 写作 感悟

Kotlin协程实践之进程、线程、协程

陈吉米

Java kotlin 协程 Coroutine

11 万字的字节码编程系列合集放送(ASM、Javassist、Byte-buddy、Javaagent)

小傅哥

Java asm bytebuddy 《字节码编程》

键入网址后,其间发生了什么?

小林coding

TCP 计算机网络 网络协议 IP HTTP

《零基础学 Java》 FAQ 之 8-Java方法调用是传值还是传引用

臧萌

Java

浅谈Cloud Native技术对云上产品的影响

韩超

Docker Kubernetes 云原生 IaaS PaaS

一种练好英语口语的方法

七镜花园-董一凡

学习

发布Maven包的正确姿势

廖雪峰

maven 开源

DevOps生命周期,你想知道的全都在这里了!

DevOps 测试 持续集成

比AtomicLong更优秀的LongAdder确定不来了解一下吗?

一枝花算不算浪漫

并发编程 jdk源码

码农理财(一)

北漂码农有话说

理财

Docker 镜像制作教程:针对不同语言的精简策略

米开朗基杨

Docker Dockerfile

从零到部署:用 Vue 和 Express 实现迷你全栈电商应用(一)

图雀社区

node.js vue.js Vue

为什么说SQL是最成功的第四代语言?-InfoQ