一、用SQL拼接数据
三个初始数据
问题1:在所有的数据里,销售额最高的产品品类名是什么?
问题2:是否有什么产品是在所观测的时间里没有被购买过的?
拼接数据:JOIN
join,加入
作用:连接多张表,根据两张表中的关联字段,将两张表拼在一起
写法:表1 JOIN 表2 ON 表1.连接字段=表2.连接字
在所有的数据里,销售额最高的产品品类名是什么?
Sku:两张表基于sku连接,拼接到一起
代码解读
SELECT cat_name,SUM(rev) sum_rev
FROM orders a
INNER JOIN product b
ON a.sku=b.sku
GROUP BY cat_name
ORDER BY sum_rev DESC;
INNER JOIN
保留左右表格交集的部分
LEFT JOIN
保留JOIN左边的表格全部的内容
RIGHT JOIN
保留JOIN右边的表格全部的内容
哪些产品整个这段时间里都是没有人购买的?
代码解读
SELECT a.sku_name,sum(rev)
FROM product a
LEFT JOIN orders b
ON a.sku=b.sku
GROUP BY cat_name
ORDER BY sum_rev DESC;
二、用SQL聚合数据
用户从注册到购买之间花费了多长时间?
代码解读
CREATE TABLE user_first_order
AS
SELECT user_id, MIN(order_dt) first_order
FROM orders
GROUP BY user_id;
SELECT a.user_id, b.first_order, a.reg_dt, datediff(b.first_order,a.reg_dt)
as reg_to_buy
FROM users a
INNER JOIN user_first_order b
ON a.user_id=b.user_id
ORDER BY reg_to_buy;
不同周期完成首单的用户、 不同装修计划和特征的用户在首次购买上是不是会表现出不同的行为?
代码解读
CREATE TABLE user_reg_to_order as
SELECT
a.user_id,b.first_order,a.reg_dt, datediff(b.first_order,a.reg_dt)
as reg_to_buy
FROM users a
INNER JOIN user_first_order b
ON a.user_id=b.user_id
ORDER BY reg_to_buy;
SELECT
case when reg_to_buy <=30 then '30天内'
when reg_to_buy <=90 then '90天内'
when reg_to_buy <=180 then '180天内'
when reg_to_buy <=365 then '1年内'
else '超过1年' end as reg_to_buy_group,COUNT(user_id)
from user_reg_to_order
group by reg_to_buy_group;
代码解读
SELECT c.plan_new,count(Distinct a.user_id) total_buyers, sum(units) as total_units,sum(rev) as total_rev
FROM
orders a INNER JOIN user_reg_to_order b
ON a.user_id=b.user_id and a.order_dt=b.first_order
INNER JOIN users_new c
ON a.user_id=c.user_id
WHERE b.reg_to_buy<=90
GROUP BY c.plan_new;
三、课后小结
四、随堂练习
正确答案: 错误
解析:两端代码的连接条件是相同的,a LEFT JOIN b和bRIGHT JOIN a可以达成同样的效果
正确答案: 正确
解析:
在SQL中,INNER JOIN也可以被简写为JOIN
正确答案:错误
解析:取的是a的全部记录b中能匹配上的部分记录,b匹配不上的部分会给null
正确答案:正确
解析:
在SQL中,多表连接可以通过JOIN实现
正确答案: 错误
解析:
INNER JOIN取的是交集的部分