商分SQL小菜一碟

本文最后更新于:2021年7月4日 晚上

# 商分SQL小菜一碟

SQL增改查

(1)在登录信息表中插入以下数据:

img

INSERT INTO login(loginId, password) VALUES 
(40000,123456),(40001,123456),(40002,123456),(40003,123456),(40004,123456),(40005,123456),(40006,123456),(40007,123456),(40008,123456),(40009,123456);

(2) 修改以下用户的密码,密码值和 loginId 的值相同:

img

UPDATE login SET password=loginid 
WHERE (loginid>19999 AND loginid<20010);
-- 或者:UPDATE login SET password=loginId WHERE loginId LIKE'2000%';

(3) 查询操作后,登录信息表中的数据量(记录条数)。

SELECT count(*) FROM login;

(4) 查看用户基本信息表中,用户名、年龄、所在地、学校信息。

SELECT name,age,location,school FROM userbaseinfo;

(5) 统计用户基本信息表中,用户名含’服装’,‘穿搭’,‘汽车’,‘手机’,‘电影’,'音乐’关键字的用户数量及其比例并汇总。

SELECT name AS "类别",
COUNT(*) AS "用户数量",
COUNT(*)/(SELECT COUNT(*) FROM userbaseinfo) AS "比例"
FROM userbaseinfo WHERE name LIKE'%服装%' GROUP BY name;
-- 以此类推,其中 COUNT(*)/(SELECT COUNT(*)from userbaseinfo) 可以先运行一次计算总数再计算比例,可改成 COUNT(*)/20000
-- 即:SELECT name AS "类别",COUNT(*) AS "用户数量",COUNT(*)/20000 AS "比例" FROM userbaseinfo WHERE name LIKE'%服装%' GROUP BY name;
-- 或者:SELECT count(*),count(*)/20000 FROM userbaseinfo WHERE name LIKE'%服装%';

(6) 在用户基本信息表中,把用户名含’服装’,‘穿搭’,‘汽车’,‘手机’,‘电影’,'音乐’关键字的用户的用户名改为只含关键字。

UPDATE userbaseinfo
SET name='服装'
WHERE name LIKE'%服装%';
UPDATE userbaseinfo
SET name='穿搭'
WHERE name LIKE'%穿搭%';
UPDATE userbaseinfo
SET name='汽车'
WHERE name LIKE'%汽车%';
UPDATE userbaseinfo
SET name='手机'
WHERE name LIKE'%手机%';
UPDATE userbaseinfo
SET name='电影'
WHERE name LIKE'%电影%';
UPDATE userbaseinfo
SET name='音乐'
WHERE name LIKE'%音乐%';

(7) 统计用户基本信息表中,用户的性别数量及其比例并汇总。

SELECT sex AS "性别",
COUNT(*) AS "数量",
COUNT(*)/(SELECT COUNT(*) FROM userbaseinfo) AS "比例" 
FROM userbaseinfo GROUP BY sex;

(8) 统计用户基本信息表中,用户各年龄的数量及其比例并汇总。

SELECT age AS "年龄",
COUNT(*) AS "数量",
COUNT(*)/(SELECT COUNT(*) FROM userbaseinfo) AS "比例"
FROM userbaseinfo GROUP BY age;

(9) 统计用户基本信息表中,用户各年龄段{[0,20),[20,25),[25,30),[30,40),[40,50),[50,100)}的数量及其比例并汇总。

SELECT count(*) AS "[0,20)数量",
count(*)/(SELECT COUNT(*) FROM userbaseinfo) AS "比例"
FROM userbaseinfo WHERE age>=0 and age<20;
-- 以此类推,或着
SELECT count(*) AS "[20,25)数量",
count(*)/20000 AS "比例"
FROM userbaseinfo WHERE age>=20 and age<25;

SELECT count(*),count(*)/20000 FROM userbaseinfo WHERE age>=25 and age<30;
SELECT count(*),count(*)/20000 FROM userbaseinfo WHERE age>=30 and age<40;
SELECT count(*),count(*)/20000 FROM userbaseinfo WHERE age>=40 and age<50;
SELECT count(*),count(*)/20000 FROM userbaseinfo WHERE age>=50 and age<100;

(10) 统计用户基本信息表中,各所在地的用户总数量及其比例并汇总。

SELECT location AS "用户所在地",
count(*) AS "用户总数",
count(*)/(SELECT COUNT(*) FROM userbaseinfo) AS "比例" 
FROM userbaseinfo GROUP BY location;

(11) 在用户基本信息表中,所在地值为 0 的所有数据,修改为北京。

UPDATE userbaseinfo
SET location='北京'
WHERE location=0

