MySQL(持续更新)

MySQL学习(问题&解决方法)

说明:今天用MySQL写sql语句的时候遇到了一些问题,写篇博客记录一下(大佬勿喷)

问题1:字符串拼接问题

今天使用Mybatis的时候,用到了模糊查询,需要字符串的拼接,具体情境如下:
数据大约是这么个数据,然后要实现传入年和月,查出这一年这一个月的所有的数据和
在这里插入图片描述
突然发现sql中不能直接用“+”拼接字符串,这里插一个MySQL中的模糊查询

模糊查询

关键字:like
通配符:

  • %:匹配任意长度的字符串
  • _:匹配任意单个字符
  • escape:转义上面两个字符

用法:
比如上表中要查询所有2019年1月所有CO2的值可以写如下sql语句:

select sum(co2) 
from CM19_21
where date like "2019/1%";

继续刚才的问题
sql语句中不支持“+”拼接字符串,但是可以使用 concat 方法,如下

select sum(co2) 
from CM19_21
where date like concat('2019','/','1%');

这样就可以了!

问题2:整数转字符串问题

如果前端传过来的数据是int类型的年和月呢,可以使用 cast(i as char) 方法
i为要转成字符串的整数,如下:

select sum(co2) 
from CM19_21
where date like concat(cast(2019 as char),'/',cast(1 as char),'%');

作用和上面的完全相同

问题3:批量插入数据问题

想要对上表做一个整合,把所有月份的数据整合在一起,但是没有什么好的方法,只能建一个新表,然后查询插入,此时发现查询插入好像要写很多个,幸亏我想起sql中还有 procedure 这么个东西

procedure:procedure是一 组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(参数可以为空)来调用执行它。
这就类似shell脚本,结合了控制语句和sql语句

下面就实现一下上述功能

# 更换回车结束符,在可视化工具中编写sql时可以不用写
delimiter $$
# 创建一个存储过程 类似一个函数
create procedure select_mount()
# 开始
begin
	# 定义 i 和 j 两个变量并赋初值
	declare i int default 2019;
	declare j int default 1;
	# while循环 do相当于java中的‘{’ end while相当于java中的‘}’
	while(i<2022) do
		while(j<13) do
			# 查询插入语句,并根据country和sector分组
			insert into cm_mount(country,sector,date,co2)
			select country,sector,concat(cast(i as char),'/',cast(j as char)),sum(co2)
			from cm19_21 where date like concat(cast(i as char),'/',cast(j as char),'/%')
			group by country,sector;
			# 更新变量的值
			set j=j+1;
		end while;
		set i=i+1;
		set j=1;
	end while;
# 结束该procedure
end;
# 回车结束,使用可视化工具的可以不用写
$$
# 换回原来的结束符
delimiter ;
# 调用该procedure
call select_mount();
# 删除该procedure
drop procedure select_mount;

结果如下:
在这里插入图片描述

大功告成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值