入门SQL

信息来源: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

http://www.sublimetext.cn/

代码存在自己的文件夹里可以方便查查和调用

使用同一个代码管理工具写代码会对颜色、语法更加熟悉

方便整理代码结构

充分证明能力和学习态度

准备好自己的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

尝试运行结果,不通过先百度

看通过的代码,反向推导思路

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容