【SQL】OR的含义

作者:Leopold    访问量:10

select * from school where class=1 and (sex like 男 or birthday like 1);
or在括号里面,结果集是班级1后再加过滤条件是男生或生日在1月份得到的;

select * from school where class=1 and sex like 男 or birthday like 1;
or在括号外面,结果集是班级1加是男生过滤得到的结果,与过滤条件是生日在1月份得到的结果合并在一起

总结:

  • or有括号限制的表示字段的“或者”
  • or没有括号限制表示or后条件结果的并集

【Mybatis】常用标签

作者:Leopold    访问量:13

1 foreach

主要用于拼接where子句后的In,少用Java来手动拼接分隔符。

List<Long> selectKpointIdByIds(@Param("kpointIds") List<Long> kpointIds);
SELECT
            epq.kpoint_id
        FROM
            edu_pop_question epq
        WHERE
            epq.kpoint_id IN
            <foreach collection="kpointIds" item="id" open="(" close=")" separator=",">
                #{id,jdbcType=BIGINT}
            </foreach>
        GROUP BY
            epq.kpoint_id ;
``

【MySQL】函数总结

作者:Leopold    访问量:5

★ CONCAT_WS

  • 语法:CONCAT_WS(separator,str1,str2,...)
  • 示例:CONCAT_WS(',',1,2,3)
  • 结果:1,2,3
  • 解释:连接字符串并拼接
  • Java替换:
    尽量使用MyBatis标签解决,其中kpointIds为List<Long>集合,存储需要分割的数字。
<foreach collection="kpointIds" item="id" open="(" close=")" separator=",">
    #{id,jdbcType=BIGINT}
</foreach>

★ FIND_IN_SET

  • 语法:FIND_IN_SET(str,strlist)
  • 示例:FIND_IN_SET('8',t.grade)
  • 解释:更精准的like
    有如下表:
idmathgrade
1高数A100,98,70
2高数B88,69,8

想查询出grade中含有’8’的成绩。比如:

idmathgrade
2高数B88,69,8

如果使用like子句查询,查询结果并不是按照逗号分割like,例如查询语句如下:

SELECT
	* 
FROM
	`test_find_in_set` t 
WHERE
	t.grade LIKE '%8%';

查询结果为:

idmathgrade
1高数A100,98,70
2高数B88,69,8

使用FIND_IN_SET的查询如下:

SELECT
	* 
FROM
	`test_find_in_set` t 
WHERE
	FIND_IN_SET('8',t.grade) ;

结果如下:

idmathgrade
2高数B88,69,8

★ GROUP_CONCAT

  • 语法:GROUP_CONCAT(expr)
  • 示例:
 SELECT
  g.`name`,
	GROUP_CONCAT(g.math)
FROM
	grade g
GROUP BY
	g.`name`

结果:

nameGROUP_CONCAT(g.math)
A95,100,90
B90,100,77

解释:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

  • 延申:
SELECT
  g.`name`,
	GROUP_CONCAT(g.math order by g.math desc SEPARATOR '_')
FROM
	grade g
GROUP BY
	g.`name`

结果:

nameGROUP_CONCAT(g.math)
A100_95_90
B100_90_77

解释:可先对GROUP_CONCAT的内容排序并更换分隔符。

★ LPAD

  • 语法:LPAD(str,len,padstr)
  • 示例:select LPAD('123',5,3)
  • 结果:33123
  • 解释:填充字符串左边
  • Java替换:
private String lpad(String str) {
    return String.format("%04d", Integer.parseInt(str));
}

原理:0表示转换符,4表示总位数

【数据库】基础

作者:Leopold    访问量:12

1 细节问题

  • UUID36位的数字、字母和 “” 。使用UUID生成的主键唯一(时间戳不行,毫秒可能一样)。“”去掉后剩余32位。由随机数、时间和当前硬件的出场编码做散列运算。int整形以后就不要用了,会降低程序执行的性能。因为在每一次查询时都需要遍历表中所有记录,查询最大的id值。一般不用整形来做主键,而是用字符串当作主键。

继续阅读【数据库】基础