盘点MySQL中常用的函数
盘点MySQL中常用的函数
一、介绍#
在平常使用MySQL的过程中,我们常常会使用到其中的函数。有些函数常用,就会非常熟悉,但有些不经常使用就会十分生疏。
避免使用到的时候,到处去翻博客,干脆自己总结,记录一下,顺便也加深一下自己的印象。
二、函数#
1)聚合函数#
聚合函数又称为组函数,一般结合分组进行使用,用来统计和计算。
聚合函数在平常的sql
中十分常用,不需要查阅文档就应该保证熟练使用
-- avg 计算平均值 select avg(age) from tb_user; -- count,计算行数 select count(1) from tb_user; select count(*) from tb_user; select count(name) from tb_user; -- max,最大数 select max(age) from tb_user; -- min,最小数 select min(age) from tb_user; -- sum,求和 select sum(age) from tb_user; -- group_concat 分组聚合,以逗号分隔 select sex, group_concat(name) from tb_user group by sex;
需要注意的是,聚合函数不会对null
值进行计算。由于它会略过null
值,具体业务情况需要酌情分析。
2)字符串函数#
在处理字符串上,MySQL
也有一套自己的处理函数
-- concat 合并字符串 select concat('000', '111', '222');-- 000111222 select concat('000', null, '222');-- null -- 对于合并字符串,还可以这样写,在字符串中间用空格隔开。不推荐,可读性不是很好 select '000' '111' '222';-- 000111222 -- concat_ws,合并字符串,与上面不同的是,此处第一个参数是分隔符 select concat_ws('-', '000', '111', '222');-- 000-111-222 select concat_ws(null, '000', '111', '222');-- null select concat_ws('-', '000', null, '222');-- 000-222 -- length,返回字符串的字节长度 select length('0123456');-- 7 select length('半月无霜');-- 12 -- reverse,反转字符串 select reverse('0123456');-- 6543210 select reverse('半月无霜');-- 霜无月半 -- lower,将字符串中的所有字母都变成小写 select upper('ABCD');-- abcd -- upper,将字符串中的所有字母都变成大写 select upper('abcd');-- ABCD -- left,从左到右进行截取指定数量的字符 select left('0123456', 2);-- 01 -- right,从右到左进行截取指定数量的字符 select right('0123456', 2);-- 56 -- lpad,从字符串左边进行填充,直到长度到达指定字符长度 select lpad('1', 5, '0');-- 00001 -- rpad,从字符串右边进行填充,直到长度到达指定字符长度 select rpad('1', 5, '0');-- 10000 -- ltrim,去除字符串右边的空格 select ltrim(' 1000');-- 1000 -- rtrim,去除字符串右边的空格 select rtrim('1000 ');-- 1000 -- trim,去除字符串左右两边的空格 select trim(' 1000 ');-- 1000 -- repeat,将字符串重复指定的次数 select repeat('1000', 3);-- 100010001000 -- replace,将字符串替换其中指定的字符 select replace('我喜欢你', '喜欢', '讨厌');-- 我讨厌你 -- strcmp,字符串比较 select strcmp('abc', 'abc');-- 0,相等返回0 select strcmp('abc', 'abcd');-- -1,前字符串<后字符串 返回1 select strcmp('abcd', 'abc');-- 1,前字符串>后字符串 返回-1 select strcmp('abc', null);-- null,有null值计算,返回null -- substring,截取字符串,从指定的位置开始,截取指定数量的字符 select substring('0123456', 2, 1);-- 1 select substring('0123456', 2, 4);-- 1234 -- insert,替换字符串,将从指定的位置开始,到指定的数量的字符串,替换为新字符串 select insert('0123456', 2, 1, 'A');-- 0A23456 select insert('0123456', 2, 4, 'ABCD');-- 0ABCD56
3)数字计算函数#
除去加减乘除的符号外,数字计算上,MySQL
也提供了一些常用的数学计算函数。
-- abs,绝对值 select abs(-1);-- 1 select abs(1);-- 1 -- sqrt, 开平方 select sqrt(4);-- 2 select sqrt(9);-- 3 -- mod,求余数 select MOD(9, 2);-- 1 -- ceil、ceiling,返回整数,向上取整 select ceil(3.14);-- 4 select ceiling(3.14);-- 4 -- floor,返回整数,向下取整 select floor(3.14);-- 3 -- round,四舍五入 select round(3.14);-- 3 select round(2.76);-- 3 select round(2.8828, 2);-- 2.88 select round(2.8828, 3);-- 2.883 -- rand,返回一个0-1之间的随机数 select rand();-- 0.5440051923915792 -- sign,返回参数的符号,负整数返回-1,正整数返回1,0返回0 select sign(0);-- 0 select sign(88);-- 1 select sign(-7);-- -1 -- pow、power,幂次方 select pow(2, 3);-- 8 select power(2, 3);-- 8 -- pi,圆周率π select pi();-- 3.141593 -- sin,正弦值 select sin(0.5*pi());-- 1 select sin(1);-- 0.8414709848078965 -- asin,反正弦值 select asin(0.8414709848078965)-- 1 select asin(2);-- null -- cos,余弦值 select cos(0);-- 1 select cos(pi());-- -1 select cos(1);-- 0.5403023058681398 -- acos,反余弦值 select acos(1);-- 0 select acos(-1);-- 3.141592653589793 select acos(2);-- null -- tan,正切值 select tan(0);-- 0 select tan(1);-- 1.5574077246549023 -- atan,反正切值 select atan(0);-- 0 select atan(1, 1);-- 0.7853981633974483 -- cot,余切值 select cot(1);-- 0.6420926159343306
4)流程控制函数#
就是判断啦
-- if,判断函数 select if(88>60, '合格', '不合格');-- 合格 select if(59>60, '合格', '不合格');-- 不合格 -- ifnull,判断是否为空 select ifnull(null, 0);-- null select ifnull(55, 0);-- 55 -- case when,也是个流程控制的,但不属于函数 select case when 80>90 then '优秀' when 80>70 then '良好' when 80>60 then '一般' else '差劲' end as rate;-- 良好
5)日期函数#
-- curdate、current_date,返回当前日期 select curdate();-- 2022-05-01 select current_date();-- 2022-05-01 -- curtime、current_time,返回当前时间 select curtime();-- 22:04:30 select 、();-- 22:04:30 -- now、sysdate,返回当前日期时间 select now();-- 2022-05-01 22:05:25 select sysdate();-- 2022-05-01 22:05:25 -- unix_timestamp,返回当前unix时间戳 select unix_timestamp();-- 1651414009 -- from_unixtime,格式化unix时间戳 select from_unixtime(1651414009);-- 2022-05-01 22:06:49 select from_unixtime(1651414009, '%Y-%m-%d');-- 2022-05-01 -- year,返回指定日期的年份 select year(now());-- 2022 -- month,返回指定日期的月份 select month(now());-- 5 -- monthname,返回指定日期的月份英文名 select monthname(now());-- May -- day、dayofmonth,返回指定日期是一月中的第几天 select day(now());-- 1 select dayofmonth(now());-- 1 -- dayofyear,返回指定日期是一年中的第几天 select dayofyear(now());-- 121 -- dayofweek,返回指定日期在一周的第几天,星期天是第一天,星期一是第二天 select dayofweek('2022-05-01 10:00:00');-- 1 select dayofweek('2022-05-02 10:00:00');-- 2 -- weekday,返回指定日期在一周内的索引值,星期一是0,星期日是6 select weekday('2022-05-01 10:00:00');-- 6 select weekday('2022-05-02 10:00:00');-- 0 -- week,返回指定日期是一年中的第几周 select week(now());-- 18 -- dayname,返回指定日期是星期几英文名 select dayname(now());-- Sunday -- time_to_sec,返回指定时间的秒数 select time_to_sec('00:00:11');-- 11 -- sec_to_time,返回指定秒数的时间 select sec_to_time(11);-- 00:00:11 -- date_add、adddate,将指定日期添加指定的时间间隔 select date_add('2022-05-01 10:00:00', INTERVAL 30 SECOND);-- 2022-05-01 10:00:30 select date_add('2022-05-01 10:00:00', INTERVAL '30:30' MINUTE_SECOND);-- 2022-05-01 10:30:30 select date_add('2022-05-01 10:00:00', INTERVAL 30 MINUTE);-- 2022-05-01 10:30:00 select date_add('2022-05-01 10:00:00', INTERVAL 2 HOUR);-- 2022-05-01 12:00:00 select date_add('2022-05-01 10:00:00', INTERVAL 2 DAY);-- 2022-05-03 10:00:00 select date_add('2022-05-01 10:00:00', INTERVAL 1 MONTH);-- 2022-06-01 10:00:00 select date_add('2022-05-01 10:00:00', INTERVAL 1 YEAR);-- 2023-05-01 10:00:00 -- date_sub、subdate,将指定日期减去指定的时间间隔 select date_sub('2022-05-01 10:00:00', INTERVAL 30 SECOND);-- 2022-05-01 09:59:30 select date_sub('2022-05-01 10:00:00', INTERVAL '30:30' MINUTE_SECOND);-- 2022-05-01 09:29:30 select date_sub('2022-05-01 10:00:00', INTERVAL 30 MINUTE);-- 2022-05-01 09:30:00 select date_sub('2022-05-01 10:00:00', INTERVAL 2 HOUR);-- 2022-05-01 08:00:00 select date_sub('2022-05-01 10:00:00', INTERVAL 2 DAY);-- 2022-04-29 10:00:00 select date_sub('2022-05-01 10:00:00', INTERVAL 1 MONTH);-- 2022-04-01 10:00:00 select date_sub('2022-05-01 10:00:00', INTERVAL 1 YEAR);-- 2021-05-01 10:00:00 -- addtime,将指定的日期添加指定的时间 select addtime('2022-05-01 10:00:00', '01:30:30');-- 2022-05-01 11:30:30 -- subtime,将指定的日期添加指定的时间 select subtime('2022-05-01 10:00:00', '01:30:30');-- 2022-05-01 08:29:30 -- datediff,返回两个日期间相差的天数,参数1-参数2的日期 select datediff('2022-05-01 10:00:00', '2022-05-02 10:00:00');-- -1 select datediff('2022-05-01 23:59:59', '2022-05-02 00:00:00');-- -1 -- date_format,返回日期格式化 select date_format(now(), '%Y-%m-%d');-- 2022-05-01 select date_format(now(), '%Y-%m-%d %T');-- 2022-05-01 23:27:51 select date_format(now(), '%Y-%m-%d %H:%i:%s');-- 2022-05-01 23:27:51
格式化参数有
参数 | 说明 |
---|---|
%a | 工作日的缩写名称(Sun~Sat) |
%b | 月份的缩写名称(Jan…Dec) |
%c | 月份,数字形式(0~12) |
%D | 带有英语后缀的该月日期(0th, 2st, 3nd,…) |
%d | 该月日期,数字形式(00~31) |
%e | 该月日期,数字形式((0~31) |
%f | 微秒(000000 …999999) |
%H | 以 2 位数表示 24 小时(00~23) |
%h, %I | 以 2 位数表示 12 小时(01~12) |
%i | 分钟,数字形式(00~59) |
%j | —年中的天数(001~366) |
%k | 以 24 小时(0~23)表示 |
%l | 以12小时(1~12)表示 |
%M | 月份名称(January~December) |
%m | 月份,数字形式(00~12) |
%p | 上午(AM) 或下午(PM) |
%r | 时间,12小时制(小时 (hh): 分钟 (mm) : 秒数 (ss) 后加 AM 或 PM) |
%S, %s | 以 2 位数形式表示秒(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 位数形式表示年份 |
%% | %一个文字字符 |
6)类型转换函数#
-- cast、convert,类型转换函数 -- 转换为浮点 select cast('2022.87' as DECIMAL);-- 2023 select cast('2022.87' as DECIMAL(11, 2));-- 2022.87 -- 转换为整数 select cast('2022.87' as SIGNED);-- 2022 select cast('-2022.87' as SIGNED);-- -2022 select cast('2022.87' as UNSIGNED);-- 2022 select cast('-2022.87' as UNSIGNED);-- 18446744073709549594,无符号整数类型不支持负数 -- 字符串转为日期、时间、日期时间,格式必须是yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss select cast('2022-05-01 10:00:00' as DATE);-- 2022-05-01 select cast('2022-05-01 10:00:00' as TIME);-- 10:00:00 select cast('2022-05-01 10:00:00' as DATETIME);-- 2022-05-01 10:00:00 -- 数字转为字符串 select cast(123 as CHAR);-- 123 select cast(123 as BINARY);-- 123 -- convert,字符集转换 select convert('abc' USING utf8);-- abc select convert('你好' USING latin1);-- 乱码 -- 不是函数,但可以使用加号类解决 select '123' + 0;-- 123,数字类型 -- concat、可以使数字合并为字符串 select concat(0, '');-- 0,字符串类型 -- date_format、可以使日期时间格式化为字符串
7)系统函数#
-- version,版本号 select version();-- 5.7.32-log -- connection_id,连接id select connection_id();-- 119394 -- user、system_user、session_user,连接的用户 select user();-- banmoon@61.140.236.57 select system_user();-- banmoon@61.140.236.57 select session_user();-- banmoon@61.140.236.57 -- current_user,连接允许的主机 select current_user();-- banmoon@% -- database、schema, select database();-- test select schema();-- test -- inet_ntoa,将IPv4地址的dotted-quad表示形式作为字符串,并以整数形式返回给定IP地址的数值 select inet_aton('192.168.0.101');-- 3232235621 select inet_aton('-111');-- null -- inet_ntoa,以网络字节顺序获取IPv4地址,然后以dotted-quad字符串表示形式返回该地址 select inet_ntoa('3232235621');-- 192.168.0.101 select inet_ntoa('-222');-- null -- last_insert_id,获取上次插入的主键 select last_insert_id();-- 0 -- md5,md5加密 select md5('123456');-- e10adc3949ba59abbe56e057f20f883e -- password,加密 select password('123456');-- *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 -- encode,加密 select encode('123456', 'abc'); -- decode,解密 select decode(encode('123456', 'abc'), 'abc')-- 123456
三、最后#
本来是想将函数的定义也放在这里的,但想了想还是分开吧,自定义函数可以和存储过程一起出。
我是半月,祝你幸福!!!
作者: 半月无霜
出处:https://www.cnblogs.com/banmoon/p/16417072.html
本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律