2023年亚太杯APMCM数学建模大赛数据分析题MySQL的使用

2023年亚太杯APMCM数学建模大赛

以2022年C题全球变暖数据为例

数据分析:

以2022年亚太杯数学建模C题为例,首先在navicat建数据库然后右键"表",单击"导入向导",选择对应的数据格式及字符集进行数据导入

导入之后,我们可以双击刚刚导入的2022_apmcm_c_data表,查看一下数据情况。使用"ctrl"+"q"快捷键来新建SQL查询语言,结构化语言查询页面中会自动生成代码:select * from 2022_apmcm_c_data

  由于原数据条数太多,因此我们可以使用mysql中的limit函数简单查看表重所有字段的前100条数据情况。代码如下:

sql 复制代码
SELECT * FROM `2022_apmcm_c_data` limit 100;

你如果要是计算机专业,不会mysql,那你赶紧找个厂子上班得了;你如果不是计算机专业,没学过mysql我不说什么,不是说轻视,因为这个东西根本不用想,然后还有星号星号博主把mysql说的多么高大上,我今天毫无保留的把mysql这点破玩意都讲给你们。
  mysql也好还是oracle数据库也好,它本身最常用最实用的功能就是提供数据存储增删改查的,你tm有的星号星号博主说mysql是机器学习软件,你把读者都当作星号星号是么?它就是个结构化查询语言,别误导读者行么?对于在自己电脑安装mysql的学生,完全没有必要使用建表语句去建表,为什么呢?因为你在导入表之后,双击打开表之后,在表的右侧就会自动生成建表语句,而且这个表在你导入之后就自动建好了。

然后我再多说一嘴,你如果搭建数据库这个环境,完全没有必要在官网下载mysql,因为现在已经有了mysql环境集成程序包,就30MB,无须配置环境而且免费的,你如果安装官网mysql,不仅步骤繁琐,而且占空间太大。我就很好奇这事为啥没一个博主说呢?还是你们不会啊??我带**大学的拿研究生数学建模国奖的时候,你还在那"习莱克特"呢,你还支棱上了,还mysql数学建模,mysql根本做不了数学建模,严格意义上讲是pivot分析。
  猪鼻子插葱都在这装象是吧,好,上菜

查看某张表的数据结构或所有列和列变量数据类型

sql 复制代码
DESCRIBE 2022_apmcm_c_data;
desc 2022_apmcm_c_data;

这两个函数用哪个都行 无所谓的 结果都是一样的

查看指定字段的表数据

sql 复制代码
select dt,AverageTemperature,Country from 2022_apmcm_c_data;

常用聚合计算函数教学

计算某一列(这里选用的是温度)数值变量之和

sql 复制代码
select sum(AverageTemperature) from 2022_apmcm_c_data;

请得出所给表中数据所有城市名称汇总

distinct用于返回不同的值(即去重功能)。在表中,一列通常包含许多重复值,该函数可以去重,得出去重后的结果。

sql 复制代码
select distinct City from 2022_apmcm_c_data;

计算不同国家下的数据条数

Group by是SQL语句中的一个重要操作,它可以将数据按照指定的列进行分组,并对每个分组进行聚合操作,如求和、计数、平均值等。

sql 复制代码
select Country,count(1) from 2022_apmcm_c_data group by Country;

计算不同国家不同时间下的数据条数

sql 复制代码
select dt,Country,count(1) from 2022_apmcm_c_data group by dt,Country;

计算不同国家不同时间下的温度之和

sql 复制代码
select dt,Country,sum(AverageTemperature) from 2022_apmcm_c_data 
group by dt,Country;

计算不同国家不同时间下的温度之和并按照时间顺序进行排序

在SQL中,ORDER BY是一种用于对结果集进行排序的子句。它通常紧跟在SELECT语句之后,可以根据一个或多个列对结果集进行排序。ORDER BY子句可以使用升序(默认)或降序来排序数据。

sql 复制代码
select dt,Country,sum(AverageTemperature) from 2022_apmcm_c_data 
group by dt,Country ORDER BY dt;

请给出2000年以来不同地区国家的最高气温数据透视表

where和having都可以实现字段条件的限制

在SQL语句中,WHERE子句用于筛选出符合特定条件的数据。

在SQL语句中,HAVING子句通常与GROUP BY子句一起使用来限制对分组后的结果集进行过滤。它和WHERE子句的区别在于:

1. HAVING子句用于过滤分组后的结果集,而WHERE子句用于过滤原始数据集。

2. HAVING子句只能在SELECT语句中使用,而WHERE子句可以在SELECT、UPDATE和DELETE语句中使用。

3. HAVING子句中可以使用聚合函数,而WHERE子句不可以使用聚合函数。

方法一 使用where和日期转化函数中的截取年功能YEAR函数

sql 复制代码
select dt,max(AverageTemperature) from 2022_apmcm_c_data 
where YEAR(dt) >=2000 GROUP BY dt ORDER BY dt;

此方法虽然得到2000年以来不同地区国家的最高气温数据透视表,但是并未按照正确的时间顺序给出结果

因此我们稍作改动 使用日期转化函数from_unixtime

由于数据库中dt字段为char类型,因此需转换成日期类型

sql 复制代码
select dt,max(AverageTemperature) from 2022_apmcm_c_data 
where from_unixtime(dt,'%Y-%m-%d') GROUP BY dt having
 YEAR(dt) >=2000 ORDER BY dt;
sql 复制代码
select dt,max(AverageTemperature) from 2022_apmcm_c_data 
where from_unixtime(CONVERT(dt,date),'%Y%m%d') GROUP BY 
dt ORDER BY dt;
sql 复制代码
select dt,max(AverageTemperature) from 2022_apmcm_c_data
 where from_unixtime(cast(dt as date),'%Y%m%d') GROUP BY dt ORDER BY dt;
sql 复制代码
select dt,max(AverageTemperature) from 2022_apmcm_c_data 
where DATE_FORMAT(CONVERT(dt,date),'%Y%m%d') GROUP BY dt ORDER BY dt;
sql 复制代码
select dt,max(AverageTemperature) from 2022_apmcm_c_data 
where DATE_FORMAT(STR_TO_DATE(dt,'%Y-%m-%d'),'%Y%m%d') 
GROUP BY dt ORDER BY dt;

数据格式检验

sql 复制代码
select DATE_FORMAT(STR_TO_DATE(dt,'%Y-%m-%d'),'%Y%m%d') from 2022_apmcm_c_data  where dt is not null ORDER BY dt;

我虽然列出了这么多方法 但是结果不正确 为什么?因为导入数据时,数据格式不统一,这就造成了后续数据分析中较大的数据偏差

进行数据处理之后 我们再次导入数据

新导入的数据表为2022_apmcm_c_data_copy1

sql 复制代码
select dt,max(AverageTemperature) from 2022_apmcm_c_data_copy1 
where from_unixtime(CONVERT(dt,date),'%Y%m%d') GROUP BY dt ORDER BY dt;

查完之后还是不正确,为什么呢?因为你导入数据的类型不对 温度这是数值数据

我们使用限定条件检查一下

sql 复制代码
select max(AverageTemperature) from 2022_apmcm_c_data_copy1 
where dt='2013-01-01';

接着我们修改一下数据类型 因为varchar类型无法进行数值比较

这里可直接修改表结构或使用sql语言来改变表结构

注意 不能使用int类型,因为原温度数据带有小数点,应使用double类型

之后下一节我们会专门讲解alter的用法

sql 复制代码
ALTER TABLE 2022_apmcm_c_data_copy1 MODIFY AverageTemperature double;

接着我们再次检查一下

sql 复制代码
select max(AverageTemperature) from 2022_apmcm_c_data_copy1
 where dt='2013-01-01';

数据正常之后我们现在再来实现一下2000年以来不同地区国家的最高气温数据透视表功能

方法一

sql 复制代码
select dt,max(AverageTemperature) from 2022_apmcm_c_data_copy1 
where from_unixtime(dt,'%Y-%m-%d') GROUP BY dt having YEAR(dt)
 >=2000 ORDER BY dt;

方法二

sql 复制代码
select dt,max(AverageTemperature) from 2022_apmcm_c_data_copy1 
where DATE_FORMAT(STR_TO_DATE(dt,'%Y-%m-%d'),'%Y%m%d') >='20000101'
 GROUP BY dt ORDER BY dt;

这里方法太多了 我上述给出我最常用的两种

上述我们使用了日期函数,现在我这边教学一下字符串函数和聚合函数的简单综合运用

请计算2010年以来不同国家的平均地理位置(平均经纬度)

在mysql中,replace函数与SELECT语句配合使用时,可以用于进行字符串替换操作,同时也支持多个字符串同时被替换,语法为"SELECT REPLACE(数据库表的列名,需要替换的字符串,替换成的字符串)"。

在MySQL中,AVG函数用于计算某个字段的平均值。平均值是通过将数值求和然后除以总数得到的。

我们循序渐进的来教学

