首先说一下编程语言的划分,一般来说,第一代编程语言就是机器语言,0101001,将二进制数据刻录到存储上,就算编程了。第二代是汇编语言,汇编语言非常接近计算机指令,一条汇编命令基本上和 CPU 指令一一对应。第三代就是所谓的高级语言,面向过程和对象的编程语言,比如 C、Java、Python 等等。
第四代语言的定义其实很模糊,大意是你只需要告诉计算机做什么,而不需要告知计算机怎么做。看起来是不是很智能啊,所以很多技术被归拢到 4GL 里,比如查询语言和报表生成器、图形语言、应用生成器等等。其中 SQL 算是 4GL 的代表,因为 SQL 就是用类英语的自然语言写一条语句,告诉计算机咋做,然后等着出结果就完了。
45 年前,两名年轻的 IBM 研究员将一门关系型语言带到了数据库领域,旨在使用声明性的方式来操作数据。几十年过去了,关系型模型和 SQL 得到了广泛引用,比如 OLTP、OLAP、对象数据库、对象关系型数据库,甚至是 NoSQL 数据库。SQL 也为非关系型数据库带去了设计灵感,比如用于对象数据库的 SQL、用于对象关系的 SQL、用于 XML 的 SQL、用于空间数据的 SQL、用于搜索的 SQL、用于 JSON 的 SQL、用于时序数据的 SQL、用于流的 SQL,等等。各种与数据打交道的 BI 工具也使用了 SQL。事实上,SQL 是最成功的第四代语言。
现在 SQL 不仅是程序员的必知必会,也是运营人员和产品经理的必备技能。你想做自定义的数据分析,最快的方式就是去查询库上写一条 SQL 语句获得自己想要的结果。(注意,不是生产库也不是可写库)
几十年以来,操作系统一直在迭代,语言版本层出不穷,但是 SQL 非常稳定,SQL92 和 SQL99 这两个标准一直沿用到现在,这意味着掌握 SQL 是一件一劳永逸的事情,至少在你的职业生涯中,它都可以发挥作用。
SQL 以关系代数为基础,目标是提供一种接近英语的查询语言:
1、具有声明性;
2、可以通过组合的方式写出复杂的查询;
3、可以利用由 Edger F Codd 开发的关系型模型。
SQL 有多强呢?所有试图摆脱它的技术,最终都是站在 SQL 的肩膀上前行的。
大数据试图在数据仓库领域补足或替换关系型系统,但它们仍然使用了 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。
关系型模型已经非常成功了,不过 SQL 还支持其他各种数据模型:JSON、图、XML、时序、空间、长列、列式、文档,等等。这些数据库当中大部分都有自己的 SQL 实现版本,即使是 NoSQL 数据库也实现了 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必知必会》,作者是陈旸,清华大学计算机博士,也是极客时间专栏《数据分析实战45讲》的作者,该专栏目前已经有 13000+ 人在学习了。
在《SQL必知必会》专栏里,陈旸会从基础讲起,带你学习和巩固扎实的 SQL 语法,再以工作中的常见问题为例,带你编写高性能的 SQL 语句,最终学会在项目中使用 SQL。
在学习使用 SQL 的时候,总是需要一些数据,为此陈旸特地整理了一份“王者荣耀数据库”以及“NBA球员数据库”,以便基于此进行 SQL 的实操训练。就游戏而言,数据查询就涉及很多知识点,包括多表联查、分区分库、用户权限、排行榜、大规模并发和用户数据安全等等。
学完这个专栏你会掌握:
1、熟练的 SQL 语法
2、SQL 性能优化
3、玩转六大常用数据库
4、基于实际数据,进行 SQL 实战(王者和 NBA 球员数据)
扫码查看专栏目录,一分钟,相信会找到你想要的东西。
作为一名程序员,学好 SQL 无疑是基本技能;如果你是产品经理或者运营,那么学好 SQL 将会为你的职场提供独特的差异化,帮你从不同的视角看待数据。相信陈旸可以带你从入门到数据实战,真正学好 SQL 这门高性价比的语言,让你的职业生涯更具备竞争力。