1.将查询指定字段插入另一个表中指定的字段中
2.mysql实现将查询出的两个字段合并成为一个字段
3.mysql中将系统时间转化成指定格式的字符串—DATE_FORMAT
4.mysql查询日期之间差–DATEDIFF
5.按照位数进行截取–LEFT
6.mysql中查询昨天是否有数据(查询近几天内的数据)–TO_DAYS
7.mysql中将查询的结果更新到数据库并进行增加
8.mysql中的ifnull 以及if(xxx is null,0,xxx)失效的问题(对于查询结果为空的返回0)
9.mysql中查询时间(只获取当前年月日、当前时分秒)
10.mysql表中字段与关键字冲突处理
11.mysql分组并查询每组中新的记录
12.mysql中YEARWEEK()
13.mysql中DATE_ADD()和DATE_SUB()
14.mysql中if标签用于控制查询条件是否显示
15.mysql中根据多种条件进行统计总数
16.mysql中group分组,由于分组字段不存在数据导致查询所有失败问题处理
17.myBatis中大于小于等于
18.mysql中字段为关键字导致更新失败问题
19.mysql按照指定符号截取
格式:
insert into 目标表 (目标表中需要插入的字段) select 查询要插入指定的字段 form 源表(可以按照条件查询)
INSERT INTO wy_pic(thumb,image,data_id,create_time)SELECT image,pics,id,NOW() FROM
wy_course WHERE status
= 2
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d1fedc31fa179d2a6a4941ea03cdb942.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2938b23c35f549e284c1e1c167ebc914.png)
DATE_FORMAT(created_date,'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d')
场景:查询2019-12月份的数据
SELECT * FROM wy_punch_clock WHERE user_id='462839317' AND DATE_FORMAT(clock_time, '%Y-%m') = '2019-12' ORDER BY clock_time ASC
DATEDIFF() 函数返回两个日期之间的天数。
场景: 查询昨天的数据
SELECT * FROM `wy_course_train_body_data` WHERE DATEDIFF(NOW(),create_time) = 1 AND user_id='776106470489135';
DATEDIFF(NOW(),create_time) 表示是当前时间减去create_time代表的时间之间的天数.
场景:将字符串:2020-02-21截取到年月份
SELECT LEFT('2020-02-21', 7)
7表示截取的位数,从左边数.
查询指定日期的昨天是否有数据
SELECT COUNT(1) FROM wy_punch_clock WHERE TO_DAYS(NOW()) - TO_DAYS(clock_time) = 1 AND user_id='776106470489135'
clock_time表示是表中的时间字段;
TO_DAYS(time)表示是从0年0月0日到time表示的年月日之间的天数,如果time中有时分秒则不计.
示例:
TO_DAYS(NOW()) - TO_DAYS(clock_time) <= 值 ,可以表示查询指定天数内的内容,具体的天数由day指定,如果是等于号,表示的是查询指定天数的内容
场景:
用户签到之后添加6积分到用户详情表中的总积分字段中
UPDATE wy_client_user_summary SET
integral_count = integral_count + (SELECT integral_count FROM integral_rule WHERE id=1) WHERE user_id=1700;
注意:
(SELECT integral_count FROM integral_rule WHERE id=1)中表示是查询的要签到获取的积分数;
integral_count = integral_count +6表示是每次执行更新语句就会加6个积分
使用上面两个函数的前提是数据库中对应的字段的值为null;而不是查询成数据为空;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/101011bb5525eb86cace803faf8d85ad.png)
场景描述:如果用户7761064704891351的type=2有数据,则查询出最近的medal_day数据;如果没有则查询数据返回0;sql如下:
SELECT
CASE
WHEN (SELECT COUNT(medal_day) FROM wy_course_train_medal_log WHERE login='776106470489135' AND TYPE=2 )=0
THEN 0
ELSE
(SELECT medal_day FROM wy_course_train_medal_log WHERE login='7761064704891351' AND TYPE=2 ORDER BY create_time DESC LIMIT 1 )
END
如果wy_course_train_medal_log表中查询medal_day的总数等于0,则返回0;否则返回login=‘776106470489135’ AND TYPE=2 这种条件查询出来的时间最新的medal_day数
– 获取当前时间,具体到天
SELECT CURDATE()
– 获取当前时间,只保留时分秒
SELECT CURTIME()
– 获取当前时间
Select now()
查询sql中的与关键字冲突的表字段添加引号(键盘上Tab上面那个引号)
思路:分组使用group by ,查询每组中最新的,按照插入记录(自增id记录),就是查询每组最大的id或是直接查询最大的创建时间,示例:
按照卡号分组并查询最新的一条请假记录数据
SELECT MAX(id),card_no FROM manage_staff_card_record WHERE TYPE=1 GROUP BY card_no ORDER BY leave_start_time DESC
YEARWEEK(date, mode),参数说明
1、date是要获取周数的日期
2、mode是一个可选参数,用于确定周数计算的逻辑;0表示以周天作为每周的第一天(默认为0);1表示周一作为每周的第一天.
DATE_ADD(date,INTERVAL expr type): 函数向日期添加指定的时间间隔。
1.date 参数是合法的日期表达式。
2.expr 参数是添加的时间间隔。
type 常用支持参数如下:SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、YEAR等。
DATE_SUB(date,INTERVAL expr type): 函数向日期减少指定的时间间隔。参数类型同上。
经常使用if标签用于where后面是否用作查询条件,实际上可以使用if标签控制select后面的查询字段是否显示.
SELECT manage_course.course_name,manage_course.count,manage_course.level,manage_course.time,manage_course.color
<if test="courseId != '' and courseId != null">
,manage_course_account.account
</if> FROM manage_course
LEFT JOIN manage_course_account ON manage_course_account.course_id=manage_course.id
select id,
count(case when 条件1 then 1 else 0 end) as count1,
count(case when 条件2 then 1 else 0 end) as count2,
sum(case when 条件3 then 1 else 0 end) as count3
from 表名
group by id
注意,then 1 else 0为固定写法.为1表示符合条件然后按照条件统计总数.为0表示不符合条件,不进行统计总数,别名返回0.
另一种方式:
SELECT
count(if(字段=1,true,null)) AS count1,
count(if字段=2,true,null)) AS count2
FROM 表名
WHERE 其他条件
注意,true,null为固定写法.true表示符合条件然后按照条件统计总数.为false表示不符合条件,不进行统计总数,别名返回0.
使用场景:现有一课程预约记录查询需求,需要查询出预约记录列表,并统计预约状态为预约成功人数(status=3),以及签到人数(预约状态为签到status=4).
SELECT course.*,
COUNT(case when course_record.`status`=3 then 1 else null end) sign_count,
COUNT(CASE WHEN course_record.`status` IN =4 THEN 1 ELSE null END) apply_count
FROM manage_course
LEFT JOIN manage_course_record ON course.id=course_record.`data_id` GROUP BY course_record.`data_id`
group by进行分组处理时,对于为null的记录进行分组不会查询出对应的记录信息,对于此类问题需要重新指定分组字段.
场景说明:
查询日课程表信息,并按照课程预约记录进行分组,统计对应的预约人数(对于没有预约的课程信息,预约人数需要保证为0)
SELECT course.*, COUNT(1) apply_count
from course LEFT JOIN manage_course_record ON course.id=course_record.`data_id` GROUP BY IFNULL(manage_course_record.`data_id`,course.id)
原符号 < <= > >= & ’ "
替换符号 < <= > >= & ' "
将字段上使用table键上面的反双引号即可.示例(form为关键字):
UPDATE order_details SET `form`=2,last_modified_date=NOW() WHERE num='Y00093701' AND logo='235'
substring(string, position, length) 参数一:string指的是需要截取的原字符串;
参数二:position指的是从哪个位置开始截取子字符串;
参数三:length指的是需要截取的字符串长度,如果不写,则默认截取从position开始到最后一位的所有字符;
LOCATE(str1,str2)
判断字符串(str2)中是否包含另一个字符串(str1)。如果包含则返回str1在str2中出现的位置,如果不包含则返回0。
场景说明:
现在有省市区地址信息,现在需要截取中间的地市信息.
SELECT address FROM manage_studio WHERE STATUS=1 ORDER BY create_time ASC
处理方式:
按照第一个空格和第二个空格进行截取中间的地市信息
SELECT TRIM(SUBSTRING(address,LOCATE(' ', address),LOCATE(' ', address,LOCATE(' ', address)))) FROM manage_studio WHERE STATUS=1 ORDER BY create_time ASC