SQL在数据分析中的应用案例(一)
MySQL应用:
数据查询与过滤,数据聚合,数据表间的连接,数据的增、改、删,SQL进阶用法
温馨提示:
案例:【电商数据库表结构及字段定义】
1、 数据查询与过滤
CONCAT
从顾客信息(customer_info)表中选取顾客号码(customer_id),姓名(last_name,first_name)和电话(phone_number)(注意选取列的顺序)
提示:使用CONCAT函数合并`last_name`(姓),`first_name`(名)字段, 为新产生的字段命名为`name`(姓名)
SELECTcustomer_id,CONCAT(last_name, first_name) AS 'name',phone_number
FROMcustomer_info;
WHERE+AND或BETWEEN AND
选取价格在20到30之间(包含20,30)的产品,列出产品号码(product_id),产品名称(product_name),产品单价(price)(注意选取列的顺序)
SELECTproduct_id,product_name,price
FROMproduct_info
WHEREprice >= '20'
AND price <= '30';等价于:SELECTproduct_id,product_name,price
FROMproduct_info
WHEREprice BETWEEN 20
AND 30;
IN
选取来自河北省及山西省所有顾客的顾客号码(customer_id)、姓名(last_name first_name)、省份(province)(注意选取列的顺序);
提示:你可以使用CONCAT函数合并`last_name`,`first_name`字段,为新生成的字段命名为`name`。
SELECTcustomer_id,CONCAT(last_name, first_name) AS 'name',province
FROMcustomer_info
WHEREprovince IN ('河北省', '山西省');或SELECTcustomer_id,CONCAT(last_name, first_name) AS 'name',province
FROMcustomer_info
WHEREprovince = '河北省'
OR province = '山西省';
!=
选取所有不在珠海市和绍兴市的供应商,列出所有供应商信息(注意选取列的顺序)
SELECT*
FROMsupplier_info
WHEREcity != '珠海市'
AND city != '绍兴市';或SELECT*
FROMsupplier_info
WHEREcity NOT IN ('珠海市', '绍兴市');
ORDER BY/LIMIT
选取价格最高的前5件产品, 列出产品号码(product_id),产品名称(product_name)以及产品单价(price)(注意选取列的顺序)
SELECTproduct_id,product_name,price
FROMproduct_info
ORDER BYprice DESC
LIMIT 5;
选取价格在第三到第八之间(包含第三和第八)的产品
SELECTproduct_id,product_name,price
FROMproduct_info
ORDER BYprice DESC
LIMIT 2,6;
DISTINCT
从顾客信息表(customer_info)中选取不重复的城市(city)以及省份(province)作为顾客来源地区。
SELECT DISTINCTcity,province
FROMcustomer_info;
2、数据聚合
SUM
使用订单信息列表(order_info)中数据,计算2017年总营业额(total_revenue),添加备注信息字段,填入‘2017总营收’字符串作为备注信息(other_info)
SELECT'2017总营收' AS other_info,SUM(payment_amount) AS total_revenue
FROMorder_info
WHEREDATE_FORMAT(create_time, '%Y') = '2017';或SELECT'2017总营收' AS other_info,SUM(payment_amount) AS total_revenue
FROMorder_info
WHEREcreate_time BETWEEN '2017-01-01'
AND '2017-12-31';
COUNT
在2017年间,计算总共完成了多少个订单,创建`订单数目(order_count)`字段,计算总共有多少位顾客完成过订单,创建`顾客数目(customer_count)`字段
提示:同一位顾客一年内可以消费多次;(注意选取列的顺序)
SELECTCOUNT(*) AS 'order_count',COUNT(DISTINCT customer_id) AS 'customer_count'
FROMorder_info
WHEREDATE_FORMAT(create_time, '%Y') = '2017';或WHERE create_time BETWEEN '2017-01-01' AND '2017-12-31';
MAX、MIN、AVG
使用产品信息表数据,计算所有产品的最高售价(max_price),最低售价(min_price)以及平均售价(average_price)。(注意选取列的顺序)
SELECTMAX(price) AS 'max_price',MIN(price) AS 'min_price',AVG(price) AS 'average_price'
FROMproduct_info;
HAVING
使用产品信息表数据,为每位供应商计算其销售产品的最高售价(max_price),最低售价(min_price)以及平均售价(average_price)
选择最高售价大于2倍平均售价的结果,列出供应商号码,最高售价,最低售价,平均售价(注意选取列的顺序)
SELECTsupplier_id,MAX(price) AS 'max_price',MIN(price) AS 'min_price',AVG(price) AS 'average_price'
FROMproduct_info
GROUP BYsupplier_id
HAVINGmax_price > 2 * average_price;
使用订单明细数据表( order_details)计算每样产品的总销售次数 (total_times) 以及总销售数量 (total_count) ,并选取总销售数量排名前9名的产品号码, 总销售数量,总销售次数 (注意选取列的顺序)
提示: 一样产品在一个订单中出现过算一次销售(比如A产品在订单1中出现过2次,该产品的销售次数应计为1次)
SELECTproduct_id,SUM(sales_count) AS 'total_count',COUNT(DISTINCT order_id) AS 'total_times'
FROMorder_details
GROUP BYproduct_id
ORDER BYtotal_count DESC
LIMIT 9;
3、数据表间的连接
INNER JOIN
查询所有供应商公司的在售产品信息
列出所有供应商公司的产品信息,公司名称,以及所在的省份
SELECTp.*,s.company,s.province
FROMproduct_info p
INNER JOIN supplier_info s ON p.supplier_id=s.supplier_id;
查询所有在2018年1月1日之后消费过的顾客信息
列出顾客号码(customer_id),顾客姓名(last_name,first_name),城市(city)以及电话号码(phone_number) (注意选取列的顺序)
注:每位顾客仅在结果中显示一次
SELECT DISTINCTc.customer_id,CONCAT(c.last_name, c.first_name) AS 'name',c.city,c.phone_number
FROMcustomer_info c
INNER JOIN order_info o ON c.customer_id = o.customer_id
WHEREo.create_time > '2018-01-01';
LEFT JOIN
查询所有的产品信息以及供应商公司信息
结果包含所有产品信息行以及对应供应商信息,没有对应信息的产品以空值(NULL)表示供应商信息
SELECT*
FROMproduct_info p
LEFT JOIN supplier_info s ON p.supplier_id = s.supplier_id;
查询所有供应商以及其提供的产品信息
列出供应商号码(supplier_id),公司(`company),产品号码(product_id), 产品名称(product_name)
注: 结果必须包含所有供应商信息,即使供应商没有提供产品(注意选取列的顺序)
SELECTs.supplier_id,s.company,p.product_id,p.product_name
FROMsupplier_info s
LEFT JOIN product_info p ON s.supplier_id = p.supplier_id;
查询所有顾客信息以及其最近购买日期
列出顾客号码(customer_id),姓名(name),以及最近购买日期(last_create_time)(注意选取列的顺序)
注:结果必须包含所有顾客信息,即使顾客没有完成过订单
关键语句:SELECT、CONCAT、LEFT JOIN、GROUP BY、MAX
SELECTc.customer_id,CONCAT(c.last_name, c.first_name) AS 'name',MAX(o.create_time) AS 'last_create_time'
FROMcustomer_info c
LEFT JOIN order_info o ON c.customer_id = o.customer_id
GROUP BYc.customer_id;
查询所有2018年1月1日之后各个订单中购买数量超过10的订单以及产品的详细信息
列出订单号码(order_id),订单日期(create_time), 购买数量(sales_count),产品号码(product_id),产品名称(product_name)(注意选取列的顺序)
提示:你需要使用`订单信息`(order_info)、`订单明细`(order_details)、`产品信息`(product_info)表。
关键语句:SELECT、LEFT JOIN(三个表连接)、WHERE+AND
SELECTod.order_id,oi.create_time,od.sales_count,p.product_id,p.product_name
FROMorder_details od
LEFT JOIN order_info oi ON od.order_id = oi.order_id
LEFT JOIN product_info p ON od.product_id = p.product_id
WHEREoi.create_time > '2018-01-01'
AND od.sales_count > 10;
RIGHT JOIN
4、数据的增、改、删
- 获取数据表信息:DESCRIBE
- 数据的插入:INSERT INTO
- 数据的修改:UPDATE SET
- 数据的删除:DELETE FROM
DESCRIBE
关联字列出数据表的详细信息:1、数据表的字段(列);2、各个字段的数据类型。
列出顾客信息表的详细信息:
DESCRIBE customer_info;
INSERT INTO
新纪录的字段与表中原纪录的个数、数据类型都要相同
添加新的产品信息
`product_id`(产品号码 ) : 81
`product_name`(产品名称):洗洁精
`supplier_id`(供应商号码) : 20
`price`(产品单价):9.99
`description`(产品描述): 350ml
INSERT INTO product_info
VALUES(81,'洗洁精',20,9.99,'350ml');
UPDATE SET
使用WHERE语句实现,确认将要修改的记录是有效记录;
新值的数据类型必须与表中定义好的数据类型保持一致。
请修改#6号产品(product_id)红枣的价格(price)为当前价格减去5元。
UPDATE product_info
SET price = 20
WHEREproduct_id = 6;
DELETE FROM
使用WHERE语句实现,确认将要删除的记录是目标记录;
5、SQL进阶
子查询
(1)单行单列过滤条件子查询
列出所有产品单价高于或等于最高产品单价50%产品的详细信息
SELECT*
FROMproduct_info
WHEREprice >= 0.5 * (SELECTMAX(price)FROMproduct_info);
选取所有在平均价格以上的产品信息
列出产品号码(product_id), 产品名称(product_name), 产品单价(price)。(注意选取列的顺序)
SELECTproduct_id,product_name,price
FROMproduct_info
WHEREprice > (SELECTAVG(price) AS 'product_avg_price'FROMproduct_info);
并在以上基础上,增加 “product_avg_price” (产品平均售价)常量列,在每一行中显示产品的平均售价(product_avg_price)。
SELECTproduct_id,product_name,price,(SELECTAVG(price)FROMproduct_info) AS 'product_avg_price'
FROMproduct_info
HAVINGprice > product_avg_price;
(2)多行单列过滤条件子查询
列出所有广东省供应商供应的产品详细信息
SELECT*
FROMproduct_info
WHEREsupplier_id IN (SELECTsupplier_idFROMsupplier_infoWHEREprovince = '广东省');
在不使用表连接(JOIN)的前提下,选取所有供应商来自于珠海市的产品信息
列出产品号码(product_id), 产品名称(product_name),供应商号码(supplier_id), 产品单价(price)(注意选取列的顺序)
SELECTproduct_id,product_name,supplier_id,price
FROMproduct_info
WHEREsupplier_id IN (SELECTsupplier_idFROMsupplier_infoWHEREcity = '珠海市');
在不使用表连接(JOIN)的前提下,计算2018年1月1日以来出售的每样产品的销售总数量(total_sales),选取销量最高的前8样产品
列出产品号码(product_id),销售总数(total_sales),将结果以销售总数从大到小排列
SELECTproduct_id,SUM(sales_count) AS 'total_sales'
FROMorder_details
WHEREorder_id IN (SELECTorder_idFROMorder_infoWHEREcreate_time >= '2018-01-01')
GROUP BYproduct_id
ORDER BYtotal_sales DESC
LIMIT 8;
(3)临表子查询
列出产品数目最多的供应商号码
SELECTsupplier_id
FROM(SELECTCOUNT(*) AS 'product_count',supplier_idFROMproduct_infoGROUP BYsupplier_idORDER BYproduct_count DESCLIMIT 1) AS s;
为每样产品计算总销售额,列出产品号码(product_id),产品名称(product_name),总销售额(total_sales)(注意选取列的顺序)
注:返回答案包含没有出售过的产品
提示: 使用订单明细表计算产品的总销售额
SELECTp.product_id,p.product_name,od.total_sales
FROMproduct_info p
LEFT JOIN (SELECTproduct_id,SUM(sales_count * sales_price) AS 'total_sales'FROMorder_detailsGROUP BYproduct_id
) AS od ON p.product_id = od.product_id;
选取近3天(2018.05.04-2018.05.06)销售额(`sales_rev`)最高的产品类别TOP3,按照产品号码(`product_id`)、销售额(`sales_rev`)顺序输出。
提示:
使用订单信息表(`order_info`)获取时间相关信息
使用订单明细表(`order_details`)获取产品相关信息
关键语句:JOIN、ORDER BY、LIMIT、临表子查询
SELECTod.product_id,od.sales_count * od.sales_price AS 'sales_rev'
FROMorder_details od
INNER JOIN (SELECTorder_id,create_timeFROMorder_infoWHEREcreate_time BETWEEN '2018-05-04'AND '2018-05-06'
) AS oi ON od.order_id = oi.order_id
ORDER BYsales_rev DESC
LIMIT 3;
条件判断语句
根据各位顾客的总消费额计算消费级别
SELECTcustomer_id,CASEWHEN payment_amounts >= 5000 THEN 'VIP3'WHEN payment_amounts >= 2000 AND payment_amounts < 5000 THEN 'VIP2'WHEN payment_amounts >= 1000 AND payment_amounts < 2000 THEN 'VIP1'ELSE '普通'END AS 'customer_level'
FROM(SELECTcustomer_id,SUM(payment_amount) AS 'payment_amounts'FROMorder_infoGROUP BYcustomer_id) AS customer_payments;
返回产品信息,增加新数据列 售价级别(price_level)
售价级别由平均产品价格计算得出
`产品单价`(`price`) 小于平均售价,级别为1
`产品单价` (`price`) 大于等于平均售价小于2倍平均售价,级别为2
`产品单价` (`price`) 大于等于2倍平均售价,级别为3
列出产品号码(product_id),产品名称(product_name),产品单价(price),售价级别(price_level)(注意选取列的顺序)
关键语句:
CASE WHEN 判定条件 THEN 判定结果
ELSE 默认值
END AS `售价级别`
SELECTp.product_id,p.product_name,p.price,CASE WHEN price < (SELECT AVG(price) FROM product_info) THEN 1WHEN price >= 2 * (SELECT AVG(price) FROM product_info) THEN 3ELSE 2END AS 'price_level'
FROMproduct_info p;
计算各年度、各季度的订单数量(`order_quantity`)。按照年度(`years`)、季度(`quarter`)、订单数量(`order_quantity`)顺序列出。提示:
使用Year() 获得时间类型字段的年份;
使用Month() 获得时间类型字段的月份;
季度用1-2-3-4表示(1-3月为1季度,以此类推);
关键语句:CASE WHEN ()THEN ()END、COUNT
SELECTCOUNT(order_id) AS 'order_quantity',YEAR (create_time) AS 'years',CASEWHEN MONTH (create_time)<4 THEN 1WHEN MONTH (create_time)>=4 AND MONTH (create_time)<7 THEN 2WHEN MONTH (create_time)>=7 AND MONTH (create_time)<10 THEN 3ELSE 4END AS 'quarter'
FROMorder_info
GROUP BY years, quarter;或CASE WHEN MONTH(create_time) > 9 THEN 4WHEN MONTH(create_time) > 6 THEN 3WHEN MONTH(create_time) > 3 THEN 2ELSE 1END AS 'quarter'
SQL语句优化
SQL在数据分析中的应用案例(一)相关推荐
- 数据分析中的统计概率_了解统计和概率:成为专家数据科学家
数据分析中的统计概率 Data Science is a hot topic nowadays. Organizations consider data scientists to be the Cr ...
- 大数据在政府中的应用案例
本文来自网易云社区. 政府掌握着全社会量最大.最核心的数据.了解政府大数据应用的案例和数据有助于释放政府数据的价值,也有利于民众对政府的了解.下面来看看大数据在政府中的应用案例. 大数据在政府中的应用 ...
- 【计算机大数据毕设之基于spark+hadoop的大数据分析论文写作参考案例】
[计算机大数据毕设之基于spark+hadoop的大数据分析论文写作参考案例-哔哩哔哩] https://b23.tv/zKOtd3L 目 录 一 引言1 二 系统分析2 2.1 必要性和可行性 ...
- 干货丨重中之重:数据分析中常用指标及术语!
数据解读是数据分析师的基本功,如果不能充分理解数据分析中出现的各类指标及术语,数据分析工作将很难展开. 对于数据分析师来说,了解常用的分析指标和术语是做好数据解读的前提.下面,一起来了解下常用指标及术 ...
- 数据分析中的“产品思维”经验讲解
小飞象·交流会 所有的人都在努力,并不是只有你满腹委屈. 内部交流│10期 数据分析中的产品思维 data analysis ●●●● 分享人:马小驴 做数据分析离不开要和一些"产品&q ...
- 淘宝双11数据分析与预测课程案例—步骤四:利用Spark预测回头客行为代码报错
在练习林子雨老师的"淘宝双11数据分析与预测课程案例-步骤四:利用Spark预测回头客行为"章节时出现了代码报错. 具体在执行"val model = SVMWithSG ...
- hive建立内部表映射hbase_快手 HBase 在千亿级用户特征数据分析中的应用与实践...
分享嘉宾:陈杨 快手 编辑整理:Hoh Xil 内容来源:BigData NoSQL 12th Meetup 出品社区:DataFun 注:欢迎转载,转载请注明出处. 快手建设 HBase 差不多有2 ...
- java像sql一样处理数据_像Excel一样使用SQL进行数据分析
Excel是数据分析中最常用的工具 ,利用Excel可以完成数据清洗,预处理,以及最常见的数据分类,数据筛选,分类汇总,以及数据透视等操作,而这些操作用SQL一样可以实现.SQL不仅可以从数据库中读取 ...
- sql server 快照_添加新文章,删除文章,更改快照文件夹路径和SQL Server复制中的数据筛选器行
sql server 快照 In the last articles, we have learned Configuring Snapshot and Transactional SQL Serve ...
最新文章
- css图片悬停边框,CSS悬停边框使内联元素稍微调整
- Excel删除区域名
- log4j - 日志
- python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏。 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小
- android跨进程事件注入(程序模拟用户输入)
- 数学要考多少分?才能考上985、211,很多高中生看完后沉默了......
- 【Flask】Flask常用信号
- 卷积神经网络中的池化方法(pooling)总结
- UVA10167 Birthday Cake【暴力】
- Java SE 基础:继承、封装、多态、fianl、static、abstract
- 易筋SpringBoot 2.1 | 第廿一篇:SpringBoot的Mybatis生成工具Generator
- 电磁兼容的PCB设计(一)
- 【入门必看-算法基础知识讲解】小白都也能看得懂
- 机器学习系列8:逻辑回归的代价函数
- 奖励 CSDN 社区的领军人物
- Mac下AndroidStudio无法识别安卓手机问题解决
- Windows远程桌面连接后被连接的桌面锁屏
- 【业务架构】获得正确业务能力的 12 项必备措施
- Unity3d如何实现四格漫画动态播放
- sgd,adam和adagrad哪个好