教程基本介绍与SQL基础知识
教程的目标
目前公司的发展逐步开始追求精细化运营,这就使得数据分析师成为各大企业的招聘热点,近些年来对数据分析师的招聘要求也在逐步提高。当前的招聘中,SQL已经成为数据分析师的必备技能,而且考察越来越严格;同时SQL也逐渐成为运营、产品等岗位的加分项。SQL是一项学习起来非常容易的技能,但作者在之前学习过程中没有找到一份适合数据分析师的SQL教程,走了很多弯路。因此结合互联网大厂的工作经历和数据分析师的面试经验,总结产出了这套数据分析师的SQL教程。这份教程中涵盖了数据分析师日常工作中99%以上的SQL技能,掌握这些技能,可以非常容易地通过面试中的SQL考察。
为什么说当时没找到一份合适的面向数据分析师的教程。因为当下的教程是全而浅的教程,没有深入数据分析师的工作中去。所以在介绍SQL内容之前,先来定义一下数据分析师所需要的SQL知识范围。SQL,全称是Structure Query Language,是操作数据库的语言。所以SQL涵盖了数据库操作的全部工作,包括库、表、用户、记录的增删改查,还包括表的锁管理等各方面内容,对于数据分析师而言,需要非常熟练的掌握数据表的查询和偶尔使用的数据表的增加、修改和删除。即只需要掌握对数据表的增删改查即可。数据库的增删主要由数据开发工程师负责,用户的增删改查主要是数据安全部门负责。对待学习的态度应该是求深,而不是求全。
SQL教程大纲
该系列SQL教程分为五部分:
- 数据表的增、删、改
- 单表数据查询
- SQL函数
- 子查询和多表连接查询
- SQL课后习题
数据分析师的日常工作主要是数据查询和少量的数据表增、改。为了方便大家在学习过程中进行练习,所以会首先介绍如何使用SQL新建、修改和删除数据表;在学习数据表的操作后,开始介绍对于单表的数据查询,单表数据查询是SQL教程中最复杂的内容;SQL表中的数据可能并不是数据分析想要的数据,需要使用函数进行相应的变换,所以在单表数据查询后开始介绍SQL的函数;数据分析工作不可能基于一张表实现分析,所以最后一部分会介绍子查询和多表连接查询。
在介绍基础知识后,会给出一个具体工作场景下的SQL练习题,对前面介绍的基础知识进行巩固练习。
其中单表查询是基础,子查询和多表连接查询是方法。学会单表查询基本是学会了75%的SQL,子查询和多表连接查询相对而言比较简单。在详细了解SQL以前,先来说下作者对SQL的理解。SQL其实是在做数据梳理工作,把各种数据表的数据整合在一起,并通过函数等对数据进行一定处理,进而支持数据分析的工作。
在讲解具体的SQL代码之前,先来了解下数据表。数据表是SQL操作的对象,只有了解清楚数据表后,才能对SQL所实现的功能有直观的认知。
SQL的查询对象:表
表的层次
Mysql等数据库
在Mysql等数据库中,表的层次包括两类:数据库和数据表。下图是截取的SQL Server数据库中的一部分,其中apriori是数据库的名称,在这个数据库下有着很多表,如dbo.crmidid等。
数据仓库
随着大数据时代的到来,互联网公司都已经累计了大量的数据,如果仍然采用MySQL等数据库进行存储,就会出现大量的数据库和数据表,难以进行后续的数据分析工作。因此,会对大量的数据进行分层管理。举个例子,淘宝记录了大量的数据,大的层面可以分为店铺和消费者数据,具体到消费者,会包括消费者的注册、浏览、购买、投诉等数据,以上所有数据都会被记录,如果采用传统数据库,就会包含大量的数据库,难以进行有效管理和使用。
数据层次结构如下:
- 源数据:不同的业务都会记录大量的数据,但是记录下来的并不一定是结构化数据,有些可能是json格式存储的数据,有些可能是埋点数据等,这些数据被统称为源数据,也就是最开始的数据,不方便直接使用的数据;
- ODS层数据(Operational Data Store,操作数据层):通过对相应的数据进行ETL(Extract-Transform-Load,抽取-转化-加载),可以把这一过程理解为数据清洗过程,把非结构化的数据转换为可以使用的结构化数据,经过此步处理,生成了ODS层数据;ODS层的数据是包含全部的数据的,也就是淘宝的店铺、消费者的全部数据,对于数据分析师而言可以使用ODS层的数据进行分析,但是仍然不方便查找数据。
- DW层数据(Data Warehouse,数据仓库层):所以在ODS层数据进一步加工处理,形成DW层数据,数据仓库是面向同一主题的数据的集合,相当于对ODS的数据按照主题进行划分,如淘宝的商铺数据建立一个DW,消费者建立一个DW等,DW层数据又可以分为三层:DWD层数据(Data Warehouse Detail,数据明细层),DWM层数据(Data WareHouse Middle,数据中间层)和DWS层数据(Data WareHouse Service,数据服务层)。
- DWD层数据是类似于ODS层的数据,实际记录了相关的数据记录,如消费者在淘宝店铺的点击、下单等动作数据。
- DWM层数据是基于DWD层数据的轻度汇总数据,如公司数据监控中常用的核心指标等
- DWS层数据,又称为数据集市或宽表,是数据分析师最为常用的数据表层,在这层数据中往往只保留较少的维度(消费者或店铺),同时包含了大量的汇总指标,比方说某淘宝消费者某天的打开次数、浏览时长、下单量等汇总数据。由于包含有大量的指标,所以此类表数量较少,但使用较多。
- APP层数据(Application,应用层数据)是专门定制化的数据报表,比方说针对新上业务的数据记录等,报表的数据就属于该数据层。
除上述数据分层外,还需要了解事实表和维度表。事实表就是记录真实发生的动作,比方说消费者在淘宝上的点击下单等行为,记录这些动作的时间、消费店铺等等,事实表追求的是能够准确记录下发生的行为。维度表是基于事实表提炼出相应的汇总指标。在数据层次中,ODS和DWD属于事实表,DWM、DWS和APP层数据属于维度表。
数据分层的优点包括以下几个方面:
- 统一规划:使用数据分层可以对公司的数据进行全盘的规划,构建数据体系
- 统一管理:构建好数据层次后,会方便打通全公司的数据体系,避免数据孤岛。同时由于数据是分层的,每一层只专注于某一方面的问题,也就方便数据的管理。同时还可以避免重复性工作,构建好某一层次的数据后,就可以实现公司级的数据通用,避免部门间的重复工作。
- 统一口径:保证数据分析师可以产出准确的数据分析报告。数据准确性是数据分析师的生命线,数据分层可以从公司层面确定一套唯一的准确口径。
表的类别
表的层次是对源数据到可用数据流程的划分,数据分析师常用的是DW层和DM层数据,当分析不支持时可能会使用少量的ODS层数据。具体到某一层的数据时,就需要对数据表进行再次的划分,方便找到正确的数据。在介绍表的类别前,先来了解下分区的概念。
举个例子来理解数据表的分区,假设一个同学每天都记账,记录自己每一笔花销,记录了两年,现在想去找去年某个月份的某笔消费记录,如果账本是杂乱的堆在一起的,找到这条消费记录会比较麻烦,但是如果是按照日期排序的,查找起来就比较方便了。分区就可以理解为是给数据一个标签,记录是哪个时间点的数据,从而方便数据查询。日期是分区最常用的分区,但是不单日期可以,任何可以用于标识数据并方便后期数据查询的类别字段都可以用做分区。
数据表的类型包括:全量表、增量表、快照表和拉链表。出现这么多类型表的原因是,大数据时代数据需要进行大量的存储,有些表需要通过分区(可以理解为字段,一般是日期)来进行存储,这样可以提高表的查询效率。对于这四类表格,其区别如下:
表的类型 | 定义 | 举例 | 使用场景 |
---|---|---|---|
全量表 | 记录全量数据,不使用分区 | 身份证号前6位与城市对应关系 | 适用于数据几乎不发生改变的场景 |
增量表 | 记录增量数据,使用分区,即将数据记录在各个分区内 | 淘宝的订单表、抖音的用户在线时长 | 数据量大,且数据分析频繁 |
快照表 | 快照表可以理解为带有分区的全量表 | 用户信息表 | 量级相对不大,全量数据价值大于增量数据价值。 |
拉链表 | 记录一个事物从开始到当前的全部状态 | 用户存取款记录表、会员积分表 | 需要对过程的每一步进行准确把握 |
实际工作中遇到查询问题,首先明确想要的增量还是最终的状态。如果是增量,那就去找增量或者拉链表;如果是取状态,那就去找全量表、快照表或拉链表。那什么是增量,什么是状态呢?举个例子,今天的销售量就是增量数据,客户的等级就是状态数据。
表的结构
现在具体到一张表中去介绍有关数据表的概念。大家接触的更多的表是Excel中的表格,根据变量名称是放在行和列可以分成两类,SQL操作的数据表都是变量名称放在首行的数据表。其形式如下:
序号 | 学号 | 姓名 | 成绩 |
---|---|---|---|
1 | 001 | 张三 | 89 |
2 | 002 | 李四 | 74 |
…… | …… | …… | …… |
变量(上表中的序号、学号、姓名和成绩),在SQL里面又被称为为字段、列名等,在该系列教程中,统一使用字段指代。除字段外的每一行,都被称为一条记录,一行记录就代表了一条信息。比方说上面表格的一行记录就表示某位同学的学号是多少,其成绩又是多少。
主键&外键
主键
主键是数据表中用来唯一标识某一条记录的字段。以上表中成绩表为例,序号就是主键,序号1唯一标识了第一条数据记录,以此类推。以此可以得到主键绝不可以重复。
主键不是只能是一个字段,也可以是多个字段。举个例子:
店铺 | 日期 | 销售额 |
---|---|---|
A | 2020/08/01 | 89 |
A | 2020/08/02 | 74 |
B | 2020/08/01 | 53 |
…… | …… | …… |
上表中的主键是店铺和日期,两者联合起来才能确定唯一的一行。单独使用店铺或者日期均不能确定到唯一的一行。所以主键可以是多个字段。
外键
主键是用来唯一标识记录的字段,外键则是用于保证数据完整性和一致性的字段。举个例子来理解外键:
学生表
学号 | 姓名 | 年级 |
---|---|---|
101 | 张三 | 一年级 |
102 | 李四 | 一年级 |
…… | …… | …… |
学生职位表
职位 | 年级 | 学号 |
---|---|---|
班长 | 一年级 | 101 |
数学课代表 | 一年级 | 101 |
…… | …… | …… |
学生职位表的主键时职位和年级,同时学生职位表中的学号不是主键,同时由于学号是学生表的主键,所以可以在学生职位表中设置学号为外键。我们称 学生职位表是主表,学生表是子表。外键保证数据完整性和一致性的例子是,由于在学生职位表中设置了学号为外键,所以在对学生表进行删除操作时就会遇到问题,如果删除学生表中学号为101的学生,由于该名学生在学生职位表中有相应的记录,所以删除时会报错。
在数据分析师的日常工作中,使用的一般都是加工好的数据表,只需要明确表的主键是什么即可,一般不需要关注外键。
SQL工具介绍
为方便大家运行该教程中的案例,给大家推荐一个练习SQL的网页工具。
相应的按钮与解释如上图,关键内容就包含了对于数据表的操作和数据表的查询,其中左侧代码框是新建数据表的操作,右侧代码框是运行查询操作。下面具体解释下网页工具的使用,通过该网页工具主要是实现建立&更新数据表;对建立的数据表进行查询;清空代码内容。
- 建立&更新数据表
建立与更新数据表包括两种路径,一种是使用代码,另一种是上传数据由网页工具自动生成代码。在两种方法操作后,依次点击Build Schema和Browser,则相当于运行了相应代码,可以供右侧查询使用。接下来就演示下具体的使用(代码建立数据表由下章介绍)。
使用已经写好的代码生成数据表,再依次点击build schema和browser后就可以看到有Table2生成,此时右侧就可以进行查询了。
把txt文件中的数据粘贴到框内,选择Append to DLL,则可以把复制的数据上传(网页自动生成代码),再依次点击build schema和browser后就可以看到有Table1生成,右侧就可以进行查询操作了
- 数据查询
数据查询操作比较简单,在右侧输入SQL代码,然后点击Run SQL,在下侧就可以看到数据,以上面输入的数据为例,进行简单的查询(具体查询代码介绍将在下下章介绍)
对输入的数据进行查询,并且可以看到相应的结果。
- 清空
当查询后,点击clear清空即可。注意!!!清空的不单单是SQL查询,还包括相应的数据表。
数据分析入门技术篇