ITPub博客

首页 > 数据库 > 数据库开发技术 > 如何快速分析出城市人口流动数量?

如何快速分析出城市人口流动数量?

原创 数据库开发技术 作者:猴子数据分析 时间:2023-08-07 17:04:51 0 删除 编辑


【题目】




需要通过以上数据,了解:

1:每个城市的总流入人口数量

2:统计 2017 年乘飞机在周末从北京流入的人口数

3:计算 2018 年流入流出长春的总人数


【问题 1 解题思路】:计算每个城市的总流入人口数量


1、解题思路:此题分为 2 步,首先计算「总流入人口数量」,然后再分组到每个城市

2、题中提到「总流入人口数量」 需要用到聚集函数 sum

3、「每个城市」的人口数量,需要按城市分组,用到分组函数 group by ,  

select 流入城市 as 城市,sum(数量) as 总人口流入数from 各城市人口流动表group by 流入城市;

查询结果为:


【本题考点】


1、此题比较简单,考察聚合函数 sum 。常用的聚合函数还有 count、max、min

2、考察分组 group by 子句的用法。需要注意的是 group by 子句列出的每一个字段都必须是 select 检索的列或者表达式,不能是聚集函数,也不能使用别名, group by 分组后,如有条件筛选,使用 Having 语句过滤。



【问题 2 解题思路】:统计2017年乘飞机在周末从北京流入的人口数


1、解题思路:此题分为 2 大步。第 1 步,先计算流入到北京的人口数,第 2 步,满足条件「2017 年」、「乘飞机」、「周末」

2、计算「从北京流入的人口数」,也就是「流出城市」为北京的人口数,需要用到汇总函数 sum 

select 流出城市,sum(数量) as 流出总人数from 各城市人口流动表where 流出城市="北京";


查询结果为:

即下面标红色的部分求和:


2、题目要求满足多个并列条件:交通工具是「飞机」,流入年份是「2017年」并且是「周末」。多个条件并列用「and」。

select 流出城市,sum(数量) as 流出总人数from 各城市人口流动表where 流出城市="北京"and 交通工具="飞机"and 年份="2017"and 星期六或者星期日;


3、年份查询,题目给出的「日期」字段是具体的日期,要用具体的日期筛选出年份,用到年份的提取函数 year()

4、星期查询,需要用 date_format(date,format) 函数在「日期」字段中筛选出周末。因周末有 2 天,周六、周日,用 or 操作符,把周六日全部选出来。

select 流出城市,sum(数量) as 流出总人数from 各城市人口流动表where 流出城市="北京"and 交通工具=3and year(日期)="2017"and(date_format(日期,'%w')=6 or date_format(日期,'%w')=0)group by 流出城市;


查询结果:


即下面标红色框的部分求和:

【本题考点】


1、多条件并列 and 操作符,返回满足所有给定条件的行。

2、date_format(date,format) 函数,SQL 中设置时间格式函数,其中括号里的「date」是要设置的日期,「format」 是设置成规定日期/时间的格式。根据format 字符串格式化 date 值。下列字符和字符串是常用的:


格式化日期常用的字符串:


3、SQL 常用的日期提取函数:


4、or 操作符,筛选结果只要满足其中之一条件就被筛选出来,在与 and 连用时,优选计算 and , and 拥有较高的计算次序, or 前后的条件一般需要用括号括起来,否则会优先计算 and 前后的条件,造成计算错误。


【问题 3 解题思路】:计算2018年流入流出长春的总人数


1、解题思路:先把符合条件的「流入」的人数计算出来,并把符合条件的「流出」的人数计算出来,两者合并作为一个整体,然后对整体的结果再求和。

select sum(a)from(select sum(数量) as afrom 各城市人口流动表where year(日期)="2018"and 流出城市="长春"union allselect sum(数量) as afrom  各城市人口流动表where year(日期)="2018"and 流入城市="长春")t;


查询结果为:


2、上一个解法思路比较清晰,但是写起来比较复杂,可以用「or」「and」连用简化一下,流入流出是一个条件,时间为一个条件,两者并列,简化为:

select sum(数量) as afrom 各城市人口流动表where (流出城市="长春" or 流入城市="长春")and year(日期)="2018";


即下面标红色的部分求和:


【本题考点】


1、此题考察子查询,把子查询的结果作为一个临时表来查询,需要理清各层的逻辑关系,子查询都是从内到外逐层运行,内层没有错误后,再运行外层。

2、union 的用法,union 执行两条及以上 select 语句,并把结果合成一个结果来查询,union 中的每个查询都必须包含相同的列,union all 查询所有的行,union 查询不重复的行。

3、or、and 连用,第 2 题考点总结 4 已有说明。


【经验分享】

1、动手多写,多练、多运行语句。SQL 书本的语句比较简单,看着都会,也不难,写都写的出来,可是一运行发现却是错的,写跟运行正确是两回事,只有实际运行才能找出错误,才能有收获,技术才能提高。

2、复杂的语句,先写里面的子句,再写外面的聚合。发现了错误,按照逻辑步骤,一步步运行,确保每一小步没有问题,最后才能运行正确。开始没有经验的时候,检查错误都是从上到下一句句的检查,这是不对的。另外,需要多点耐心,急不得,经验都是一点点积累了,不可能一口气吃个胖子。



 ⬇️点击「阅读原文」

 免费报名 数据分析训练营

原文作者:猴子数据分析;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2017-01-16

  • 博文量
    865
  • 访问量
    345538