CategoryResourceRepost/极客时间专栏/SQL必知必会/开篇词/开篇词丨SQL可能是你掌握的最有用的技能.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

102 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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