引言
最近在做一项业务的数据分析,调用的数据超过了目前公司配置的ETL工具能处理的范围,被迫营业,又捡起了SQL。熟悉SQL的同学请关掉本文,免得我班门弄斧。
01 - 工欲善其事,必先利其器
但是秉着务实的角度,解决问题并不需要追求牛逼的工具——Excel透视表能解决的,就用Excel,根本不需要搬出SQL、R、Python。
但如果被迫要写SQL,我建议使用DataGrip IDE。它界面友好,可以直连数据库运行,含自动排版功能,有自动联想提示,还有语法纠正,减少了犯低级错误的概率。淘宝搜索一下,可以解锁Pro版本,不差钱的请从官方渠道购买。
2、描绘旅途终点
以前向BI提数据分析需求时,他们往往会让我提交一份预期终表的表头。自己写的时候也是一样,必须明确:目标表的表头是什么。从这个最终的目标再反向推,有哪些现有的数据,通过聚合、计算,可以拼凑出这个最终的图景。
3、什么都不如官方文档好
知道最基本的select from where后,其余所有的语法都可以通过搜索后使用。
---SQL三板斧:
select 字段1,字段2,字段3 ---最终表需要呈现的字段/列
from form1 ---从什么表抽取
where 字段1!=0, 字段2>2 ---限制条件
但有时候在百度搜索到的语法,并不适用你所调用的数据库类型。像我司使用的数据库是Vertica,所以在一些SQL的语法上,存在特殊的写法,这时候,官方的文档即是最好的wiki(https://www.vertica.com/docs)。通常在百度搜到的文章会是csdn的文章,官网不知道在哪里,所以有条件的同学最好使用Google。
4、了解SQL执行顺序,提高效率
与直观相违背的是,SQL执行的顺序,并不是语法上常见的顺序(比如在尾部增加limit 50,其实只是展示量控制在50,实际的计算量并没有少,只是在展示时显示的数量变少):
---左侧序号为实际执行顺序,右侧为书写顺序
(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
知道这个有什么用呢?比如把限制条件写在on和where上,是否有区别?肯定有区别。因为执行顺序,是先on再where。知晓其执行原理,会让语句的排布更加科学。
5、分而治之,面向对象查询
这里的意思是,尽量避免嵌套,除非你脑容量比较大,逻辑清晰。层层嵌套很容易把人绕晕——定位问题、检查数据非常麻烦,根本不知道哪个环节错了。
---层层嵌套
select * from (select * from aaa) a
join (select * from bbb) b on xx
join (select * from ccc) c on yy
join (select * from ddd) d on zz
---或者另外一种写法:
with tableA as ( select * from aaa ),
with tableB as ( select * from bbb ),
with tableC as ( select * from ccc ),
select * from xxx
所以尽量多使用中间表,当语句复杂到一定程度时,需要有意识的停止编写,让它成为一个独立的数据表。
创建中间表,只需要找到数据库上你有建表权限的一个地方,使用create table xxx,然后接着select语句即可。如果要更新数据,则使用drop table xxx,删除即可。
---把drop放前面,整体运行时会先删除原表,再把新的数据存入同名的表,相当于更新
drop table xxx
create table xxxx
select * from table1 where yyy
有了一个个中间表后,好处是,你在检查数据的时候,只用写一行最简单的语句即可,如:
---查看数据
select * from xxx
---检查表格行数
select count(1) from xxx
---检查样本
select * from xxx where aaa = '', bbb='', ccc='' xxx
不用在原始语句上修改一堆嵌套的select语句。并且,这个操作仅仅是读表,不用重新运算,跑起来飞快!
6、join之后,肥了?瘦了?
肥瘦指join之后,行数变多还是变少。inner join取交集一般会导致数据变瘦,left join和union大部分情况下数据会变肥。
每次进行join操作时,最好都看一下操作前后表的行数是否有变化,变多还是变少,是否符合预期。
---常用检查语句
---检查表行数,count(1)含义是对第一个字段计数
select count(1) from xxx
---去重检查
lect count_distinct(xx) from xxx
---根据某字段分组聚合查询
select count(xx) from xxx group by yyy
结语
数据分析最重要的是Get hands dirty,不上手摸一摸数据,根本不知道会遇到什么状况。最后感谢余总的大力扶持和悉心教导。

网友评论