idea中的xml文件中几个常用的sql语句
1,模糊搜索
<if test="keyword != null and keyword != ''">
AND “你的变量” LIKE CONCAT('%',#{包含的值},'%') </if>
2,正则判断字符串获取最大值
SELECT
max(r.number)
FROM
表名 r
WHERE
r.is_deleted = '0'
AND (r.number REGEXP '[^0-9.]') = 0
AND length(r.number) = 10
3,分组排序
select a.reporting_id,count(*) from 表名 a group by a.reporting_id order by count(*) desc;
select a.number,count(*) from 表名 a group by a.number order by count(*) desc;
4,简单的查表
可能是根据id获取:
model名字 secret = baseInfoService.getModelById(dto的名字.getReportingSecretId());
然后直接只用即可,我把他们放到了一个map了
lindkedOneMap.put("secret", secret == null?"":secret.getName());
也可能是根据modle获取:
new一个,赋值,把modle放进去
model名字 sysCode = new model名字();
sysCode.setCode(DTO名字 .getReportingMethodCode());
sysCode.setDeleted(false);
sysCode = sysCodeService.getModelByModel(sysCode);
5,增加一个特殊条件
从1到17位,包含 XXX 的:
AND 'XXX ' = SUBSTR(获取的字段名 FROM 1 FOR 17)
6,按照时间段查找
10到20天的
DATE_SUB(CURDATE(), INTERVAL 20 DAY) <= sc.process_time
AND DATE_SUB(CURDATE(), INTERVAL 10 DAY) >= sc.process_time
7,使用union时
(1)两个或者多个联合是,查找的字段要一致
(2)如果需要求和,需要调用函数 SUM(s.count),里面的就是需要求和的字段。
8,group by
就是对查出的数据进行分组,如果需要进行求和的话。需要增加函数count。
9 ,count() 和 sum() 的区别
count()是算行数的,sum是求和的
(1)count()是求一列中有多少行。通常和group by一起使用
(2)sum是求和,把一列中的数字相加。注意的是,这一列必须都是数字,否则无法相加。
10,间隔时间的选择
(1)A-B 的时间为 10-20 (2)我们的时间为三种:1-11,11-12,12-21,1-30 交叉时间。
无论是那种时间:(2)下面的开始时间<(1)的结束时间 and (2)的结束时间>(1)的开始时间
11,截取字符串
select left(字段,8),right(字段,4) from 表 left表示从左边截取,里面的8表示到第几位。right反之
12,查询时把某个字段结合,以“,”分开
SELECT
pro.problem_code proCode,
GROUP_CONCAT(rep.reporting_id) reportingIds,
COUNT(0) amount
FROM
表名 rep
INNER JOIN 表名 pro ON 条件
AND 条件
GROUP BY
字段
主要用到的方法: GROUP_CONCAT(rep.reporting_id) ,就是把rep.reporting_id以都要结合在一起
注释:如果需要去重的时候,可以加上 distinct GROUP_CONCAT(distinct lev.reportingIds) reportingIds
就可以把里面重复的数据去掉。
13,把三行转成一行
SELECT
a.reporting_id,
max(case b.problem_code when '字段名1' then b.problem_code else '' end) as probemcode1,
max(case b.problem_code when '字段名2' then b.problem_code else '' end) as probemcode2,
max(case b.problem_code when '字段名3' then b.problem_code else '' end) as probemcode3
FROM
表名 a
LEFT JOIN 表名 b on a.reporting_id = b.reporting_id
WHERE
a.reporting_id = '71f30da545a943e7a23803461514b399'
group by a.reporting_id
正常来说,如果不加聚合函数,那么显示的只有一条数据。如果不加 group by 那么显示三条。达不到预期的效果。加了聚合函数。就能把三行变成一行。
14,根据时间判断是第几季度
select QUARTER('2019.09.02') from dual;
15,
字符串截取之 substring_index
substring_index(str,delim,count)
str:要处理的字符串
delim:分隔符
count:计数
例子:str=
www.wikibt.com
substring_index(str,'.',1)
结果是:www
substring_index(str,'.',2)
结果是:
www.wikibt
也就是说,如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容
相反,如果是负数,那么就是从右边开始数,第N个分隔符右边的所有内容,如:
substring_index(str,'.',-2)
结果为:
wikibt.com
有人会问,如果我要中间的的wikibt怎么办?
很简单的,两个方向:
从右数第二个分隔符的右边全部,再从左数的第一个分隔符的左边:
substring_index(substring_index(str,'.',-2),'.',1);
16,某一个字段是否包含一个字段
select * from
表名a
where
instr(a.problem_code,'字段名') > 0