在开始之前,一些小白可能对于SQL和MySQL、SQLserver、Access,以及数据库管理工具的区别都还不清楚,用一句话解释:
SQL是一种标准的计算机语言,我们用SQL语句和数据库进行交互;
MySQL、SQLserver、Access则是不同的数据库,也就是我们的交互对象;
DataGrip、MySQL workbench这些则是数据库管理工具,是SQL语言和数据库的中介,我们在管理工具中编写SQL语言,同连接的数据库进行交互。
本次用到的数据库是MySQL 8.0
管理工具为 DataGrip 2022.1
对于产品或数分的一些同学,我们不需要和数仓的家伙们一样精通SQL,只需要达到「能把自己想要的数据拿到手」的技能水平即可。因此,本文只对平常用到最多的「取数」部分进行练习。
首先,我们要明确「取数」环节的语法结构。
select from
select「字段名」from「表名」;
从「表」中提取「字段」
select* from「表名」;
提取该表中的所有字段。
借着上面的语法,我们先看一下今天用来练习的全表长什么样子
select * from cpc;
(下图仅展示部分)
select「字段名」as「别名」from「表名」;
从表中提取字段,且重命名为as 后面的「别名」
2. where(筛选功能,和运算符搭配使用)
select* from cpcwhere日期 >=20191216;
返回「cpc」表中「日期」字段>=2019-12-16的部分
select平台i,日期 fromcpcwhere平台i in(’美团’,’饿了么’);
返回「cpc」表中的「平台i」,「日期」字段,并筛选出「平台i」包括「美团」或「饿了么」的部分
补充:模糊查询 like
3.group by(分组功能,一般同聚合函数搭配使用)
select 日期,count(平台i) from cpcgroup by 日期;
根据日期分组,并返回每个日期当天的平台计数
4.having (和where筛选一样,不过是where是在group by 分组前筛选,having是在之后的表再对聚合字段筛选)
5.order by(排序功能)
select 日期,count(平台i) from cpcgroup by 日期order by count(平台i);
根据日期分组,并返回每个日期当天的平台计数,随后按照计数列排序
6.子查询(查询语句中嵌套查询语句)
select 日期,cpc总费用 from cpc where cpc总费用=
(select max(cpc总费用) from cpc);
返回最高的cpc总费用(先用子查询查出来)以及当天的日期
7.case when 函数(创建新字段,对满足条件的行返回指定值)
case when 条件1 then 执行1 when 条件2 then 执行2 。。。end
select 日期,case when cpc总费用>=(select avg(cpc总费用) from cpc) then ‘高于平均’when cpc总费用<(select avg(cpc总费用) from cpc) then ‘低于平均’ end as 区间from cpc;
创建新字段并名为「区间」,该字段中,cpc总费用高于平均值的返回 “高于平均”反之“低于平均”
8.窗口函数(创建新字段,功能类似于group by 聚合函数,但是group by
会只返回分组后的表,窗口函数不改变原数据表)
「窗口函数」()over(partition by 「用于分组的字段名」order by 「用于排序的字段名」
select 日期,平台i,round(sum(cpc总费用),2) 平台cpc总和,
rank() over (order by sum(cpc总费用) desc) 排名
from cpc where 平台i = ‘美团’group by 日期;
返回平台是美团、根据日期分组后每个日期的cpc总和,并按照cpc总和进行排名。