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语句
下面就实现一下上述功能
delimiter $$
create procedure select_mount()
begin
declare i int default 2019;
declare j int default 1;
while(i<2022) do
while(j<13) do
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;
end;
$$
delimiter ;
call select_mount();
drop procedure select_mount;
结果如下:
大功告成!
|