SQL作为数据分析师必备的工具,基本上在招聘要求中都会有明确的要求,因此我尝试梳理一遍SQL在数据分析工作中常用的内容。
本次先总结基础语法,我只梳理总结常用的、核心的内容,抓大放小哈。
1.单表查询
--单表查询的基本格式
select 字段名
from 表名
where 条件
order by 排序字段(desc)
limit 限定条数
单表查询的基本格式如上所示,即表示“”从某表中(from) 按照某条件 (where)查询某字段 (select),并且按照某字段排序(order) ,输出xx条数据(limit)“”
2.单表汇总
--单表汇总的基本格式
select 分组字段,聚合函数
from 表
where 条件
group by 分组字段
having 条件
此处需要注意where条件和having条件的不同:
Where是一个约束声明,使用Where来约束来自数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数;
Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。
举例说明:若目前数据库中有下表A:
date_day | product | sale |
2021-03-01 | 商品1 | 2 |
2021-03-01 | 商品2 | -1 |
2021-03-02 | 商品1 | 2 |
2021-03-02 | 商品2 | 4 |
现需要查询日销量大于5的日期的销量额,则
select date_day,sum(sale) as qty
from A
group by date_day
having sum(sale) >5
则输出结果如下:
date_day | qty |
2021-03-02 | 6 |
若需要查询销售明细不为负的日期销量额,则
select date_day,sum(sale) as qty
from A
where sale>0
group by date_day
则输出结果如下:
date_day | qty |
2021-03-01 | 2 |
2021-03-02 | 6 |
3.两表关联
select 字段名
from 表名1 a
left(full/inner/right) join 表名2 b
on a.id=b.id
where 条件
left join(左联接) :返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) :与left join相反,通常不⽤
inner join(等值连接): 只返回两个表中联结字段相等的⾏
full join(全连接):取左右两表并集
inner join取交集,left join则左表全要。
⼀般而言,inner join⽤于筛选数据(取出部分),left join⽤于补充信息,补不到jiu空着。
4.子查询
select id,code
from tmp
where id in (select id from test)
;
-- with结构创建临时表
with tmp1 as (
select id,code from test
)--创建临时表
select a.*
from tmp1 a
inner join test b
on a.id=b.id and a.code=b.code
所谓子查询,就是将一个查询(子查询)的结果作为另一个查询(主查询)的数据来源或判断条件的查询。
比如在如上的代码中,第一段代码是指以test表的id字段作为约束,从tmp表中查询出的id必须与之相符,最终才能被查询出来;
第二种通过with建立临时表,然后再通过临时表与tmp做连接,这是我个人比较推荐和喜欢用的方法,这种方法的好处在于更加直观且之前建立的临时表在后面的代码中可以重复使用。