MySQL实战项目

 

本文主要通过MySQL对数据库进行特定场景查询,

例如对用户留存,商品回购率和复购率的探索。

 

场景一:在一份销售表中,我们需要提取上一个月付款用户量最高的三天是哪三天?并查询昨天每个用户最后的付款订单ID和金额。

SELECT DATA_FORMAT(pay_time,'%Y-%m-%d') AS pay_date,
       COUNT(DISTINCT user_id) AS user_count
FROM Orders
WHERE order_amount>0
AND MONTH(pay_date)=MONTH(NOW())-1
GROUP BY pay_date
ORDER BY user_count DESC
LIMIT 3;

在这份销售数据中,我们主要需要的是order_id(订单ID),user_id(客户ID),pay_time(交易时间),order_amount(交易金额)。由于一天中可能有客户多次购买,所以需要对客户进行去重处理,另外对月份进行定位(上一个月),和过滤付款用户。然后进行排序直接锁定付款用户量最高的三天。

SELECT user_id,order_id,order_amount
FROM Orders
WHERE DATE_FORMAT(pay_time,'%Y-%m-%d')=DATE_SUB(CURDATE(),interval 1 day)
AND DATE_FORMAT(pay_time,'%Y-%m-%d')=MAX(DATE_FORMAT(pay_time,'%Y-%m-%d'))
GROUP BY user_id;

昨天每个用户最后的付款订单ID和金额,过滤交易时间(昨天),按user_id 进行分组,并选取交易时间最后的订单信息。

 

场景二:根据某网站的访问记录,我们得到两个各40亿条数据表格,即表A和表B,主要包含用户ID(user_id)和商品ID( goods_id)这两项,在防止数据倾斜的条件下,找出表A和表B共同的用户及其对应的商品ID

SELECT * 
FROM A INNER JOIN B
ON A.user_id IS NOT NULL 
AND A.user_id=B.user_id
UNION ALL
SELECT *
FROM A
WHERE A.user_id IS NULL;

这里主要解决空值导致的数据倾斜,现将非空值数据通过INNER JOIN联结,在合并空值,得到两个表共同的用户和商品。

 

场景三:对于一份用户登录日志表,查找出近一个月内,平均每天登录用户的数量

SELECT AVG(t1.user_num) 
FROM 
(SELECT DATE_FORMAT(log_time,'%Y-%m-%d') log_date,COUNT(DISTINCT user_id) user_num
FROM t 
WHERE t.log_date>=DATE_SUB(CURDATE(),INTERVAL 30 day)
AND t.log_date<CURDATE()
GROUP BY log_date)t1

这里需要的数据是用户ID(user_id),和时间日志(log_time)。按天将用户去重,并通过DATE_SUB和CURDATE函数将时间定为在1个月内,将得到的每天登录用户数量计算平均值。

 

场景四:对于一个网站来说,每天会通过不同渠道进来新的用户也会流失一部分用户,而那些留下来的用户就显得尤其珍贵,这部分用户也叫留存用户,这就是网站运营的重要指标之一。针对一份访问表(person_visit),统计出最近七天访问的新用户以及每个渠道的新用户中3日7日留存量

SELECT user_id
FROM person_visit
GROUP BY user_id
HAVING MIN(DATE_FORMAT(visit_date,'%Y-%m_%d')) < CURDATE()
AND MIN(DATE_FORMAT(visit_date,'%Y-%m_%d'))>= DATE_SUB(CURDATE(),INTERVAL 7 DAY);

统计出最近七天访问的新用户,需要的数据有用户浏览时间(visit_date),和用户ID(user_id)。通过用户进行分组,并过滤掉7天之前就访问过网站的用户。

SELECT plat,COUNT(DISTINCT user_id) '3日用户留存数量' FROM person_visit 
WHERE user_id IN
(SELECT user_id FROM person_visit 
GROUP BY user_id 
HAVING MIN(DATE_FORMAT(visit_date,'%y-%m-%d'))=DATA_SUB(CURDATE(),INTERVAL 7 DAY))
AND user_id IN
(SELECT user_id FROM person_visit 
WHERE DATE_FORMAT(visit_date,'%y-%m-%d')=DATA_SUB(CURDATE(),INTERVAL 5 DAY));

