mysql常用函数使用场景总结(持续更新)

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按照指定符号截取

1.将查询指定字段插入另一个表中指定的字段中

格式:
    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

2.mysql实现将查询出的两个字段合并成为一个字段–CONCAT_WS

在这里插入图片描述
3.mysql中将系统时间转化成指定格式的字符串—DATE_FORMAT

在这里插入图片描述

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

4.mysql查询日期之间差–DATEDIFF

DATEDIFF() 函数返回两个日期之间的天数。
场景: 查询昨天的数据

SELECT * FROM `wy_course_train_body_data` WHERE DATEDIFF(NOW(),create_time) = 1 AND user_id='776106470489135';

    DATEDIFF(NOW(),create_time) 表示是当前时间减去create_time代表的时间之间的天数.

5.按照位数进行截取–LEFT

场景:将字符串:2020-02-21截取到年月份

SELECT LEFT('2020-02-21', 7)

7表示截取的位数,从左边数.

6.mysql中查询昨天是否有数据(查询近几天内的数据)–TO_DAYS

查询指定日期的昨天是否有数据

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指定,如果是等于号,表示的是查询指定天数的内容

7.mysql中将查询的结果更新到数据库并进行增加

场景:
用户签到之后添加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个积分

8.mysql中的ifnull 以及if(xxx is null,0,xxx)失效的问题(对于查询结果为空的返回0)

使用上面两个函数的前提是数据库中对应的字段的值为null;而不是查询成数据为空;
在这里插入图片描述

场景描述:如果用户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数

9.mysql中查询时间(只获取当前年月日、当前时分秒)

– 获取当前时间,具体到天

SELECT CURDATE()

– 获取当前时间,只保留时分秒

SELECT CURTIME()

– 获取当前时间

Select now()

10.mysql表中字段与关键字冲突处理

查询sql中的与关键字冲突的表字段添加引号(键盘上Tab上面那个引号)

11.mysql分组并查询每组中新的记录

思路:分组使用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 

12.mysql中YEARWEEK()

YEARWEEK(date, mode),参数说明
    1、date是要获取周数的日期
    2、mode是一个可选参数,用于确定周数计算的逻辑;0表示以周天作为每周的第一天(默认为0);1表示周一作为每周的第一天.

13.mysql中DATE_ADD()和DATE_SUB()

DATE_ADD(date,INTERVAL expr type): 函数向日期添加指定的时间间隔。
    1.date 参数是合法的日期表达式。
    2.expr 参数是添加的时间间隔。
type 常用支持参数如下:SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、YEAR等。
DATE_SUB(date,INTERVAL expr type): 函数向日期减少指定的时间间隔。参数类型同上。

14.mysql中if标签用于控制查询条件是否显示

经常使用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

15.mysql中根据多种条件进行统计总数

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`

16.mysql中group分组,由于分组字段不存在数据导致查询所有失败问题处理

    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)

17.myBatis中大于小于等于

原符号 < <= > >= & ’ "

替换符号 &lt; &lt;= &gt; &gt;= &amp; &apos; &quot;

18.mysql中字段为关键字导致更新失败问题

将字段上使用table键上面的反双引号即可.示例(form为关键字):

UPDATE order_details SET `form`=2,last_modified_date=NOW() WHERE num='Y00093701' AND logo='235'

19.mysql按照指定符号截取

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

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卖柴火的小伙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值