(12) 统计用户基本信息表中,所在地值为 1 并且性别取值为 0 的数据量。

SELECT count(*) FROM userbaseinfo WHERE location=1 and sex=0

(13) 统计用户基本信息表中,各学校的用户总数量及其比例。

SELECT school,count(*),count(*)/20000 FROM userbaseinfo GROUP BY school;

(14) 删除用户基本信息表中的简介属性。

Alter TABLE userbaseinfo DROP intro;

(15) 添加用户基本信息表中的简介属性,并将所有记录简介属性的值设置为”简介”。

ALTER TABLE userbaseinfo ADD intro VARCHAR(500);
UPDATE userbaseinfo
SET intro='简介';

(16) 在用户基本信息表中,用户名含有’服装’关键字的所有用户的名字改为’服装类 up 主’。

UPDATE userbaseinfo
SET name='服装类up主'
WHERE name LIKE'%服装%';

(17) 在用户获赞关注粉丝统计信息表中,统计获赞数超过 500000 并且粉丝数超过 10000 的用户数量。

SELECT count(*) FROM userstatistics WHERE love>500000 and fans>10000;

(18) 在用户喜欢的作品表中,查询 userId 值为 20000 的用户喜欢的作品(workId)。

SELECT workid FROM userlikeworks WHERE userId='20000';

(19) 查询 userId 值为 20000 的用户喜欢的作品的发布用户(userId)。

SELECT userId 
FROM userworks 
WHERE workId IN(SELECT workId 
		FROM userlikeworks 
		WHERE userId='20000');

(20) 查询 userId 值为 20000 的用户喜欢的作品的发布用户的用户类型(用户名name视为用户类型)。

SELECT name 
FROM userbaseinfo 
WHERE userId IN
		(SELECT userId 
		FROM userworks 
		WHERE workId IN(SELECT workId 
				FROM userlikeworks 
				WHERE userId='20000'));

(21) 查询 userId 值为 15000 的用户发布的作品(workId)。

SELECT workId FROM userworks WHERE userId='15000';

(22) 查询 userId 值为 15000 的用户发布的作品的信息。

SELECT * FROM works WHERE workId IN(SELECT workId FROM userworks WHERE userId='15000');

(23) 在作品信息表中,统计时长分别在 0min-5min,5min-10min,10min-15min,15min-20min 区间的作品数量及比例。

SELECT COUNT(*),COUNT(*)/100000 FROM works WHERE totalDuration>'00:00:00' AND totalDuration<'00:05:00';

SELECT COUNT(*),COUNT(*)/100000 FROM works WHERE totalDuration>'00:05:00' AND totalDuration<='00:10:00';

SELECT COUNT(*),COUNT(*)/100000 FROM works WHERE totalDuration>'00:10:00' AND totalDuration<='00:15:00';

SELECT COUNT(*),COUNT(*)/100000 FROM works WHERE totalDuration>'00:15:00' AND totalDuration<='00:20:00';

(24) 用户名含有(‘服装’,‘穿搭’,‘汽车’,‘手机’,‘电影’,‘音乐’)关键字的关键字视为作品类型,统计时长在 10min-15min 的各作品类型的比例。

SELECT name,count(*)/100000 FROM userbaseinfo WHERE userId IN(
SELECT userId FROM userworks WHERE workId IN(
SELECT workId FROM works WHERE totalDuration>'00:10:00' AND totalDuration<='00:15:00')) GROUP BY name;

(25) 查询 userId 值为 12345 的用户的粉丝数量及粉丝类型(用户名视为类型名)。

SELECT name,COUNT(*) FROM userbaseinfo WHERE userId IN(SELECT userId2 FROM userfans WHERE userId1='12345') GROUP BY name;

字段设计

根据抖音服装带货类用户的作品,基于流量指标,转化率指标,搭建数据库。

数据库包含以下基本表:

表名 字段 含义
Login (loginId,password) 登录用户信息表
UserBaseInfo (userId,name,intro,age,sex,birthday,location,school) 用户基本信息表
LoginIdUserId (loginId,userId) 登录信息与用户信息关联基本表
Works (workId,description,category,love,commentNum,shareNum,viewtime,totalDuration) 作品信息表
UserActionInfo (userId,workId,viewDate) 用户浏览行为信息表
ProcessEfficiency (userId,loginDate,exitDate) 流程效率表
flowStatistics (workId,viewNum,visitorNum,revisitorNum,onlineVisitorNum,dayFlow) 流量指标统计表
conversionStatistics (workId,collectRate,attentionRate,buyRate) 转化率指标统计表
workStatistics (workId,downloadRate,activateUserNum,ADtransfromRate) 作品数据指标统计表
-- 创建数据库
CREATE DATABASE newTiktok;
USE newTiktok;

