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在数据分析中的应用案例(一)相关推荐

  1. 数据分析中的统计概率_了解统计和概率:成为专家数据科学家

    数据分析中的统计概率 Data Science is a hot topic nowadays. Organizations consider data scientists to be the Cr ...

  2. 大数据在政府中的应用案例

    本文来自网易云社区. 政府掌握着全社会量最大.最核心的数据.了解政府大数据应用的案例和数据有助于释放政府数据的价值,也有利于民众对政府的了解.下面来看看大数据在政府中的应用案例. 大数据在政府中的应用 ...

  3. 【计算机大数据毕设之基于spark+hadoop的大数据分析论文写作参考案例】

    [计算机大数据毕设之基于spark+hadoop的大数据分析论文写作参考案例-哔哩哔哩] https://b23.tv/zKOtd3L 目  录 一 引言​1 二 系统分析​2 2.1 必要性和可行性 ...

  4. 干货丨重中之重:数据分析中常用指标及术语!

    数据解读是数据分析师的基本功,如果不能充分理解数据分析中出现的各类指标及术语,数据分析工作将很难展开. 对于数据分析师来说,了解常用的分析指标和术语是做好数据解读的前提.下面,一起来了解下常用指标及术 ...

  5. 数据分析中的“产品思维”经验讲解

    小飞象·交流会 所有的人都在努力,并不是只有你满腹委屈. 内部交流│10期 数据分析中的产品思维 data analysis ●●●● 分享人:马小驴 ‍ 做数据分析离不开要和一些"产品&q ...

  6. 淘宝双11数据分析与预测课程案例—步骤四:利用Spark预测回头客行为代码报错

    在练习林子雨老师的"淘宝双11数据分析与预测课程案例-步骤四:利用Spark预测回头客行为"章节时出现了代码报错. 具体在执行"val model = SVMWithSG ...

  7. hive建立内部表映射hbase_快手 HBase 在千亿级用户特征数据分析中的应用与实践...

    分享嘉宾:陈杨 快手 编辑整理:Hoh Xil 内容来源:BigData NoSQL 12th Meetup 出品社区:DataFun 注:欢迎转载,转载请注明出处. 快手建设 HBase 差不多有2 ...

  8. java像sql一样处理数据_像Excel一样使用SQL进行数据分析

    Excel是数据分析中最常用的工具 ,利用Excel可以完成数据清洗,预处理,以及最常见的数据分类,数据筛选,分类汇总,以及数据透视等操作,而这些操作用SQL一样可以实现.SQL不仅可以从数据库中读取 ...

  9. sql server 快照_添加新文章,删除文章,更改快照文件夹路径和SQL Server复制中的数据筛选器行

    sql server 快照 In the last articles, we have learned Configuring Snapshot and Transactional SQL Serve ...

最新文章

  1. css图片悬停边框,CSS悬停边框使内联元素稍微调整
  2. Excel删除区域名
  3. log4j - 日志
  4. python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏。 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小
  5. android跨进程事件注入(程序模拟用户输入)
  6. 数学要考多少分?才能考上985、211,很多高中生看完后沉默了......
  7. 【Flask】Flask常用信号
  8. 卷积神经网络中的池化方法(pooling)总结
  9. UVA10167 Birthday Cake【暴力】
  10. Java SE 基础:继承、封装、多态、fianl、static、abstract
  11. 易筋SpringBoot 2.1 | 第廿一篇:SpringBoot的Mybatis生成工具Generator
  12. 电磁兼容的PCB设计(一)
  13. 【入门必看-算法基础知识讲解】小白都也能看得懂
  14. 机器学习系列8:逻辑回归的代价函数
  15. 奖励 CSDN 社区的领军人物
  16. Mac下AndroidStudio无法识别安卓手机问题解决
  17. Windows远程桌面连接后被连接的桌面锁屏
  18. 【业务架构】获得正确业务能力的 12 项必备措施
  19. Unity3d如何实现四格漫画动态播放
  20. sgd,adam和adagrad哪个好

热门文章

  1. 运用计算机意味着公司朝,计算机与信息技术基础(第4版)第1章教程范本.pptx
  2. 中基鸿业五个简单易学的理财操作指南
  3. 人生导师——如何学习C++的Windows方向
  4. 前端开发者应该明白的浏览器工作原理
  5. Docker学习笔记3
  6. 补水雾化器专用MOS管直接替代AO3400节约成本MOSFET SOT23-3
  7. 【C语言】计算两个日期相差的天数
  8. Cocos Creator入门(一)之查漏补缺
  9. linux查看ssh公钥,SSH公钥(public key)验证
  10. (二)微服务保护——限流规则