运营必看的SQL(中)

写在前面:如果你是一名程序员又恰好是一名SQLBOY的话,那么请移步,因为下面讲的实在太精彩但不专业;如果你是一名想学会写好SQL的运营,那么你一定要认真来读。

本文用形象的的语言介绍写好SQL六大必须掌握的招式,每一式都是你写好SQL的关键。可能你之前只是会用之前的一招或者两招,下面教你的是如何六招联用,发挥无穷法力。

第一式(WHERE):少商剑,剑路雄劲,颇有石破天惊,风雨大至之势 

中文意思,“在哪?哪里?”那在SQL里面where 主要用来干嘛呢?主要用来过滤数据集,所谓的过滤就是把不符合一定规则的数据给干掉,同时把符合条件的数据保留下来,这就是过滤的意思。

写在SQL里面 where 后面一般是接布尔表达式,例如:where name='张三' 表示如果name(姓名)是张三的就保留下来,其他的舍弃。

这是SQL中使用最多最常见的一式,因为我们取数据也都是取我们想要的数据大部分情况下不会是所有的数据。

第二式(JOIN):商阳剑,巧妙灵活,难以捉摸

顾名思义,“连接”的意思,所谓连接就是把两个原本分开的物体结合起来,这种结合要么通过一定的介质把二者粘合起来要么通过暴力手段硬凭借在一起。

举一个不那么恰当的例子,好比两个人结婚,如果是通过媒人介绍的那就是有介质把两个人连接在一起,通过暴力连接的就类似于强扭的瓜,硬扯到一起的。

那么这两种“连接”有什么不同呢,通过介质的连接我们需要在SQL中把介质体现出来,如 a join b on a.id=b.id,这里所谓的id就是介质,通过暴力手段连接起来有个学名叫做“笛卡尔积”,用数学方法来解释就是假如a表有m行数据,b表中有n行数据,那么笛卡尔积的效果就是m*n行的数据集合,也就是说把a表的每一行都与b表的每一行做连接,这样连接以后是一个庞大的数据集,特别是多个表做笛卡尔积时往往会把机器跑死就是这个原因。

join 细分又分为left out join(left join), full out join(full join),inner join(join),right out join(right join)这几种join的区别,可以用下面一组简单的漫画体现:


运营必看的SQL(中)_第1张图片

join常用的场景就是你需要提取的内容(数据列)不能完全从一个表中获取,而是分布在不同的表中(你可能会问为什么设计表的时候不把所有的列设计到一个表中,这就牵涉到范式要求了,后面我们再聊。),这个时候你就需要把不同的表连接(join)起来,然后分别从这些表中提取你需要用到的数据列(连接后的多张表,你可以认为就是一张大宽表了)。

第三式(UNION):中冲剑,大开大阖,气势雄迈 

上面是连接,下面是联合,从字面意思大家也略微能体会到二者的差异,连接是在拓宽了长度,二联合这是增加了宽度(厚度)。

举个形象一点的例子,join是把一根折断的筷子给接起来拼接成一根完整的筷子,二union是把两根筷子握在一起,形成一双筷子。

根据这个列子我们也很容易得出二者的一些语法差异,join对“连接”起来的多个数据表没有列数的要求,而union则必须要求“联合”起来的两个或者多个数据集保持相同的列数。

union 还有一个兄弟叫union all,所谓all就是把数据完全揉和在一起,二不带all的通常会把多个数据集中重复的数据行(每一列的值都相同)去重,只保留一行。

union 常用的情景是:多个数据集之间没有明显的关联(join)关系而你要的内容又分布在这些数据集中,这种情况下就需要union出场了。一般来说使用union就够了,因为没有必要保留两个完全相同的数据行。

第四式(GROUP BY):少泽剑,忽来忽去,变化精微

group,分组的意思,这一招是分析师最常用的。在什么情况下我们会用到分组呢,当我们想按照某个维度查看数据情况时,

比如查看每个学生的高考总分,各科中的最高分,最低分,平均分时都要用到分组这个概念。

总结一下,如果你的需求中有”每“,”总“,”最大“,”最小“,”平均“这几个关键字时,大概率是要用group的。

分组用来分析一般有两层意思,一是计算用来分组的维度上的统计量(计数、求和、均值等),二是比较不同组在这些分组维度上量的差异,便于对比。

group by后面的关键字就是你想要分组的维度,如城市、班级、日、月、年等。

第五式(HAVING):少冲剑,轻灵迅速

这一招是必须紧跟上面一招才能发出来的,但是它的威力也是巨大的,用的好的话可以起到事半功倍的效果。

这一招的效果其实跟第一招where有点类似,只不过where一般来说是对原始数据的单条数据进行过滤,而having则是对分组(group)聚合后的数据结果进行过滤。比如我们想取出本省高考总成绩大于600分的同学,这个时候having就排上用场了。当然你也可以用where,只不过会复杂一些,我们这里就不提倡了。

前面也说了,这一招是紧跟在group by后面使用的,所以在写法上也必须在group by 后面,如:group by student_name having sum(score)>600。

这一招通常适用的场景就是分组聚合后,分的组过多,而且有些组并不是关心的数据,这时候你就要想到having了。

第六式(ORDER BY):关冲剑,以拙滞古朴取胜

这是最后一招,这一招可能不是最厉害的一招,但是确实最伤元气的一招。为什么说他耗费元气呢,举个例子:上体育课,体育老师要求按照男生、女生分成两组。大家是不是很快就分好了;但是如果老师说不同组内在按照身高排序列队,是不是就很耗费时间了。

同样order排序虽然不是人来执行,但是计算机也要比较每一条记录的大小,在数据量很大的情况下,计算机它也快不了。

排序有什么用呢?其实用到的地方还是挺多的,比如统计各省的高考状元、榜眼、探花,女生最高分,男生最高分;本月内业绩最好的员工,入职最早的员工等,都要用到order by。

总结来说,order及可以对原始数据按照某一列排序,也可以对统计后的结果排序。

默认的排序是升序,就是按照从小到大的顺序排列,通过指定关键字desc 可以降序排序,顺序与前者相反。另外如果指定的排序列是数值型的列则按照数值的大小排序,如果指定的列是字符型的列则按照字典的顺序进行排列。

看完后,这SQL的六脉神剑你学会了吗?下次试试六式齐发,一招制敌吧。

你可能感兴趣的:(运营必看的SQL(中))