MySQL函数


使用的表结构

CREATE TABLE `cuser` (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `user_name` varchar(20) NOT NULL COMMENT '用户名',
  `password` varchar(100) NOT NULL COMMENT '密码',
  `phone` varchar(20) NOT NULL COMMENT '手机号',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `id_card` varchar(30) DEFAULT NULL COMMENT '身份证号码',
  `birthday` date NOT NULL COMMENT '生日',
  `sex` tinyint(1) NOT NULL COMMENT '性别:1男、0女',
  `nick_name` varchar(50) DEFAULT NULL COMMENT '昵称',
  `head_picture` varchar(255) DEFAULT NULL COMMENT '头像',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0禁用、1启用',
  `last_login_ip` varchar(100) DEFAULT NULL COMMENT '最后登录IP',
  `last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
  `crt_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `upt_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='C端用户表';

字符串函数

函数描述示例结果
FIELD(s,s1,s2…)字符串s在字符串列表s1,s2…中的位置
不存在时值为0
SELECT FIELD('c', 'a', 'b', 'c');3
FIND_IN_SET(s,s1)字符串s在字符串列表s1的位置
s1为逗号隔开的字符串,不存在时值为0
SELECT FIND_IN_SET('c', 'a,b,c');3
CONCAT(s1,s2…sn)合并字符串SELECT CONCAT('a','b','c');abc
CONCAT_WS(x, s1,s2…)合并字符串,分隔符为xSELECT CONCAT_WS('-','a','b');a-b
RPAD(s1,len,s2)字符串s1的结尾处添加字符串s2,使字符串的长度达到 lenSELECT RPAD('abc',10,'123');abc1231231
REPEAT(s,n)字符串s重复n次SELECT REPEAT('abc',3);abcabcabc
SPACE(n)返回n个空格SELECT SPACE(10);10个空格
LEFT(s,n)截取,截取字符串s的前n个字符SELECT LEFT('abc',2);ab
RIGHT(s,n)截取,截取字符串s的后n个字符SELECT RIGHT('abc',2);bc
MID(s,n,len)截取,从字符串s的n位置截取长度为len的子字符串SELECT MID('abc',1,2);ab
SUBSTR(s, start, length)截取,从字符串s的start位置截取长度为length的子字符串SELECT SUBSTR('abc',1,2);ab
SUBSTRING(s, start, length)截取,从字符串s的start位置截取长度为length的子字符串SELECT SUBSTRING('abc',1,2);ab
REPLACE(s,s1,s2)替换,字符串s中的子字符串s1替换为字符串s2SELECT REPLACE('abc','a','x');xbc
INSERT(s1,x,len,s2)替换,字符串s1的x位置开始长度为len的部分使用字符串使用s2替换SELECT INSERT('abd', 2, 1, '123');a123d
LTRIM(s)去空格,去掉字符串开始处的空格SELECT LTRIM(' abc');abc
RTRIM(s)去空格,去掉字符串结尾处的空格SELECT RTRIM('abc ');abc
TRIM(s)去空格,去掉字符串开始和结尾处的空格SELECT TRIM(' abc ');abc
LOCATE(s1,s)字串位置,字符串s1在字符串s中的位置(开始位置)SELECT LOCATE('c','abcde');3
POSITION(s1 IN s)字串位置,字符串s1在字符串s中的位置(开始位置)SELECT POSITION('c' IN 'abcde');3
LCASE(s)大小写转换,字母转为小写SELECT LCASE('aBc1');abc1
LOWER(s)大小写转换,字母转为小写SELECT LOWER('aBc1');abc1
UCASE(s)大小写转换,字母转为大写SELECT UCASE('aBc1');ABC1
UPPER(s)大小写转换,字母转为大写SELECT UPPER('aBc1');ABC1
REVERSE(s)字符串反转,返回与原始字符串顺序相反的字符串SELECT REVERSE('abc');cba
STRCMP(s1,s2)字符串比较,比较字符串s1和s2
s1=s2返回0
s1>s2返回1
s1<s2 返回-1
SELECT STRCMP('abc','ab');1
SUBSTRING_INDEX(s, delimiter, number)返回从字符串s的第number个出现的分隔符delimiter之后的子串。
number是正数,返回第number个字符左边的字符串。
number是负数,返回第(number的绝对值(从右边数))个字符右边的字符串。
SELECT SUBSTRING_INDEX('a*b','*',1);
SELECT SUBSTRING_INDEX('a*b','*',-1);
a
b

数值函数

函数描述示例结果
COUNT(expr)记录总条数,expr参数是一个字段、*、数值等SELECT COUNT(*) FROM cuser;6
SUM(expr)求和SELECT SUM(id) FROM cuser;21
AVG(expr)平均值SELECT AVG(id) FROM cuser;2.0
MAX(expr)最大值SELECT MAX(id) FROM cuser;6
MIN(expr)最小值SELECT MIN(id) FROM cuser;1
ABS(x)绝对值SELECT ABS(-1);1
x DIV y求商(整除),x为被除数,y为除数SELECT 11 DIV 5;2
MOD(x,y)求余,x除以y以后的余数SELECT MOD(11,5);1
EXP(x)次方,e的x次方SELECT EXP(2);7.38905609893065
POW(x,y)次方,x的y次方SELECT POW(2,3)8
POWER(x,y)次方,x的y次方SELECT POW(2,3)8
SQRT(x)平方根,x的平方根SELECT SQRT(4);2
LN(x)对数,x的自然对数,以e为底SELECT LN(2);0.6931471805599453
LOG(b,x)对数,x的自然对数,以为b底(没有b时,以e为底)SELECT LOG(2,8);3
LOG10(x)对数,x的自然对数,以10为底SELECT LOG10(100);2
LOG2(x)对数,x的自然对数,以2为底SELECT LOG2(16);4
CEIL(x)向上取整,大于或等于x的最小整数SELECT CEIL(1.5);2
CEILING(x)向上取整,大于或等于x的最小整数SELECT CEILING(1.5);2
FLOOR(x)向下取整,小于或等于x的最大整数SELECT FLOOR(1.5);1
ROUND(x)四舍五入取整,离x最近的整数SELECT ROUND(1.5);2
TRUNCATE(x,y)数值x保留到小数点后y位的值(与ROUND最大的区别是不会进行四舍五入)SELECT TRUNCATE(1.5,0);1
GREATEST(v1,v2,v3, …)列表中的最大值SELECT GREATEST(1,3,2);
SELECT GREATEST('滚','哈哈','嗯');
3
LEAST(v1,v2,v3, …)列表中的最小值SELECT LEAST(1,3,2);
SELECT LEAST('滚','哈哈','嗯');
1
哈哈
RAND()随机数, 0到1的随机数SELECT RAND();0.8001284439117913
SIGN(x)符号,x的符号,x是负数、0、正数分别返回-1、0和1SELECT SIGN(-5)-1
PI()圆周率SELECT PI();3.141593
DEGREES(x)弧度转换为角度SELECT DEGREES(PI());180
RADIANS(x)角度转换为弧度SELECT RADIANS(180);3.141592653589793
SIN(x)正弦值(x为弧度)SELECT SIN(RADIANS(90));1
COS(x)余弦值(x为弧度)SELECT COS(RADIANS(0));1
TAN(x)正切值(x为弧度)SELECT TAN(RADIANS(45));0.9999999999999999
COT(x)余切值(x为弧度)SELECT COT(RADIANS(45));1.0000000000000002
ASIN(x)反正弦值(x为弧度)SELECT ASIN(RADIANS(0));0
ACOS(x)反余弦值(x为弧度)SELECT ACOS(RADIANS(45));0.6674572160283838
ATAN(x)反正切值(x为弧度)SELECT ATAN(RADIANS(45));0.6657737500283538
ATAN2(n, m)反正切值SELECT ATAN2(0,1);0

注意:

  • 弧度与角度关系:
    • 一周的弧度数为2π
    • 2π弧度=360°角
    • 1弧度约为57.3°,即57°17’44.806’’
    • 1°为π/180弧度,近似值为0.01745弧度
    • 周角为2π弧度,平角为π弧度,直角为π/2弧度。

日期函数

函数描述示例结果
ADDDATE(d,n)起始日期(或日期时间)d加n天的日期SELECT ADDDATE('2021-06-15',-10);2021-06-05
ADDDATE(d,INTERVAL n unit)起始日期(或日期时间)d加n个单位的日期(或日期时间)
SELECT ADDDATE('2021-06-15', INTERVAL -10 DAY);2021-06-05
DATE_ADD(d,INTERVAL n unit)起始日期(或日期时间)d加n个单位的日期(或日期时间)SELECT DATE_ADD('2021-06-15', INTERVAL -10 DAY);2021-06-05
DATE_SUB(d,INTERVAL n unit)起始日期(或日期时间)d减n个单位的日期(或日期时间)SELECT DATE_SUB('2021-06-15', INTERVAL 10 DAY);2021-06-05
ADDTIME(t,n)时间t加上时间表达式n(n为秒时不能超过59)SELECT ADDTIME('2021-01-01 11:11:11', 59);
SELECT ADDTIME('2021-01-01 11:11:11', '02:00:00');
2021-01-01 11:12:10
2021-01-01 13:11:11
CURDATE()当前日期SELECT CURDATE();2022-02-10
CURRENT_DATE()当前日期SELECT CURRENT_DATE()2022-02-10
CURTIME()当前时间SELECT CURTIME();19:59:02
CURRENT_TIME当前时间SELECT CURRENT_TIME();19:59:02
LOCALTIME()当前日期和时间SELECT LOCALTIME();2022-02-10 19:59:06
LOCALTIMESTAMP()当前日期和时间SELECT LOCALTIMESTAMP();2022-02-10 19:59:06
CURRENT_TIMESTAMP()当前日期和时间SELECT CURRENT_TIMESTAMP();2022-02-10 19:59:06
NOW()当前日期和时间SELECT NOW();2022-02-10 19:59:06
SYSDATE()当前日期和时间SELECT SYSDATE();2022-02-10 19:59:06
DATE(d)提取日期中的日期部分SELECT DATE('2022-01-02 00:00:01');2022-01-02
TIME(expr)提取时间部分SELECT TIME('2022-01-02 01:22:33');01:22:33
YEAR(d)提取日期中的年部分SELECT YEAR('2022-01-02 00:00:01');2022
MONTH(d)提取日期中的月部分SELECT MONTH('2022-01-02 00:00:01');1
DAY(d)提取日期中的日部分SELECT DAY('2022-01-02 00:00:01');2
HOUR(d)提取日期中的小时部分SELECT HOUR('2022-01-02 00:00:01');0
MINUTE(d)提取日期中的分钟部分SELECT MINUTE('2022-01-02 00:00:01');0
SECOND(d)提取日期中的秒部分SELECT SECOND('2022-01-02 00:00:01');1
MICROSECOND(d)提取日期中的微秒部分SELECT MICROSECOND('2022-01-02 00:00:01');0
TIME_FORMAT(t,f)按表达式f的要求显示时间tSELECT TIME_FORMAT('01:22:33','%h时%i分%s秒');01时22分33秒
TIME_TO_SEC(t)将时间 t 转换为秒SELECT TIME_TO_SEC('00:00:01')1
QUARTER(d)日期d是第几季节,返回 1 到 4SELECT QUARTER('2022-01-02 00:00:01');1
MONTHNAME(d)日期当中的月份名称,如:NovemberSELECT MONTHNAME('2022-01-02 00:00:01');January
DAYNAME(d)日期d是星期几,如 Monday,TuesdaySELECT DAYNAME('2022-11-11 23:11:11');Friday
DAYOFMONTH(d)日期d是本月的第几天SELECT DAYOFMONTH('2011-11-11 11:11:11')11
LAST_DAY(d)日期对的那一月份的最后一天SELECT LAST_DAY("2017-06-20");2017-06-30
DAYOFWEEK(d)日期d是星期几(索引位置),1星期日、2星期一,以此类推SELECT DAYOFWEEK('2011-11-11 11:11:11');6
WEEKDAY(d)日期d是星期几(索引位置),0星期一、1星期二,以此类推SELECT WEEKDAY('2011-11-11 11:11:11');4
WEEK(d)日期d是本年的第几个星期,范围是0到53SELECT WEEK('2011-11-11 11:11:11');45
WEEKOFYEAR(d)日期d是本年的第几个星期,范围是0到53SELECT WEEKOFYEAR('2011-11-11 11:11:11');45
YEARWEEK(date, mode)返回年份及第几周(0到53),mode 中 0 表示周天,1表示周一,以此类推
当mode没值时,默认mode=0,mode具体规则在下面有描述
SELECT YEARWEEK('2018-01-01');
SELECT YEARWEEK('2018-01-01',1);
201753
201801
DAYOFYEAR(d)日期d是本年的第几天SELECT DAYOFYEAR('2011-11-11 11:11:11')315
EXTRACT(unit FROM d)日期d中获取指定的值,unit指定返回的值。SELECT EXTRACT(MINUTE FROM '2022-2-11 12:05:26');5
FROM_DAYS(n)计算从0000年1月1日开始n天后的日期SELECT FROM_DAYS(777777);2129-06-25
TO_DAYS(d)计算日期d距离0000年1月1日的天数SELECT TO_DAYS('2129-06-25 01:01:01');777777
DATE_FORMAT(d,f)按表达式f的要求显示日期(或者时间、或者日期时间等)dSELECT DATE_FORMAT('2022-1-1 13:1:1','%H:%i');13:01
SEC_TO_TIME(s)将以秒为单位的时间 s 转换为时分秒的格式SELECT SEC_TO_TIME(23456);06:30:56
STR_TO_DATE(string, format_mask)字符串转变为日期,其中format_mask为string的格式SELECT STR_TO_DATE("2022/01/22", "%Y/%m/%d");2022-01-22
PERIOD_ADD(period, number)为年-月组合日期添加一个时段(月份)SELECT PERIOD_ADD(202203,-5);202110
PERIOD_DIFF(period1, period2)两个年-月组合之间的月份差值SELECT PERIOD_DIFF(202201,202203);-2
SUBDATE(d,n)日期d减去n天后的日期SELECT SUBDATE('2022-02-01 11:22:33', 1);2022-01-31 11:22:33
SUBTIME(t,n)时间t减去n秒的时间(n小于59)SELECT SUBTIME('2022-02-01 11:22:33',1);2022-02-01 11:22:32
MAKETIME(hour, minute, second)组合时间,参数分别为小时、分钟、秒SELECT MAKETIME(12, 35, 41);12:35:41
MAKEDATE(year, day-of-year)基于给定参数年份year和所在年中的天数序号day-of-year返回一个日期SELECT MAKEDATE(2022, 33);2022-02-02
TIMESTAMP(expr)日期或日期时间格式转为日期时间SELECT TIMESTAMP('2022-02-01 00:01');2022-02-01 00:01:00
TIMESTAMP(expr1,expr2)两个日期或日期时间格式时间相加后的日期时间SELECT TIMESTAMP('2022-02-01 00:00:01','01:01');2022-02-01 01:01:01
DATEDIFF(d1,d2)计算日期d1、d2 之间相隔的天数,d1-d2SELECT DATEDIFF('2022-01-02 0:0:1','2022-02-05 0');-34
TIMEDIFF(time1, time2)计算时间差,time1-time2,结果为时间格式。
值的范围:-838:59:59到838:59:59
SELECT TIMEDIFF('2022-01-05 0:2:1','2022-01-02 0:0:1');72:02:00
TIMESTAMPDIFF(unit,expr1,expr2)计算时间差,返回 expr2 − expr1 的时间差SELECT TIMESTAMPDIFF(DAY,'2022-02-01','2022-05-01');89

注意:

  • unit的取值

    含义
    MICROSECOND微秒
    SECOND
    MINUTE
    HOUR
    DAY
    WEEK星期
    MONTH
    QUARTER
    YEAR
    SECOND_MICROSECOND秒微秒
    MINUTE_MICROSECOND分微秒
    MINUTE_SECOND分秒
    HOUR_MICROSECOND时微秒
    HOUR_SECOND时秒
    HOUR_MINUTE时分
    DAY_MICROSECOND日微秒
    DAY_SECOND日秒
    DAY_MINUTE日分
    DAY_HOUR日时
    YEAR_MONTH年月
  • 日期格式

    格式描述
    %a缩写星期名
    %b缩写月名
    %c月,数值
    %D带有英文前缀的月中的天
    %d月的天,数值(00-31)
    %e月的天,数值(0-31)
    %f微秒
    %H小时 (00-23)
    %h小时 (01-12)
    %I小时 (01-12)
    %i分钟,数值(00-59)
    %j年的天 (001-366)
    %k小时 (0-23)
    %l小时 (1-12)
    %M月名
    %m月,数值(00-12)
    %pAM 或 PM
    %r时间,12-小时(hh:mm:ss AM 或 PM)
    %S秒(00-59)
    %s秒(00-59)
    %T时间, 24-小时 (hh:mm:ss)
    %U周 (00-53) 星期日是一周的第一天
    %u周 (00-53) 星期一是一周的第一天
    %V周 (01-53) 星期日是一周的第一天,与 %X 使用
    %v周 (01-53) 星期一是一周的第一天,与 %x 使用
    %W星期名
    %w周的天 (0=星期日, 6=星期六)
    %X年,其中的星期日是周的第一天,4 位,与 %V 使用
    %x年,其中的星期一是周的第一天,4 位,与 %v 使用
    %Y年,4 位
    %y年,2 位
  • mode参数含义

    mode值每周的第一天周数范围判断某周是否属于当年的周
    0周日0-53该周的周日必须属于今年
    1周一0-53该周必须有3天以上属于今年
    2周日1-53该周的周日必须属于今年
    3周一1-53该周必须有3天以上属于今年
    4周日0-53该周必须有3天以上属于今年
    5周一0-53该周的周一必须属于今年
    6周日1-53该周必须有3天以上属于今年
    7周一1-53该周的周一必须属于今年
  • mysql time类型范围:-838:59:59到838:59:59

其他函数

函数描述示例结果
ASCII(s)第一个字符的ASCII码SELECT ASCII('abc');
SELECT ASCII(12);
97
49
LENGTH(s)字节数SELECT LENGTH('哈哈');
SELECT LENGTH(12);
6
2
CHAR_LENGTH(s)字符数SELECT CHAR_LENGTH('哈哈');
SELECT CHAR_LENGTH(12);
2
2
CHARACTER_LENGTH(s)字符数SELECT CHARACTER_LENGTH('哈哈');
SELECT CHARACTER_LENGTH(12);
2
2
BIN(x)x的二进制编码SELECT BIN(15);11
BINARY s将字符串s转换为二进制字符串SELECT birthday FROM cuser WHERE birthday LIKE BINARY CONCAT('%','1995-08','%');1995-08-01
1995-08-02
1995-08-01
CAST(x AS type)转换数据类型SELECT CAST('2022-01-01 00:12:23' AS time);00:12:23
COALESCE(expr1, expr2,…)参数列表中的第一个非空表达式(从左向右)SELECT COALESCE(NULL,'aa',NULL,'bb');aa
CONNECTION_ID()唯一的连接IDSELECT CONNECTION_ID();5435
CONV(x,f1,f2)x从f1进制转换为f2进制SELECT CONV(20,10,2);10100
CASE expression
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    …
    WHEN conditionN THEN resultN
    ELSE result
END
CASE 表示函数开始,END 表示函数结束。
如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。
SELECT CASE CEIL(RAND()*10) WHEN 5 THEN ‘=5’ ELSE ‘!=5’ END;!=5
FOMRAT(X,D[,locale])格式化,将X进行格式化 “#,###.##”。
D:保留的小数位数;
locale:一个可选参数,用于确定千个分隔符和分隔符之间的分组。
SELECT FORMAT(10003.1425926,2);10,003.14
CONVERT(s USING cs)函数将字符串s的字符集变成csSELECT CONVERT('ABC' USING gbk);ABC
IF(expr,v1,v2)如果表达式expr成立,返回结果v1;否则,返回结果v2。SELECT IF(1 > 0,'正确','错误');正确
IFNULL(v1,v2)如果v1的值不为NULL,则返回v1,否则返回v2。SELECT IFNULL(null,'Hello Word');Hello Word
ISNULL(expression)判断表达式是否为NULLSELECT ISNULL(NULL);1
LAST_INSERT_ID()最近生成的 AUTO_INCREMENT 值SELECT LAST_INSERT_ID();0
NULLIF(expr1, expr2)比较两个字符串,如果字符串expr1与expr2相等返回NULL,否则返回expr1SELECT NULLIF(24,25);24
CURRENT_USER()当前用户SELECT CURRENT_USER();root@%
SESSION_USER()当前用户SELECT SESSION_USER();root@127.0.0.1
SYSTEM_USER()当前用户SELECT SYSTEM_USER();root@127.0.0.1
USER()当前用户SELECT USER();root@127.0.0.1
DATABASE()当前数据库名SELECT DATABASE();demo
VERSION()数据库的版本号SELECT VERSION();5.7.34




参考文章:
https://www.runoob.com/mysql/mysql-functions.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值