<audio id="audio" title="开篇词丨SQL可能是你掌握的最有用的技能" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/2f/ba/2f1e257adfee55598c1da180c4a643ba.mp3"></audio>

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 &gt;= 7000 AND role = '法师'

```

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

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

```
SELECT COUNT(*) as num FROM new_user WHERE TO_DAYS(NOW())-TO_DAYS(regist_time)&lt;=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学习之旅呢？
