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 学习之旅呢?
留言