每个渠道的新用户中3日留存量,选取那些7天前新注册用户,且在第三日有访问网站的用户,按平台分组计算用户数量。当然在计算每个渠道的7天前新用户数量,就可以算出3日留存率了。

SELECT plat,COUNT(DISTINCT user_id) '7日用户留存数量' FROM person_visit 
WHERE user_id IN
(SELECT user_id FROM person_visit 
GROUP BY user_id 
HAVING MIN(DATE_FORMAT(visit_date,'%y-%m-%d'))=DATA_SUB(CURDATE(),INTERVAL 7 DAY))
AND user_id IN
(SELECT user_id FROM person_visit 
WHERE DATE_FORMAT(visit_date,'%y-%m-%d')=DATA_SUB(CURDATE(),INTERVAL 1 DAY));

和3日留存量类似,计算新用户在第7天有访问网站的数量。

 

场景五:对于商家而言,复购率回购率是两项重要的指标,前者主要反映客户对商品的需求程度,后者反映客户对商品的忠诚度。通过某商品网站的交易数据提取其复购率和回购率。

SELECT OrderMonth,COUNT(c),COUNT(IF(c>1,1,NULL),COUNT(IF(c>1,1,NULL)/COUNT(c)
FROM (
SELECT DATE_FORMAT(paidtime,'%Y-%m-01')) OrderMonth,user_id,COUNT(user_id) c
FROM OrderInfo
WHERE idpaid='已支付'
GROUP BY OrderMonth,user_id
)
GROUP BY OrderMonth;

这里主要针对有效订单(‘ispaid’)的用户购买次数来统计,利用COUNT和IF函数过滤购买次数在2及以上的客户数量,从而计算复购率。

对于一个月之后的回购率,这里通过内联结将本月有购买下个月又有再购买的用户进行统计,算出回购用户数量。

SELECT A.t1,COUNT(A.t1)
FROM (SELECT user_id,DATE_FORMAT(paidtime,'%Y-%m-01') t1
FROM OrderInfo
WHERE idpaid='已支付'
GROUP BY user_id) A,(SELECT user_id,DATE_FORMAT(paidtime,'%Y-%m-01') t2
FROM OrderInfo
WHERE idpaid='已支付'
GROUP BY user_id) B
WHERE A.user_id=B.user_id
AND A.t1=DATE_SUB(B.t2,INTERVAL 1 MONTH)
GROUP BY A.t1;

 

 

  • 11
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
限时福利1:购课进答疑群专享柳峰(刘运强)老师答疑服务 为什么需要掌握高性能的MySQL实战? 由于互联网产品用户量大、高并发请求场景多,因此对MySQL的性能、可用性、扩展性都提出了很高的要求。使用MySQL解决大量数据以及高并发请求已经是程序员的必备技能,也是衡量一个程序员能力和薪资的标准之一。 为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了「高性能 MySQL 知识框架图」,帮你梳理学习重点,建议收藏! 【课程设计】 课程分为四大篇章,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库的性能调优、高并发、海量业务处理、面试解析等。 一、性能优化篇: 主要包括经典 MySQL 问题剖析、索引底层原理和事务与锁机制。通过深入理解 MySQL 的索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 走索引、有些不走索引,从而彻底掌握索引的使用和优化技巧,能够避开很多实战中遇到的“坑”。 二、MySQL 8.0新特性篇: 主要包括窗口函数和通用表表达式。企业中的许多报表统计需求,如果不采用窗口函数,用普通的 SQL 语句是很难实现的。 三、高性能架构篇: 主要包括主从复制和读写分离。在企业的生产环境中,很少采用单台MySQL节点的情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构的实现是非常有必要的。 四、面试篇: 程序员获得工作的第一步,就是高效的准备面试,面试篇主要从知识点回顾总结的角度出发,结合程序员面试高频MySQL问题精讲精练,帮助程序员吊打面试官,获得心仪的工作机会。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值