本文标识 : MQ0012
本文编辑 : 长安月下赏美人儿
编程工具 : MySQL、DBeaver
阅读时长 : 7分钟
多表联合是啥?能吃么?吃完会瘦么?!
会瘦!!!只不过是得到的数据结果更瘦而已!!!
在之前分享的案例中,大多是针对一张数据表进行查询,譬如查询 A 字段、B 字段、C 字段等,或者是有关他们的一些简单的聚合计算。但是,现实情况中,一张表往往并不能覆盖所有的需求字段,这个时候,就要进行多表联合查询。
如果一个项目有10张表,任意两张表拼接,就会出现45种排列组合方式,且有的情况下,极有可能需要三张表或四张表,这就非常可怕了,不仅会造成数据冗余过多的占据数据库存储空间,还会给日常的数据表维护造成非常大的困扰!所以,学习多表联合查询就显得非常非常的重要!
定义:多表联合就是将一张表中的信息按照某个条件(联结条件)和另一张表中的数据信息联结起来,形成一个新的数据块的过程。
多表联合的分类,也是有趣的!
不同数据表的行联合,叫做多表行关联!
不同数据表的列联合,叫做多表列关联!
本文,主要进行多表操作之行关联!
#基础语法:
SELECT 列名1 FROM 表A
UNION(ALL)
SELECT 列名2 FROM 表B;
例子:统计201707月内某每天及本月累计销售金额、订单量、会员数、订单占比、会员渗透率
SELECT dimDateID
,SUM(AMT) AS amt_day
,COUNT(salesNo) AS order_number
,COUNT(DISTINCT dimMemberID) AS member_number
,COUNT(salesNo)/(SELECT COUNT(salesID)
FROM dw.fct_sales
WHERE dimDateID BETWEEN '20170701' AND '20170731') AS order_rate
,COUNT(dimMemberID)/(SELECT COUNT(DISTINCT dimMemberID)
FROM dw.fct_sales
WHERE dimDateID BETWEEN '20170701' AND '20170731') AS member_rate
FROM dw.fct_sales
WHERE dimDateID BETWEEN '20170701' AND '20170731'
GROUP BY dimDateID
UNION
SELECT MONTH(dimDateID) AS m_month
,SUM(AMT) AS amt_day
,COUNT(salesID) AS order_number
,COUNT(DISTINCT dimMemberID) AS member_number,'100%'
,'100%'
FROM dw.fct_sales
WHERE dimDateID BETWEEN '20170701' AND '20170731'
GROUP BY MONTH(dimDateID);
数据结果:
题目:统计201707月内某每天及本月累计销售金额、订单量、会员数、订单占比、会员渗透率。
咱们先审题,需要什么?
时间维度:2017年7月1日-7月31日
字段维度:销售金额、订单量、会员数、订单占比、会员渗透率
限制条件:每天及本月累计
限制条件的理解非常关键,限制的是数据表现形式,却限制不住人类的想象力!所以,阅读到这里,有没有想到这个数据结果的大概表现形式?!
对的,就是拼接!!!
第一步,把那些时间维度内的,可以直接查询或间接计算出来的字段整合到一起!
第二步,把累计结果搞出来,整成一行!
第三步,把它们俩拼在一起!
#第一步骤代码
SELECT dimDateID
,SUM(AMT) AS amt_day
,COUNT(salesNo) AS order_number
,COUNT(DISTINCT dimMemberID) AS member_number
,COUNT(salesNo)/(SELECT COUNT(salesID)
FROM dw.fct_sales
WHERE dimDateID BETWEEN '20170701' AND '20170731') AS order_rate
,COUNT(dimMemberID)/(SELECT COUNT(DISTINCT dimMemberID)
FROM dw.fct_sales
WHERE dimDateID BETWEEN '20170701' AND '20170731') AS member_rate
FROM dw.fct_sales
WHERE dimDateID BETWEEN '20170701' AND '20170731'
GROUP BY dimDateID;
数据结果:
#第二步骤代码
SELECT MONTH(dimDateID) AS m_month
,SUM(AMT) AS amt_day
,COUNT(salesID) AS order_number
,COUNT(DISTINCT dimMemberID) AS member_number,'100%'
,'100%'
FROM dw.fct_sales
WHERE dimDateID BETWEEN '20170701' AND '20170731'
GROUP BY MONTH(dimDateID);
数据结果:
#第三步骤代码
UNION
多表操作之行关联小结: