• 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条数据情况。代码如下:

    SELECT * FROM `2022_apmcm_c_data` limit 100;
    
    • 1

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

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

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

    DESCRIBE 2022_apmcm_c_data;
    desc 2022_apmcm_c_data;
    
    • 1
    • 2

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

      查看指定字段的表数据

    select dt,AverageTemperature,Country from 2022_apmcm_c_data;
    
    • 1

      常用聚合计算函数教学

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

    select sum(AverageTemperature) from 2022_apmcm_c_data;
    
    • 1

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

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

    select distinct City from 2022_apmcm_c_data;
    
    • 1

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

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

    select Country,count(1) from 2022_apmcm_c_data group by Country;
    
    • 1

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

    select dt,Country,count(1) from 2022_apmcm_c_data group by dt,Country;
    
    • 1

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

    select dt,Country,sum(AverageTemperature) from 2022_apmcm_c_data 
    group by dt,Country;
    
    • 1
    • 2

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

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

    select dt,Country,sum(AverageTemperature) from 2022_apmcm_c_data 
    group by dt,Country ORDER BY dt;
    
    • 1
    • 2

      请给出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函数

    select dt,max(AverageTemperature) from 2022_apmcm_c_data 
    where YEAR(dt) >=2000 GROUP BY dt ORDER BY dt;
    
    • 1
    • 2

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

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

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

    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;
    
    • 1
    • 2
    • 3
    select dt,max(AverageTemperature) from 2022_apmcm_c_data 
    where from_unixtime(CONVERT(dt,date),'%Y%m%d') GROUP BY 
    dt ORDER BY dt;
    
    • 1
    • 2
    • 3
    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;
    
    • 1
    • 2
    select dt,max(AverageTemperature) from 2022_apmcm_c_data 
    where DATE_FORMAT(CONVERT(dt,date),'%Y%m%d') GROUP BY dt ORDER BY dt;
    
    • 1
    • 2
    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;
    
    • 1
    • 2
    • 3

      数据格式检验

    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;
    
    • 1

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

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

      新导入的数据表为2022_apmcm_c_data_copy1

    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;
    
    • 1
    • 2

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

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

    select max(AverageTemperature) from 2022_apmcm_c_data_copy1 
    where dt='2013-01-01';
    
    • 1
    • 2

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

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

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

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

    ALTER TABLE 2022_apmcm_c_data_copy1 MODIFY AverageTemperature double;
    
    • 1

      接着我们再次检查一下

    select max(AverageTemperature) from 2022_apmcm_c_data_copy1
     where dt='2013-01-01';
    
    • 1
    • 2

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

      方法一

    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;
    
    • 1
    • 2
    • 3

      方法二

    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;
    
    • 1
    • 2
    • 3

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

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

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

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

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

      我们循序渐进的来教学

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

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

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

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

    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;
    
    • 1
    • 2
    • 3
    • 4

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

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

      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。

    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.国家;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

      cast功能测试

    select CAST(AverageTemperature as decimal(8,2)) from 2022_apmcm_c_data_copy1;
    
    • 1
    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.国家;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

  • 相关阅读:
    软考_系统设计架构师--备考重点建议与心得
    (附源码)spring boot学业指导系统 毕业设计 030958
    项目经理如何顺利推进项目:做好任务规划,合理安排时间
    Python的加密
    Verilog 条件语句
    高新技术企业认证条件 ,高企申报流程
    【1++的C++进阶】之emplace详解
    SQL项目实战:房产行业如何分析?(步骤具体且明确)
    【opencv】传统目标检测:Haar检测器实现人脸检测
    day1-机器学习-回归问题
  • 原文地址:https://blog.csdn.net/weixin_43292788/article/details/134414884