1946年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在这片江湖里沉浮,有的方兴未艾,有的已经几幕兴衰。

但在这片浩荡的波动里,有一门技术从未消失,甚至“老当益壮”,那就是SQL。

SQL作为与数据直接打交道的语言,是与各种前端、后端语言进行交互的“中台”语言。

不论是前端工程师,还是后端算法工程师,都一定会和数据打交道,都需要了解如何又快又准确地提取自己想要的数据。更别提数据分析师了,他们的工作就是和数据打交道,整理不同的报告,以便指导业务决策。

尽管技术人员或多或少地会使用SQL,但不同的人编写出来的SQL的效率是不同的,比如说一份好的SQL执行计划就会尽量减少I/O操作,因为I/O是DBMS最容易出现瓶颈的地方,可以说数据库操作中有大量的时间都花在了I/O上。

此外,你还需要考虑如何降低CPU的计算量,在SQL语句中使用GROUP BY、ORDER BY等这些语句会消耗大量的CPU计算资源,因此我们需要从全局出发,不仅需要考虑数据库的I/O性能,还需要考虑CPU计算、内存使用情况等。

比如EXISTS查询和IN查询在某些情况下可以得到相同的结果,但是具体执行起来,哪个效率更高呢?

假设我把这个模式抽象为下面这样:

SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
SELECT * FROM A WHERE EXISTS (SELECT cc FROM B WHERE B.cc=A.cc)

在查询过程中,我们需要判断表A和表B的大小。如果在有索引的情况下,表A比表B大,那么IN子查询的效率比EXISTS子查询效率高。

当然,SQL的实用和强大远远不止体现在IT技术领域,在产品和运营方面,SQL更是发挥了它强大的威力。

举个例子吧,假设你是一款游戏的产品经理,你想查询各种条件下的英雄都有哪些,比如最大生命值大于7000的法师英雄都有谁,那么你会怎么做呢?是找研发帮忙?还是从大量的数据里慢慢找?

当然这两种方式都可以,但如果每次都找研发也怪不好意思的,自己动手找吧,效率又很低。

实际上用一条SQL语句,你就可以直接从数据表中得到答案:

SELECT * FROM heros WHERE hp_max >= 7000 AND role = '法师'

SQL语句直观到你就算没有SQL基础,也能凭借英语基础猜出它的大致意思。这就是SQL最大的特点。

假如你是一名运营人员,想要看下7天内的新增用户数有多少,该怎么做呢?首先我们需要获取现在的时间,使用NOW()函数即可,然后把它转化成天数,与用户的注册时间进行对比,小于7天的时间即是我们的筛选条件,最后就可以得到想要的数据了:

SELECT COUNT(*) as num FROM new_user WHERE TO_DAYS(NOW())-TO_DAYS(regist_time)<=7

上面举的两个例子属于相对简单的SQL查询,SQL还可以帮助你统计每日新增、每日活跃、次日留存的数据。

事实上除了业务之外,基于数据的各种技术中也会用到SQL,比如OLTP(联机事务处理过程)、OLAP(联机分析处理过程)、RDBMS(对象关系型数据库管理系统)。甚至是在NoSQL的阵营上,如今也在使用类似SQL的操作,要知道,提出NoSQL这个概念的初衷就是远离SQL,但如今人们更愿意把NoSQL定义为Not Only SQL(不只是SQL)。此外在我们熟悉的XML、JSON等数据格式中,都存在着各种SQL,比如用于XML的SQL、用于JSON的SQL等。除此以外,还包括了用于记录地理位置信息的SQL、用于搜索的SQL、用于时间序列数据的SQL、用于流的SQL等。

可以说不论是和业务打交道,还是和数据相关的技术打交道,都需要SQL。

如果你从事编程或身处互联网行业,那么没有什么比学习SQL语言更有价值。SQL可能是你掌握的最有用的技能。对数据了解的需求往往是高频的,因此自己掌握SQL在实际工作中是非常有必要的。

不论是产品经理、运营人员,还是开发人员、数据分析师,你都可以用到SQL语言。它就像一把利剑,除了可以提高你的工作效率之外,还能扩大你的工作视野。

如果你没有SQL基础,我希望这个专栏可以帮助你彻底理解SQL,从而开启你的数据之旅,比如如何用SQL检索数据、过滤数据,如何使用SQL函数、子查询……考虑到在实际工作中,你还会接触到不同的关系型数据库管理系统,我还会讲解SQL在不同的数据库管理系统中是如何使用的。

即使对于有SQL基础的同学来说,面对同样的SQL语句,查询效率可能千差万别。在你实际工作的时候,如何快速定位SQL的性能问题,并找到正确的优化方案会让你的价值倍增。

数据是SQL的生命力,你不用担心面对干巴巴的SQL语言而感到无从下手,为了避免纸上谈兵,让你在工作中更容易、更熟练地使用SQL,我特意为专栏建了一个王者荣耀数据库和NBA球员数据库。这些数据库既是我在讲解SQL时要用到的事例,也是你课后练习的素材。

我相信以理论为骨,以数据库为翼,才能让你在消化理论的同时也能上手练习,真正了解和驾驭SQL这门语言。

因此,我把专栏分成了四个部分,既可以让你掌握SQL这门语言,也可以让你了解最新的数据库管理技术。

1. 基础篇

SQL的语法非常简单,就像英语一样,但它的功能却很强大,可以帮助我们对数据实现索引、排序、分组等功能。但是这些命令在不同的数据库管理系统中的使用却有所差异,因此在专栏中,我不仅会重点讲解SQL本身的语法,还会讲解这些语法在类似MySQL、Oracle、SQL Server等不同的数据库管理系统中是如何使用的。

2. 进阶篇

很多人在写SQL的时候都会遇到这样的问题:“同样都是用SQL查询数据,为什么我写的语句要比别人的慢?”

事实上,就是因为SQL语法简单,导致很多人写的时候不拘小节,比如搞混了关键词的顺序,这就在无意中降低了SQL的执行效率。

在这一部分,我会讲解在实际工作中,使用SQL经常会遇到的问题,以及如何使用工具进行分析,快速定位性能问题及解决方案。

3. 高级篇

在大数据的时代,诞生了很多适用于不同场景的数据库管理系统,既有基于SQL的关系型数据库,比如Oracle、MySQL、SQL Server、Access、WebSQL、SQLite等,也有NoSQL非关系型数据库,比如MongoDB、Redis等。

在这一部分中,我会讲一讲各种主流数据库管理系统的使用。

4. 实战篇

以上几个部分是在帮你梳理SQL的知识体系,但只有学会用SQL系统地进行项目实战,你才能真正地学以致用,让SQL为你的工作助力。

在这一部分中,我会结合数据分析的项目,为你讲解SQL的实战案例,比如如何用SQL做数据清洗、数据集成等。

如果你是一名程序员,那么会用SQL无疑是你的基本技能;如果你是产品经理或者运营人员,那么SQL将会为你打开一个全新的世界,让你从不一样的视角看待数据,利用数据。

我希望这个专栏可以带你走进SQL的世界,让你掌握它的基础语法,学会分析性能问题,一步步精通SQL。这时你会发现,原本毫无规则、抽象的数据仿佛一下子具象了,变得会说话了,它会告诉你数据之间彼此的关联、背后所代表的含义……

SQL让我们看到了数据的奇妙,你想不想和我一起开启这场SQL学习之旅呢?