三个初始数据
问题1:在所有的数据里,销售额最高的产品品类名是什么?
问题2:是否有什么产品是在所观测的时间里没有被购买过的?
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;
保留左右表格交集的部分
保留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;
代码解读
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取的是交集的部分