这里不使用update的原因就是不要改变原数据,因为改变之后或许还会用到经纬度的字符。

但是如果你有备份不嫌麻烦可以使用update,但更新有风险,检验需谨慎

sql嵌套子查询和函数的综合运用

1.先替换掉字段数据中的N和E字符

sql 复制代码
select dt as 日期,Country as 国家,replace(Latitude,'N','') as 纬度,
replace(Longitude,'E','') as 经度 from 2022_apmcm_c_data_copy1 where 
from_unixtime(dt,'%Y-%m-%d') GROUP BY dt,Country,Latitude,Longitude 
having YEAR(dt) >=2000 ORDER BY dt;

2.然后再替换掉数据中的S和W字符

sql 复制代码
select a.日期,a.国家,replace(a.纬度,'S','') as 纬度,replace(a.经度,'W','') as 经度 
from(
select dt as 日期,Country as 国家,replace(Latitude,'N','') as 纬
度,replace(Longitude,'E','') as 经度 from 2022_apmcm_c_data_copy1 where 
from_unixtime(dt,'%Y-%m-%d') GROUP BY dt,Country,Latitude,Longitude 
having YEAR(dt) >=2000 ORDER BY dt)a;

3.1使用convert函数类型转化及均值函数计算

注意 这里转不了double类型 数据类型不懂的 看一下float double 和decimal的区别

float类型表示单精度浮点数值,double类型表示双精度浮点数值,float和double都是浮点型,而decimal是定点型;

MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(5,2)的 可显示为999.99,MySQL保存值时会进行四舍五入,如果插入999.009,则结果为999.01。

sql 复制代码
select b.日期,b.国家,AVG(CONVERT(b.纬度,DECIMAL(10,2))),
AVG(CONVERT(b.经度,DECIMAL(10,2))) from(
select a.日期,a.国家,replace(a.纬度,'S','') as 纬度,
replace(a.经度,'W','') as 经度 from(
select dt as 日期,Country as 国家,replace(Latitude,'N','') 
as 纬度,replace(Longitude,'E','') as 经度 from 2022_apmcm_c_data_copy1
 where from_unixtime(dt,'%Y-%m-%d') GROUP BY 
 dt,Country,Latitude,Longitude having YEAR(dt) >=2000 
 ORDER BY dt)a)b group by b.日期,b.国家;

3.2也可以使用cast函数类型转化及均值函数计算

cast功能测试

sql 复制代码
select CAST(AverageTemperature as decimal(8,2)) from 2022_apmcm_c_data_copy1;
sql 复制代码
select b.日期,b.国家,AVG(CAST(b.纬度 as decimal(9,2)))
,AVG(CAST(b.经度 as decimal(9,2))) from(
select a.日期,a.国家,replace(a.纬度,'S','') 
as 纬度,replace(a.经度,'W','') as 经度 from(
select dt as 日期,Country as 国家,replace(Latitude,'N','')
 as 纬度,replace(Longitude,'E','') as 经度 from 
 2022_apmcm_c_data_copy1 where from_unixtime(dt,'%Y-%m-%d')
 GROUP BY dt,Country,Latitude,Longitude having YEAR(dt) >=2000 
 ORDER BY dt)a)b group by b.日期,b.国家;

下节课我们详细讲,MySQL中的where用法

相关推荐
麦麦鸡腿堡3 小时前
Java_MySQL介绍
java·开发语言·mysql
程序员阿鹏3 小时前
MySQL中给字段添加唯一约束的方式有哪些?
android·数据库·mysql
古月฿4 小时前
大学生素质测评系统设计与实现
java·vue.js·redis·mysql·spring·毕业设计
無量4 小时前
MySQL事务与锁机制深度剖析
后端·mysql
無量4 小时前
MySQL索引设计与优化实战
后端·mysql
蟹至之4 小时前
【MySQL】JDBC的使用(万字解析)
java·数据库·mysql·jdbc
·云扬·5 小时前
InnoDB事务隔离级别与加锁机制深度解析
数据库·sql·mysql
四谎真好看5 小时前
MySQL 学习笔记(进阶篇2)
笔记·学习·mysql·学习笔记
思迈特Smartbi5 小时前
思迈特软件斩获鲲鹏应用创新大赛(华南赛区) “最佳原生创新奖”
人工智能·ai·数据分析·bi·商业智能
计算机毕设指导65 小时前
基于微信小程序的校园物品租赁与二手交易系统【源码文末联系】
spring boot·mysql·微信小程序·小程序·tomcat·maven·intellij-idea