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;
结果如下:
大功告成!