-- 创建登录信息表
CREATE TABLE Login
(
loginId VARCHAR(20) PRIMARY KEY, 
password VARCHAR(20)
);

-- 创建用户基本信息表
CREATE TABLE UserBaseInfo
(
usertId VARCHAR(20) PRIMARY KEY,
name VARCHAR(20)  NOT NULL,
intro VARCHAR(500), 
age int, 
birthday DATE, 
location VARCHAR(20), 
school VARCHAR(20)
)

-- 创建登录信息与用户基本信息关联表
CREATE TABLE LoginIdUserId
(
loginId VARCHAR(20), 
usertId VARCHAR(20),
foreign key(loginId) references Login(loginId),
foreign key(usertId) references UserBaseInfo(usertId)
);

-- 创建作品信息表
CREATE TABLE Works
(
workId VARCHAR(20) PRIMARY KEY,
description VARCHAR(500),
category VARCHAR(5),
love int, 
commentNum int, 
shareNum int, 
viewtime TIMESTAMP, 
totalDuration time
)

-- 创建用户浏览行为信息表
CREATE TABLE useractioninfo
(
userId VARCHAR(20),
workid VARCHAR(20),
viewtotalDuration time,
viewDate datetime,
foreign key(userId) references UserBaseInfo(usertId),
foreign key(workId) references works(workId)
)

-- 创建流程效率表
CREATE TABLE ProcessEfficiency
(
userId VARCHAR(20),
loginDate datetime,
exitDate datetime,
foreign key(userId) references UserBaseInfo(usertId)
)

-- 创建流程指标统计表
CREATE TABLE flowStatistics
(
workId VARCHAR(20),
viewNum int,
visitorNum int,
revisitorNum int,
onlineVisitorNum int,
dayFlow int,
foreign key(workId) references works(workId)
)


-- 创建转化率指标统计表
CREATE TABLE conversionStatistics
(
workId VARCHAR(20),
collectRate FLOAT(4),
attentionRate FLOAT(4),
buyRate FLOAT(4),
foreign key(workId) references works(workId)
)

-- 创建作品指标统计表
CREATE TABLE workStatistics
(
workId VARCHAR(20),
downloadRate FLOAT(4),
activeUserNum int,
ADtransfromRate FLOAT(4),
foreign key(workId) references works(workId)
)

数据清洗

1.完成为数据添加字段‘user_id’,‘item_id’, ‘category_id’,‘behavior’,‘timestamps’,并清洗数据
2.转换时间数据类型,并添加datentime,dates,hours三个字段,将转换好的数据放进去
3.检查日期是否在规定范围内:2017年11月25日至2017年12月3日,检查时间是否正确,并将不符合规定的数据删除

-- 新增字段
ALTER TABLE UserBehavior ADD COLUMN datentime TIMESTAMP(0) NULL;
UPDATE UserBehavior
SET datentime = FROM_UNIXTIME(timestamps);

ALTER TABLE UserBehavior ADD COLUMN dates CHAR(10) NULL;
UPDATE UserBehavior
SET dates = SUBSTRING(datentime FROM 1 FOR 10);

ALTER TABLE UserBehavior ADD COLUMN hours CHAR(10) NULL;
UPDATE UserBehavior
SET hours = SUBSTRING(datentime FROM 12 FOR 2);
-- 检查范围
SELECT MAX(timestamps),
       MIN(timestamps),
       MAX(datentime),
       MIN(datentime)
FROM UserBehavior;
-- 删数据
DELETE FROM UserBehavior
WHERE datentime < '2017-11-25 00:00:00'
OR datentime > '2017-12-04 00:00:00';

方法二:

-- 扩大缓存,否则可能用不了
SET GLOBAL  tmp_table_size =1024*1024*1024;
SET GLOBAL innodb_buffer_pool_size=3*1024*1024*1024;
-- 添加字段
ALTER TABLE UserBehavior ADD COLUMN datentime datetime;
ALTER TABLE UserBehavior ADD COLUMN dates date;
ALTER TABLE UserBehavior ADD COLUMN hours int;
-- 更新数据
UPDATE UserBehavior SET datentime = FROM_UNIXTIME(timestamps);
UPDATE UserBehavior SET dates = FROM_UNIXTIME(timestamps,'%Y-%m-%d');
UPDATE UserBehavior SET hours = FROM_UNIXTIME(timestamps,'%H');
#剔除不符合数据
DELETE FROM userbehavior WHERE dates<'2017-11-25' or dates>'2017-12-03';