信息来源:https://share.mubu.com/doc/uf3vg8s5ar
入门SQL
基础用法
select--from--where--group by--having--order by--limit
基础表链接
子查询
窗口函数
运行原理
培养正确的数据处理意识
你的数据处理能力在哪一层?
1、没有接触过任何数据处理工具
2、会Excel或WPS的一些简单用法,但很多用法还需要继续学习
3、经常处理数据,熟练掌握Excel或WPS的透视表和各类函数,但不会用其他的高级工具
4、除Excel外,还会使用SQL、Tableau等高级的数据处理工具,但不熟练
5、熟练掌握所有主流的数据处理工具
Excel/WPS: 十万行以下数据不重复执行的处理与分析,百万级数据的查看
SQL/PreBulid/Alterxy:任意量级数据流程化、可重复的处理
Tableau PreBulid
Alterxy
Tableau/PowerBI: 任意量级数据敏捷、可重复的分析
Python/R/VBA: 任意量级数据的任意处理
工具不是目的,只是提升分析效率的手段
工具的价值 = 当前分析效率的提升程度 - 工具自身学习成本
通过比较SQL、Tableau、Excel的运行原理,让大家理解数据工具的底层原理其实都是相通的
SQL运行原理
子查询
重要的是逻辑,而不是语法
子查询就是将一个查询(子查询)的结果作为另一个查询(主查询)的数据来源或判断条件的查询。
常见的子查询有WHERE子查询,HAVING子查询,FROM子查询,SELECT子查询,EXISTS子查询,子查询要使用小括号();
https://www.cnblogs.com/fzxey/p/10896244.html
如果你感觉一次查询无法完成,就使用子查询,然后再逐步优化!
准备表格
复制源数据进行连接、筛选
from: 从以下数据库中
SQL
从数据库中找到from后指定的表格,复制一张完全一样的表格用于查询处理
Excel
找到文件中的表格打开并备份
Tableau
连接到指定名称的数据表格
join: 表格连接
你脑海里一定要有两个具象化的表格!
https://www.cnblogs.com/reaptomorrow-flydream/p/8145610.html
where: 将数据按以下条件进行筛选
SQL
基于from复制的表格,按照where后的条件对表格中的行进行筛选
=单个数值精确匹配
in可以实现多选,not in可以反选
and/or可以并列多个条件
like配合通配符进行模糊匹配
Excel
自定义筛选
Tableau
数据源筛选器
如果需要进行聚合运算,则基于连接、筛选好的数据,创建“数据透视表”
groupby: 对数据进行分组(那分组到底是什么意思呢?)
SQL
distinct是删除逻辑而不是合并逻辑。
对数据进行分组 = 对group by后的字段进行去重合并,并作为后续聚合运算的依据
group by其实只指定了聚合函数的计算依据
具体的聚合运算还是要由聚合函数进行
因为group by先运行,并且运行后,表格中的非聚合字段已经形成了,所以select后的非聚合字段一定要与group by后指定的字段一致
也就是说:group by后没有的非聚合字段select无法显示,但group by后有的非聚合字段select可以选择不显示
Excel
数据透视表-拖拽字段到行
Tableau
近似为在工作表中将字段拖拽至行
having: 在分组后的数据中找到满足以下条件的数据
SQL
数据分组后,对作为分组依据的非聚合字段和分组后聚合运算的结果进行筛选,除了对象,具体的语法和where完全一致
这个代码能不能运行?
SELECT continent
FROM world
GROUP BY continent
HAVING SUM(population) >= 100000000
and continent != 'Asia';
答案
可以
所以,只要是group by后的字段having就可以筛选
不过,这样写要被数仓打爆头,正确的写法应该是
SELECT continent
FROM world
WHERE continent != 'Asia'
GROUP BY continent
HAVING SUM(population) >= 100000000
这个代码能不能运行?
SELECT continent
FROM world
GROUP BY continent
HAVING SUM(population) >= 100000000
and population >= 50000000
and name != ‘China’
答案
不行
having无法对非聚合运算结果和非group by后的字段进行筛选,这些筛选需要在源数据处理前通过where实现,这样的效率才是最高的
Excel
透视表中的筛选器
Tableau
工作表中的筛选器
查询字段
对准备好的表格进行排序和行数限制
orderby: 根据以下字段的升/降序进行排序
SQL
按照字段的顺序对表格的行进行排序,默认升序,字段后加DESC为降序
Excel
升序、降序
自定义排序
Tableau
数据源排序+视图排序
limit: 留下指定行数或指定位置的数据
SQL
基于排序好的表格,指定行数的数据
limit n 则返回前n行,如:limit 10 返回前10行
limit x,y 则从第x行后返回y行,如limit 10,2则会返回第11和12行
常用来取固定名次的数据,或进行数据的初步查看
Excel
只保留指定行数
Tableau
数据源界面限制查看的行数,但是不能保留指定位置的数据
查询表格中的字段,并基于已有的字段进行计算
select: (在已经查询好了的数据中)查看以下字段
SQL
基于from、where、group by、having处理好的数据表格,按照select后的计算规则,计算并复制指定的字段
Excel
直接在表格中用函数计算,或者复制粘贴后计算
Tableau
拖拽指定字段或创建计算字段
处理函数
distinct去重
如果同时对两个字段去重查询会怎样?
SELECT DISTINCT continent,distinct name FROM world
SQL会直接报错
Excel会删除两个字段都重复的
Tableau会合并两个字段都重复的数据
distinct还可以进行去重计数
count(distinct 字段)
like、%通配符、_占位符模糊查询
理论上只能跟在where后
'%'代表任意数量字符,"_"只代表单个字符
聚合函数
相当于Excel透视表里的值字段设置,不和group by一起用,会对整个表进行计算
⚠️聚合函数都会忽略列中的NULL值,但是COUNT(*)也就是统计全部数据的行数时,不会忽略NULL值。
case when条件判断函数
CASE语句是用来做条件判断的,如果满足条件A,那么就xxx,如果满足条件B,那么就xx。
需要注意的几点:
CASE 语句始终位于 SELECT 条件中。
CASE 必须包含以下几个部分:WHEN、THEN和 END。ELSE 是可选组成部分,用来包含不符合上述任一 CASE 条件的情况。
你可以在 WHEN 和 THEN之间使用任何条件运算符编写任何条件语句(例如 WHERE),包括使用 AND 和 OR 连接多个条件语句。
使用示例:
如上,我们使用CASE WHEN(条件一) THEN(条件一的结果),ELSE(其他不符合条件一的结果),END语句设立了两个条件,即当standard_qty为0或者不存在时我们返回0,当standard_qty不为0时进行计算,并储存为新列unit_price。
coalesce()空值处理函数
COALESCE(col_1,0) -- 将col_1中的NULL值替换为0
COALESCE(col_2,'no DATA') -- 将col_2中的NULL值替换为no DATA
over()窗口函数
对准备好的表格,在任意分组内部进行排序和计算(为了区分,我们称之为分区)
实现步骤
以https://sqlzoo.net/wiki/Window_functions 第三题更清晰的显示方式为例
SELECT
yr
,party
, votes
,RANK() OVER (PARTITION BY yr ORDER BY votes DESC) as posn
FROM ge
WHERE constituency = 'S14000021'
ORDER BY yr,votes DESC
limit 20
再创建一个之前准备好的表格(还未排序和限制)
FROM ge
WHERE constituency = 'S14000021'
根据partition by 后的字段(没有则默认针对整个表)形成的分区(不去重合并)【Excel演示】
OVER (PARTITION BY yr ORDER BY votes DESC)
在分区内根据order by后的条件对所有行进行排序
————以上创建一个新的表格,并重新进行分区排序就是"over"的本质
OVER (PARTITION BY yr ORDER BY votes DESC)
计算over()前函数的结果
RANK()根据分区内的排序,分配排名
不同排序函数之间的区别:https://blog.csdn.net/shaiguchun9503/article/details/82349050
ROW_NUMBER:唯一且连续排名
DENSE_RANK:不唯一连续排名
RANK:不唯一不连续排名
将结果返回到最终查询出的表格
无论最终查询出的表格排序如何,窗口函数计算的列都只跟窗口函数指定排序下的计算结果一致
如何正确地学习SQL?
不会先想,想完再搜,搜完再想,最后再问
多数SQL问题你都能自己找到答案
不要错过思考的机会,自己想明白了就不会忘了,一次记住才是真的高效
使用本地代码管理工具储存和调试代码——sublime
代码存在自己的文件夹里可以方便查查和调用
使用同一个代码管理工具写代码会对颜色、语法更加熟悉
方便整理代码结构
充分证明能力和学习态度
准备好自己的sql笔记本,记下自己总是遗忘或错误的关键用法,积累常用语句
https://mubu.com/doc/eGQ0OKyH2w
积累半个月就会发现没有要新写的逻辑了
代码规范
代码千万条,注释第一条。代码不规范,亲人两行泪。
多写注释
单行注释:--
多行注释:/*注释内容*/
逗号写在字段前面
注意换行
每行尽量以核心语句开头
核心语句后的内容能写在一行尽量写在一行
where条件过长时,每个都要换行
注意缩进
case when 同一级别的条件
子查询
别名尽量统一缩进
代码结束处加;
不同公司要求不一样,数据建设好的都不用,因为可以直接识别select
学会看报错
不要害怕报错
先检查基础语法、大小写、空格、书写错误
先定位报错的位置linex
认真翻译报错信息
思考可能的报错原因(80%的报错都是因为语句用法不熟和粗心),排除粗心原因
寻找对应解决方法:百度大法好
把你报错的过程和思路记录下来,很快你就能一眼知道报错原因,报错会越来越少
学习新用法
有些语句不会写的时候,先想一下,有没有其他搭配可以完成
试一下你自己的想法,如果报错就处理报错并总结
如果你自己的思路解决不了眼前的问题,此时善用搜索引擎,对于SQL这门语言,百度真的是万能的
最后,多尝试几个搜到的用法,找一个你自己觉得最简洁方便的,然后记下来
不断刷题提升
使用新版sqlzoo刷题https://sqlzoo.net/wiki/SQL_Tutorial
练习顺序
第一阶段:掌握SQL基础用法
答案:https://blog.csdn.net/weixin_45739141/article/details/104079549
第二阶段:掌握SQL窗口函数
答案:https://blog.csdn.net/weixin_44090304/article/details/104473403
第三阶段:挑战SQL自连接和窗口分析函数
窗口分析函数用法介绍:http://lxw1234.com/archives/2015/04/190.htm
窗口分析函数考察得极少
工作场景中用得也不多
但是用窗口分析函数可以极大地提升查询效率,笔试时也能帮你脱颖而出
我们明天讲关键题型时会讲到
答案:https://blog.csdn.net/qq_42314101/article/details/105890776
第零步:翻译+中英文对照
下载:https://www.google.cn/chrome/
用谷歌浏览器翻译页面,直接点中文页面会是繁体,并且无法练习所有内容(少了窗口函数和疫情数据练习)。中英文要相互校对着看
第一步:仔细阅读背景和示例数据
https://sqlzoo.net/wiki/More_JOIN_operations
不要错过每一个细节
这也是训练大家耐心和细心的练习
第二步:select * 查看数据
必要时可以直接复制数据到excel做好字段注释
第三步:理清数据对象、详细级别、字段含义
这个数据到底在描述什么?
后面很多小伙伴读不懂题目都是因为
第四步:仔细读题,认真翻译
第五步:理解示例/默认代码含义,没看懂一定要去百度
第六步:复制代码到sublime,整理代码规范
第七步:根据题意自己动手修改代码,并反复理解、尝试
第八步:看答案反推,记录错误原因和解题思路到幕布
第九步:全部题目做完,做章节练习题
隐藏步骤
了解数据背后现实场景
使用牛客网刷题
按通过率排序刷:https://www.nowcoder.com/ta/sql
打草稿,理思路,脑海中构建表格和字段关系
牛客网没法看运行结果,只有对错判断,最大程度还原了SQL笔试环境
成熟的分析师也都是构思完成后直接写,运行只拿来debug
尝试运行结果,不通过先百度
看通过的代码,反向推导思路