正常where IN 字符串的时候会有问题
但是我们经常会有一个字段中存了好几个甚至一堆的值 ,例如 字段IDes(字符串类型)里面存了100,200,300,400
此时 FIND_IN_SET 就能解决我们这个棘手的问题了
用法如下
SELECT A.Name FROM `t_personal` A WHERE FIND_IN_SET( A.ID , '1,2,3,4,5')
SELECT * FROM test_0 where find_in_set('女',t_sex);
查询t_personal表中ID等于 1,2,3,4,5的数据
sql 为空不做查询条件
select * from usertable where 1=1 and (name=@name or @name='') and (page=@page or @page='')
插入数据没有返回主键id
<insert id="add" parameterType="EStudent" useGeneratedKeys="true" keyProperty="id">
insert into TStudent(name, age) values(#{name}, #{age})
</insert>
设置null 为0
SELECT COALESCE(NULL, …一长串NULL…,NULL, 0);
返回值0
分组条件:
select ocsp.ocsp_code,ocsp.ocs_id from order_contract_stockup_purchase
ocsp GROUP BY ocsp.ocsp_code,ocsp.ocs_id
查询重复数据只去一条数据:DISTINCT
处理null字段: SELECT IF(AVG(字段) IS NULL,0, 字段) as 重命名 From xxx
处理时间:DATE_FORMAT( sas.create_date, ‘%Y-%m-%d’ )
if语句判断传入参数是否存在
<if test="dbName != null and dbName != ''">
and d.name like #{dbName}
</if>
MySQL 获得当前日期时间 函数
获得当前日期+时间(date + time)函数:now()
Mysql语句模糊查询字符串:
like concat('%',@word,'%')
MySQL对sum()字段 进行条件筛选,使用having,不能用where
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。
相反,having子句可以让我们筛选成组后的各组数据
AND DATE_FORMAT( ocs.create_date, '%Y-%m-%d %H:%i:%S' )
BETWEEN #{criteriaVo.value} AND #{criteriaVo.endValue}
AND DATE_FORMAT( ocs.create_date, '%Y-%m-%d' )
BETWEEN #{criteriaVo.value} AND DATE_ADD(#{criteriaVo.endValue},INTERVAL 1 DAY)
BETWEEN DATE_FORMAT(#{criteriaVo.value},'%y-%m-%d %H:%i')
and DATE_ADD(DATE_FORMAT(#{criteriaVo.endValue},'%y-%m-%d %H:%i'),INTERVAL 1 MINUTE)
and so.pick_date BETWEEN DATE_FORMAT(#{criteriaVo.value},'%y-%m-%d')
and DATE_ADD(DATE_FORMAT(#{criteriaVo.endValue},'%y-%m-%d'),INTERVAL 1 DAY)
AND pcb.pcb_number like concat('%',#{criteriaVo.value},'%')
<if test="criteriaVo.column == 'purchaseTotal'">
<if test="criteriaVo.expression == 'eq'">
and pcb.purchase_total = #{criteriaVo.value}
</if>
<if test="criteriaVo.expression == 'gt'">
and pcb.purchase_total > #{criteriaVo.value}
</if>
<if test="criteriaVo.expression == 'ge'">
and <![CDATA[pcb.purchase_total >= #{criteriaVo.value}]]>
</if>
<if test="criteriaVo.expression == 'lt'">
and <![CDATA[pcb.purchase_total < #{criteriaVo.value}]]>
</if>
<if test="criteriaVo.expression == 'le'">
and <![CDATA[pcb.purchase_total <= #{criteriaVo.value}]]>
</if>
</if>
截取首字母:
这里有一个明显的边缘情况,如果休假名称应包含两个以上的术语,则应该发生这种情况.我假设您只需要前两个单词的缩写,而不管出现多少个.
SELECT
CASE WHEN INSTR(leave_name, ' ') > 0 THEN
CONCAT(LEFT(leave_name, 1),
SUBSTRING(leave_name, INSTR(leave_name, ' ') + 1, 1))
ELSE LEFT(leave_name, 1) END AS initials
FROM yourTable;
当只出现一个单词时,我还增加了一个边缘情况的覆盖范围.在这种情况下,我们只取单词的首字母.
定位排序的行数