Mysql常用函数整理

/ Database / 没有评论 / 260浏览
欢迎关注微信公众号:程序员小圈圈
原文首发于:www.zhangruibin.com
本文出自于:RebornChang的博客
转载请标明出处^_^

Mysql常用函数

最近用数据库比较多,之前没太关注函数这块儿,现在补补,mysql函数还是比较强大的,可以实现很多东西,有兴趣的小伙伴可以学习下~ 以下为笔者整理的常用函数,包含字符串操作、日期操作、数字操作等,相对于mysql操作文档,笔者整理的只是一部分,有兴趣的可以自行挖掘~

日期函数

ADDDATE(d,n)

计算起始日期 d 加上 n 天的日期

ADDTIME(t,n)

时间 t 加上 n 秒的时间

DATEDIFF(d1,d2)

计算日期 d1->d2 之间相隔的天数

DATE_ADD(d,INTERVAL expr type)

计算起始日期 d 加上一个时间段后的日期

DATE_FORMAT(d,f)

按表达式 f的要求显示日期 d

DATE_SUB(date,INTERVAL expr type)

函数从日期减去指定的时间间隔。

DAYNAME(d)

返回日期 d 是星期几,如 Monday,Tuesday

DAYOFMONTH(d)

计算日期 d 是本月的第几天

DAYOFWEEK(d)

日期 d 今天是星期几,1 星期日,2 星期一,以此类推

DAYOFYEAR(d)

计算日期 d 是本年的第几天

EXTRACT(type FROM d)

从日期 d 中获取指定的值,type 指定返回的值。 type可取值为:

LAST_DAY(d)

返回给给定日期的那一月份的最后一天

STR_TO_DATE(string, format_mask)

将字符串转变为日期:SELECT STR_TO_DATE("August 10 2020", "%M %d %Y"); -> 2020-08-10

SUBDATE(d,n)

日期 d 减去 n 天后的日期

YEARWEEK(date, mode)

返回年份及第几周(0到53),mode 中 0 表示周天,1表示周一,以此类推

TIMESTAMPDIFF

Mysql日期差函数,Mysql选择两个日期字段相差大于或小于一定时间

SELECT *  from  table  where  TIMESTAMPDIFF(type,pretime,latertime)>100;

TIMESTAMPDIFF函数,需要三个参数,type是比较的类型,可以比较FRAC_SECOND、SECOND、 MINUTE、 HOUR、 DAY、 WEEK、 MONTH、 QUARTER或 YEAR几种类型,pretime是前一个时间,比较时用后一个时间减前一个时间

date_format time_format

加入你有那么一个时间字符串,比如:20200601140113,想给他转化成时间的,那就这么写:

select
  date_format(a.orderTime,'%Y%m%d %H:%i:%s') from xxx;

select
  time_format(a.orderTime,'%H:%i:%s') from xxx;

那结合一下,假如我数据库存的时间是纯数字的字符串(verchar2)格式的字段,我又想筛选两张表两个字段时间差值为N分钟以内的数据,那我可以这么写:

select
  date_format(a.orderTime,'%Y%m%d %H:%i:%s')
  from qx a left join qypt b
  on a.phone = b.phone 
  and  timestampdiff(minute ,date_format(a.orderTime,'%H:%i:%s'),date_format(b.createDate,'%H:%i:%s')) < 2;

字符串函数

TRIM(S) LTRIM(s) RTRIM(s)

LTRIM(s) 去掉字符串 s 开始处的空格,RTRIM(s) 去掉后面空格,TRIM(s)去掉两端空格 ,比如一个列字段的值,里面有那么几个字段在字段的开始处多了一个空格,然后你拿这个字段去跟其他表关联的时候就会会因为这个空格从而关联失败,此时用LTRIM(s)就可以很好的解决问题,比如:

select a.type 类型名称,sum(b.groupCount) 单数,b.date 日期
  from a
  left join b
  on LTRIM(a.qyName) = LTRIM(b.qyName) where  b.date like '%20200607%' group by a.type,b.date

截取字符串

如果有一个字符串,形如:20200601135320,那么不同的截取字符串的方法得到的效果也不一样。

substr(s,)

select substr(orderTime,1,12) from XXX; 结果为:202006011353

MID(s,n,len)

SELECT MID("20200601135320", 2, 3) 结果为:020

SUBSTR(s, start, length)

从字符串 s 的 start 位置截取长度为 length 的子字符串

SUBSTRING(s, start, length)

从字符串 s 的 start 位置截取长度为 length 的子字符串

SUBSTRING_INDEX(s, delimiter, number)

返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。 如果 number 是正数,返回第 number 个字符左边的字符串。 如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。

REPLACE(s,s1,s2)

将字符串 s2 替代字符串 s 中的字符串 s1,比如要将abc字符串的b替换成z,则这么写: SELECT REPLACE('abc','a','z');

REVERSE(s)

将字符串s的顺序反过来,abc变成cba.

STRCMP(s1,s2)

比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1

将字符串转换为大写

UPPER(s)

UCASE(s)

数字函数

ABS(x)

返回数字的绝对值

CEIL(x)

返回大于或等于 x 的最小整数

CEILING(x)

返回大于或等于 x 的最小整数 

COUNT(expression)

返回查询的记录总数,expression 参数是一个字段或者 * 号

FLOOR(x)

返回小于或等于 x 的最大整数

GREATEST(expr1, expr2, expr3, ...)

返回列表中的最大值

LEAST(expr1, expr2, expr3, ...)

返回列表中的最小值

MAX(expression)

返回字段 expression 中的最大值

MIN(expression)

返回字段 expression 中的最小值

RAND()

返回 0 到 1 的随机数

SUM(expression)

返回指定字段的总和

高级函数

case when ...end

CASE expression WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... WHEN conditionN THEN resultN ELSE result END

CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。

CAST(x AS type)

转换数据类型

CURRENT_USER()

返回当前用户

IF(expr,v1,v2)

类似三目运算非此即彼: 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。

IFNULL(v1,v2)

如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。

ISNULL(expression)

判断表达式是否为 NULL

LAST_INSERT_ID()

返回最近生成的 AUTO_INCREMENT 值