MySQL之旅——启程

前言

我是Sam,一个正在转行成为数据分析师的骚年,目前刚刚从南洋理工大学毕业,正在为秋招做准备。转行原因一是因为真的很感兴趣,二是因为此方向前途明朗。注册这个账号可以帮助我记录一下我转行之路上的一些经历,包括一些学习总结、心理活动和困扰、对自己的激励等。同时也希望可以在这里遇到各种转型中和已经成为data大佬的各行各路朋友,一起学习探讨。

那么接下来,我想先对自己说一句话:既然选择了这条路,就要坚定地走下去。道路坎坷,坚持下来,等到成为数据分析师的那一天,你一定会感谢,现在的自己!加油!奥利给!


学习计划分为几部分,依次为:

1.工具使用:MySQL、python、PowerBI

2.数据分析方法总结

3.项目实践

那么这周的目标就是搞定MySQL,开始,冲冲冲!

MySQL学习

之前接触过SQL,但是仅会一些基础查询语句,因此这周开始系统学习MySQL,以下是一些自己认为比较难记忆的点,汇总一下。

难点查缺补漏

SQL  table相关语句

SQL创建table的约束

int unsigned-无符号整型

auto_increment-自动增长

default-以默认值填充

not null-不为空

primary key-主键

创建数据表:

create table xxx (字段 类型 约束,

字段 类型 约束,

);

修改表列名

alter table students modify pet varchar(20) default 'cat';

插入数据

insert into 表名 values();

insert into students values(1,'list',18,178,'男',8);

insert into students values(1,'老李',17,168,'男',4),((1,'老刘',18,179,'男',3));

显示目前年份 date_format(now(),'%Y')

limit start,count; 从start后面一个数开始取,如limit 0 就是从第一个数开始取

select x from x where (a,b)=(1,2) a对应1,b对应2

时间函数

获取当前时间:

now 函数:获取当前时间信息,执行语句初就获取时间

sysdate 函数:执行到此函数再获取。

如:select now(), sleep(3),now();select sysdate(), sleep(3) , sysdate();有区别

获取年月日:current_date()

获取时分秒:current_time()

提取时间信息:month()、year()、day()等

时间计算

两个日期时间差:timestampdiff(unit, begin, end)

日期往前推:date_sub(被推移时间, interval '推移多久' 推移方式),如select date_add('2008-08-08 10:12:33', interval '01:10:30' hour_second);注意次函数必须要对 xxxx-xx-xx年月日完整的被推移时间使用,若不完整应用date_format进行标准化

日期往后推:date_add(被推移时间, interval '推移多久' 推移方式)

时间格式的转换:

字符串转换为时间:str_to_date(表示时间的字符串,字符串日期格式),  如 select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); 结果:2008-08-09 08:09:30

日期格式转换为特殊字符串:date_format (日期,字符串格式),如:select date_format('2020-02-03 13:45:06.676','%Y-%M-%D %I:%i:%S-%T') ; --2020-February-3rd 01:45:06-13:45:06

如何计算复购率和回购率

涉及表:

  orderinfo  订单详情表

    | orderid  订单id

    | userid    用户id

    | isPaid    是否支付

    | price    付款价格

    | paidTime  付款时间

  userinfo  用户信息表

    | userid    用户id

    | sex        用户性别

    | birth      用户出生日期

统计用户三月份的回购率和复购率

复购率

a、筛选三月份下单的用户

select userid

from orderinfo

where month(paidtime)='03';

c、找到三月用户下载次数

  select userid

from orderinfo

where month(paidtime)='03'

group by userid;

d、对于复购用户数和总购买用户数进行加和,并计算复购用户数/总购买人数

错误写法,

select count(1) as paid_cons, sum(if(cons>1,1,0)) as fugou_cons,

fugou_cons/paid_cons as fugou_rate (注意不能在select后用as来进行运算,要写原值)

from(select

userid,count(userid) as cons

from orderinfo

where month(paidtime)='03'

group by userid) as a;(子表后需要加名称)

正确:select count(1) as paid_cons, sum(if(cons>1,1,0)) as fugou_cons,

sum(if(cons>1,1,0))/count(1) as fugou_rate

from(select

userid,count(userid) as cons

from orderinfo

where month(paidtime)='03'

group by userid) as a;

回购率:3月购买的人中4月又购买的人数/3月购买的人的总数

a、找到每个月份的购买情况

select userid,

date_format(paidtime,'%Y-%m-01') as paid_m

from orderinfo

where ispaid='已支付' 

group by userid, date_format(paidtime,'%Y-%m-01')

--注意 若date_format(paidtime,'%Y-%m-01')写成 date_format(paidtime,'%Y-%m'),在后面使用date_sub函数时将出错,使用date_sub函数必须要让年月日完整。

b、找到这个月购买了下个月也购买了的人,通过join相邻两列的paidtime

select *

from

(select userid,

date_format(paidtime,'%Y-%m-01') as paid_m

from orderinfo

where ispaid='已支付' 

group by userid, date_format(paidtime,'%Y-%m-01')) a

left join

(select userid,

date_format(paidtime,'%Y-%m-01') as paid_m

from orderinfo

where ispaid='已支付' 

group by userid, date_format(paidtime,'%Y-%m-01')) b

on a.userid=b.userid

and date_add(a.paid_m, interval 1 month)=b.paid_m

c、计算3月购买的人中4月又购买的人数count(b.paid_m)/3月购买的人的总数 count(a.paid_m)

select count(a.paid_m) as '本月购买人数', count(b.paid_m) as '本月与下月都购买人数', count(b.paid_m)/ count(a.paid_m) as '复购率'

from

(select userid,

date_format(paidtime,'%Y-%m-01') as paid_m

from orderinfo

where ispaid='已支付' 

group by userid, date_format(paidtime,'%Y-%m-01')) a

left join

(select userid,

date_format(paidtime,'%Y-%m-01') as paid_m

from orderinfo

where ispaid='已支付' 

group by userid, date_format(paidtime,'%Y-%m-01')) b

on a.userid=b.userid

and date_add(a.paid_m, interval 1 month)=b.paid_m

group by a.paid_m


总结

目前正在MySQL打怪的路上,已经从单个语句过渡到做完整题目,期间发现MySQL单个语句都不难,难就难在如何把不同的语句交叉使用完成1+1>2的效果,比如计算复购率的时候,用到了sum函数,使整个计算简便了很多。

很多题都琢磨了好久都没琢磨出来,最后还是看了答案才懂,中间踩了不少坑,但学习之路本该如此,现在多踩坑,未来路就平,少年仍需努力,未来可期~加油!

你可能感兴趣的:(MySQL之旅——启程)