
前言
为了简化操作,MySQL 提供了大量的函数,会对传递进来的参数进行处理,并返回一个处理结果,也就是返回一个值。MySQL 包含了大量并且丰富的函数,这里只是对 MySQL 常用函数进行简单的分类,大概包括数值型函数、字符串型函数、日期时间函数、聚合函数等。剩下的比较罕见的函数就不再整理了,小伙伴们可以到「MySQL 官网」查询。
MySQL函数是MySQL数据库提供的内部函数,这些内部函数可以帮助用户更加方便的处理表中的数据,可以使MySQL数据库的功能更加强大。SELECT语句及其条件表达式都可以使用这些函数。同时,INSERT、UPDATE、DELECT语句及其条件表达式也可以使用这些函数。例如,表中的某个数据是负数,现在需要将这个数据显示为正数。这就可以使用绝对值函数。
一、字符串函数
字符串函数是最常用的函数,可以对字符串类型数据进行处理,MySQL也支持许多字符串函数,以下是MySQL支持的字符串函数的表。
| 函数名称 | 作 用 | 
|---|---|
| ASCII(s) | 获取字符串的 ASCII 码 | 
| CHAR_LENGTH(s) | 返回字符串的长度(以字符为单位) | 
| CHARACTER_LENGTH(s) | 返回字符串的长度(以字符为单位) | 
| CONCAT(s1,s2…,sn) | 合并字符串函数,将两个或多个表达式相加。 如果该函数中的任何参数为 null,返回结果为 null | 
| CONCAT_WS(x, s1,s2…sn) | 同 CONCAT 函数,但是每个字符串之间要加上 x,x 可以是分隔符 | 
| FIELD(s,s1,s2…) | 返回第一个字符串 s 在字符串列表(s1,s2…)中的位置 | 
| FIND_IN_SET(s1,s2) | 返回在字符串s2中与s1匹配的字符串的位置 | 
| FORMAT(x,n) | 将数字 x 进行格式化 “#,###.##”,保留到小数点后 n 位,最后一位四舍五入 | 
| INSERT | 替换字符串函数 | 
| INSTR(s1,x,len,s2) | 字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串 | 
| LCASE | 将字符串转换为小写 | 
| LEFT(s,n) | 从左侧字截取符串,返回字符串 s 的前 n 个字符 | 
| LENGTH | 返回字符串的长度(以字节为单位) | 
| LOCATE(s1,s) | 从字符串 s 中获取 s1 的开始位置 | 
| LOWER | 将字符串转换为小写 | 
| LPAD(s1,len,s2) | 在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len | 
| LTRIM(s) | 去掉字符串 s 开始处的空格 | 
| MID(s,n,len) | 从字符串 s 的 n 位置截取长度为 len 的子字符串 | 
| POSITION(s1 IN s) | 从字符串 s 中获取 s1 的开始位置 | 
| REPEAT(s,n) | 将字符串 s 重复 n 次 | 
| REPLACE(s,s1,s2) | 字符串替换函数,将字符串 s2 替代字符串 s 中的字符串 s1 | 
| REVERSE | 字符串反转(逆序)函数,返回与原始字符串顺序相反的字符串 | 
| RIGHT(s,n) | 从右侧字截取符串,返回字符串 s 的后 n 个字符 | 
| RPAD(s1,len,s2) | 在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len | 
| RTRIM(s) | 去掉字符串 s 结尾处的空格 | 
| SPACE(n) | 返回 n 个空格 | 
| STRCMP(s1,s2) | 比较字符串 s1 和 s2,如果相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1 | 
| SUBSTR(s, start, length) | 从字符串 s 的 start 位置截取长度为 length 的子字符串 | 
| SUBSTRING(s, start, length) | 截取字符串,从字符串 s 的 start 位置截取长度为 length 的子字符串 | 
| TRIM(s) | 删除字符串 s 开始和结尾处的空格 | 
| UCASE(s) | 将字符串转换为大写 | 
| UPPER | 将字符串中的字母转换为大写 | 
二、数学函数
  除去加减乘除的符号外,数字计算上,MySQL也提供了一些常用的数学计算函数,主要用于处理数字,包括整型、浮点数等。数学函数包括绝对值函数、正弦函数、余弦函数、获取随机数的函数等。
| 函数名称 | 作 用 | 
|---|---|
| ABS(x) | 返回数字的绝对值 | 
| ACOS | 求反余弦值,与函数 COS 互为反函数 | 
| ASIN | 求反正弦值,与函数 SIN 互为反函数 | 
| ATAN(x) | 求反正切值,与函数 TAN 互为反函数 | 
| CEIL(x) | 返回不小于参数的最小整数,即向上取整 | 
| CEILING) | 返回不小于参数的最小整数,即向上取整 | 
| COS(x) | 求余弦值 | 
| COT(x) | 求余切值 | 
| DEGREES(x) | 将弧度转换为角度 | 
| DIV | 用于整数除法 | 
| EXP(x) | 返回 e 的 x 次方 | 
| FLOOR(x) | 向下取整,返回小于或等于 x 的最大整数 | 
| GREATEST(expr1, expr2, …) | 返回列表中的最大值 | 
| LEAST(expr1, expr2, …) | 返回列表中的最小值 | 
| LOG2(x) | 返回以 2 为底的对数 | 
| LOG10 | 返回以10为底的数字的自然对数 | 
| LOG | 返回一个数字的自然对数 | 
| MOD(x,y) | 返回 x 除以 y 以后的余数 | 
| PI() | 返回圆周率(3.141593) | 
| POW(x,y) | 返回 x 的 y 次方 | 
| POWER(x,y) | 返回 x 的 y 次方 | 
| RADIANS(x) | 将角度转换为弧度 | 
| RAND | 生成一个0~1之间的随机数,传入整数参数是,用来产生重复序列 | 
| ROUND | 对所传参数进行四舍五入 | 
| SIGN | 返回参数的符号 | 
| SIN | 求正弦值 | 
| SQRT | 求二次方根 | 
| TAN(x) | 求正切值 | 
| TRUNCATE(x,y) | 返回数值 x 保留到小数点后 y 位的值 | 
三、日期时间函数
3.1 日期时间格式化
DATE_FORMAT(date,format)
根据format字符串格式化date值,在format字符串中可用标志符。具体的参数如下:
| format | 含义 | 
|---|---|
| %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 位数形式表示年份 | 
具体执行结果如下:
select DATE_FORMAT('2022-12-11 00:22:30','%Y/%m/%d');
select DATE_FORMAT('2022-12-11 00:22:30','%Y%m%d');
select DATE_FORMAT('2022-12-11 00:22:30','%m');
select DATE_FORMAT('2022-12-11 00:22:30','%H');
3.2 日期函数
| 函数名称 | 作 用 | 
|---|---|
| CURDATE() | 当前系统的日期 | 
| CURRENT_DATE() | 返回当前日期 | 
| CURRENT_TIME | 返回当前系统的时间 | 
| CURRENT_TIMESTAMP() | 返回当前日期和时间 | 
| CURTIME() | 返回当前时间 | 
| DATE_FORMAT | 格式化指定的日期,根据参数返回指定格式的值 | 
| DATE() | 从日期或日期时间表达式中提取日期值 | 
| DATEDIFF(d1,d2) | 获取两个日期之间间隔,返回参数 1 减去参数 2 的值 | 
| DAY(date) | 返回日期值 d 的日期部分 | 
| DAYNAME(d) | 获取指定曰期对应的星期几的英文名称 | 
| DAYOFMONTH(d) | 获取指定日期是一个月中是第几天,返回值范围是1~31 | 
| DAYOFWEEK(d) | 获取指定日期对应的一周的索引值,1 星期日,2 星期一,以此类推 | 
| DAYOFYEAR(d) | 获取指定曰期是一年中的第几天,返回值范围是1~366 | 
| FROM_DAYS(n) | 计算从 0000 年 1 月 1 日开始 n 天后的日期 | 
| FROM_UNIXTIME | 将 UNIX 时间戳转换为时间格式,与UNIX_TIMESTAMP互为反函数 | 
| HOUR(time) | 返回 t 中的小时值,返回值的范围是 0 到 23 | 
| LAST_DAY(d) | 返回给给定日期的那一月份的最后一天 | 
| LOCALTIME() | 返回当前日期和时间 | 
| LOCALTIMESTAMP() | 返回当前日期和时间 | 
| MAKETIME(hour, minute, second) | 组合时间,参数分别为小时、分钟、秒 | 
| MINUTE(time) | 返回 t 中的分钟值,范围是 0 到 59 | 
| MONTH(date) | 获取指定日期中的月份,范围为 1 到 12 | 
| MONTHNAME | 获取指定日期中的月份英文名称 | 
| NOW() | 返回当前系统的日期和时间值 | 
| PERIOD_ADD(period, number) | 为 年-月 组合日期添加一个时段 | 
| PERIOD_DIFF(period1, period2) | 返回两个时段之间的月份差值 | 
| QUARTER(d) | 返回日期的一年中的季度,范围为 1 到 4 | 
| SEC_TO_TIME(s) | 将以秒为单位的时间 s 转换为时分秒的格式,与TIME_TO_SEC 互为反函数 | 
| SECOND(time) | 返回 t 中的秒钟值,范围为 0 到 59 | 
| STR_TO_DATE(string, format) | 将字符串转变为日期 | 
| SUBDATE(d,n) | 日期 d 减去 n 天后的日期 | 
| SUBTIME(t,n) | 时间减法运算,时间 t 减去 n 秒的时间 | 
| SYSDATE() | 返回当前日期和时间 | 
| TIME_FORMAT(t,f) | 按表达式 f 的要求显示时间 t | 
| TIME_TO_SEC | 将时间参数转换为秒数 | 
| TIME(expression) | 提取传入表达式的时间部分 | 
| TIMEDIFF(time1, time2) | 计算时间差值 | 
| TO_DAYS(d) | 计算日期 d 距离 0000 年 1 月 1 日的天数 | 
| UNIX_TIMESTAMP | 获取UNIX时间戳函数 | 
| WEEK(d) | 获取指定日期是一年中的第几周,返回值的范围是否为 0〜52 或 1〜53 | 
| WEEKDAY(d) | 获取指定日期在一周内对应的工作日索引,0 表示星期一,1 表示星期二 | 
| WEEKOFYEAR(d) | 计算日期 d 是本年的第几个星期,范围是 0 到 53 | 
| YEAR(d) | 获取年份,范围为 1000 到 9999 | 
| YEARWEEK(date, mode) | 返回年份及第几周(0到53),mode 中 0 表示周天,1表示周一,以此类推 | 
- 获取当前系统时间
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());
SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE);
SELECT EXTRACT(DAY_SECOND FROM CURRENT_DATE);
SELECT EXTRACT(HOUR_MINUTE FROM CURRENT_DATE);
3.3 日期函数加减运算
| 函数名称 | 作 用 | 
|---|---|
| ADDDATE(date,INTERVAL expr unit) | 向日期添加指定的时间间隔 | 
| ADDTIME(date,INTERVAL expr unit) | 时间加法运算,在原始时间上添加指定的时间 | 
| DATE_ADD(date,INTERVAL expr unit) | 向日期添加指定的时间间隔 | 
| DATE_SUB(date,INTERVAL expr unit) | 向日期减去指定的时间间隔 | 
这里简单介绍其中的参数含义,date 参数指定开始日期或日期时间值。 expr 是一个表达式,指定要从开始日期添加或减去的间隔值,而unit则指明表达式expr应该如何被解释,其值为
| unit值 | 说明 | expr 格式 | 
|---|---|---|
| second | 秒 | seconds | 
| minute | 分钟 | minutes | 
| hour | 小时 | hours | 
| day | 天 | day | 
| month | 月 | month | 
| year | 年 | year | 
| minute_second | 分钟和秒 | minutes:seconds | 
| hour_minute | 小时和分钟 | hours:minutes | 
| day_hour | 天和小时 | hours hours | 
| day_minute | 天、小时、分钟 | hours hours:minutes | 
| day_second | 天、小时、分钟、秒 | hours hours:minutes:seconds | 
| year_month | 年和月 | year-month | 
具体用法如下:
select DATE_ADD('2022-12-11' ,INTERVAL 1 DAY);
select DATE_ADD('2022-12-11' ,INTERVAL 1 MONTH);
select DATE_ADD('2022-12-11' ,INTERVAL -1 DAY);
3.4 关于时间的查询
- 获取年月日时分秒周
SELECT now(),dayofweek(now()),YEAR(now()),MONTH(now()),DAY(now()),HOUR(now()),MINUTE(now()),SECOND(now()),WEEK(now());
- 结合某表的常用查询
-- 今天
select * from sys_log_login where to_days(createTime) = to_days(now());
-- 查询最近一周的数据
select * from sys_log_login where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(createTime);
-- 查询上一周数据
SELECT * FROM sys_log_login WHERE YEARWEEK(date_format(now() ,'%Y-%m-%d'))= YEARWEEK(now()) -1
-- 近30天
SELECT *FROM sys_log_login  where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date( createTime)
-- 查询最近一月的数据
select * from sys_log_login where DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= date(createTime);
-- 查询本月数据
SELECT * FROM sys_log_login WHERE DATE_FORMAT(createTime, '%Y%m')=DATE_FORMAT(CURDATE() , '%Y%m')
-- 查询上一月数据
SELECT * FROM sys_log_login WHERE PERIOD_DIFF(date_format(now() ,'%Y%m'), date_format(createTime ,'%Y%m'))=1
-- 查询本年数据
select * from `sys_log_login` where YEAR(createTime)=YEAR(NOW());
-- 查询上一年数据
select * from `sys_log_login` where year(createTime)=year(date_sub(now(),interval 1 year));
-- 按日查询
SELECT DATE_FORMAT(createTime, '%Y-%m-%d') AS time,COUNT(*) FROM sys_log_login GROUP BY time
-- 按周查
SELECT DATE_FORMAT(createTime, '%Y-%u') AS time,COUNT(*) FROM sys_log_login GROUP BY time
-- 按月查
SELECT DATE_FORMAT(createTime,'%Y-%m') AS time,COUNT(*) FROM sys_log_login GROUP BY time
-- 按年查
SELECT DATE_FORMAT(createTime,'%Y') AS time,COUNT(*) FROM sys_log_login GROUP BY time
-- 按月分组查询
SELECT
	SUM(case MONTH(createTime) WHEN 1 THEN 1 ELSE 0 END) AS 一月份,
	SUM(case MONTH(createTime) WHEN 2 THEN 1 ELSE 0 END) AS 二月份,
	SUM(case MONTH(createTime) WHEN 3 THEN 1 ELSE 0 END) AS 三月份,
	SUM(case MONTH(createTime) WHEN 4 THEN 1 ELSE 0 END) AS 四月份,
	SUM(case MONTH(createTime) WHEN 5 THEN 1 ELSE 0 END) AS 五月份,
	SUM(case MONTH(createTime) WHEN 6 THEN 1 ELSE 0 END) AS 六月份,
	SUM(case MONTH(createTime) WHEN 7 THEN 1 ELSE 0 END) AS 七月份,
	SUM(case MONTH(createTime) WHEN 8 THEN 1 ELSE 0 END) AS 八月份,
	SUM(case MONTH(createTime) WHEN 9 THEN 1 ELSE 0 END) AS 九月份,
	SUM(case MONTH(createTime) WHEN 10 THEN 1 ELSE 0 END) AS 十月份,
	SUM(case MONTH(createTime) WHEN 11 THEN 1 ELSE 0 END) AS 十一月份,
	SUM(case MONTH(createTime) WHEN 12 THEN 1 ELSE 0 END) AS 十二月份
FROM sys_log_login
WHERE
	YEAR(createTime) = YEAR(CURDATE())
四、聚合函数
聚合函数又称为组函数,一般结合分组进行使用,用来统计和计算,比如不想知道每条学生记录的确切信息,只想知道学生记录数量。聚合函数在平常的sql中十分常用,不需要查阅文档就应该保证熟练使用,这里列举如下:
| 函数名称 | 作 用 | 
|---|---|
| AVG(expression) | 返回一个表达式的平均值 | 
| COUNT(expression) | 返回由 SELECT 语句检索的行中 expr 的非 NULL 值的计数 | 
| GROUP_CONCAT() | 将group by产生的同一个分组中的值连接起来,返回一个字符串结果 | 
| MAX(expression) | 返回字段 expression 中的最大值 | 
| MIN(expression) | 返回字段 expression 中的最小值 | 
| SUM(expression) | 返回指定字段的总和 | 
需要注意的是,聚合函数不会对
null值进行计算。由于它会略过null值,具体业务情况需要酌情分析。
这里主要来看下 GROUP_CONCAT 函数的使用,如下所示:
select date,GROUP_CONCAT(sales) from order_details group by date order by date limit 10;
+------------+-------------------------------+
| date       | GROUP_CONCAT(sales)           |
+------------+-------------------------------+
| 2019-01-01 | 39,44,37,38,88,87,6,21,91,78  |
| 2019-01-02 | 70,12,63,52,80,35,14,88       |
| 2019-01-03 | 16,76,48                      |
| 2019-01-04 | 42,69,99,85,49,37             |
| 2019-01-05 | 63,61,50,1,100,33,60,59,90,48 |
| 2019-01-06 | 66,66,49,14,38,94,78,16,68    |
| 2019-01-07 | 30,51,13,27,58,82,75,12       |
| 2019-01-08 | 71,50,67,46,91                |
| 2019-01-09 | 62,76,51,100,11,28,32         |
| 2019-01-10 | 13,72,38,42,67,94,76          |
五、控制流程函数
MySQL有4个函数是用来进行条件操作的,这些函数可以实现SQL的条件逻辑,允许开发者将一些应用程序业务逻辑转换到数据库后台。
| 函数名称 | 作 用 | 
|---|---|
| IF(expr,v1,v2) | 如果表达式 expr 成立,返回 v1,否则返回 v2 | 
| IFNULL(v1,v2) | 如果 v1 的值不为 NULL,则返回 v1,否则返回 v2 | 
| NULLIF(arg1,arg2) | 如果arg1=arg2返回NULL;否则返回arg1 | 
| case when <求值表达式> then <表达式1> when <求值表达式> then <表达式2> else <表达式> end | 如果testN是真,则返回resultN,否则返回default 当一个case子句中有多个判断逻辑时、字段类型需要一致。 | 
| case <表达式> when <求值表达式> then <表达式1> when <求值表达式> then <表达式2> else <表达式> end | 如果test和valN相等,则返回resultN,否则返回default 当一个case子句中有多个判断逻辑时、字段类型需要一致。 | 
| ISNULL(expression) | 判断表达式是否为 NULL | 
这里举个完整的示例,我们先看原始数据:
| id | age | sex | name | score | 
|---|---|---|---|---|
| 1 | 22 | 0 | 周蓉 | 91 | 
| 2 | 18 | 0 | 周秉昆 | 45 | 
| 3 | 25 | 1 | 周秉义 | 92 | 
| 4 | 22 | 1 | 蔡晓光 | 82 | 
| 5 | 24 | 0 | 郝冬梅 | 82 | 
| 6 | 17 | 0 | 乔春燕 | 56 | 
| 7 | 21 | 0 | 郑娟 | 38 | 
| 8 | 18 | 1 | 郝德宝 | 61 | 
统计优秀、良好、合格、不合格人数。
select  
case
	when  score>=90 then '优秀' 
	when  score>=80 and score <90 then '良好'
	when  score>=60 and score<80 then '合格'
	when  score<60 then '不合格'
end as type,count(*) as '人数' from t_score group by type;
六、系统信息函数
系统信息函数用来查询MySQL数据库的系统信息。例如,查询数据库的版本,查询数据库的当前用户等。本小节将详细讲解系统信息函数的作用和使用方法。
| 函数名称 | 作用 | 
|---|---|
| VERSION() | 获取MySQL版本号、连接数、数据库名 | 
| CONNECTION_ID() | 获取服务器的连接数,也就是到现在为止MySQL服务的连接次数 | 
| DATABASE() | 获取当前数据库名 | 
| SCHEMA() | 获取当前数据库名 | 
| USER() | 获取当前用户的名称 | 
| SYSTEM_USER() | 获取当前用户的名称 | 
| SESSION_USER() | 获取当前用户的名称 | 
| CURRENT_USER() | 获取当前用户的名称 | 
| CHARSET(str) | 获取字符串str的字符集,一般情况就是系统的默认字符集 | 
| COLLATION(str) | 获取字符串str的字符排列方式 | 
| LAST_INSERT_ID() | 获取最后生成的AUTO_INCREMENT值 | 
七、加密函数
加密函数是MySQL中用来对数据进行加密的函数。因为数据库中有些很敏感的信息不希望被其他人看到,就应该通过加密方式来使这些数据变成看似乱码的数据。例如用户的密码,就应该经过加密。下面是各种加密函数的名称、作用和使用方法。
| 函数名称 | 作用 | 
|---|---|
| PASSWORD(str) | 对字符串str进行加密。一般情况下,主要是用来给用户密码加密的 | 
| MD5(str) | 主要对普通的数据进行加密 | 
| ENCODE(str,pswd_str) | 使用字符串pswd_str来加密字符串str | 
| DECODE(crypt_str,pswd_str) | 使用字符串pswd_str来为crypt_str解密 | 
| SHA() | 计算字符串str的安全散列算法(SHA)校验和 | 
SELECT ENCODE('xufeng','key');
SELECT DECODE(ENCODE('xufeng','key'),'key');#加解密放在一起
SELECT MD5('123456');
SELECT SHA('123456');
八、其它函数
| 函数名称 | 作 用 | 
|---|---|
| CAST(expression AS data_type) | 用于将某种数据类型的表达式显式转换为另一种数据类型 | 



















![[附源码]Python计算机毕业设计SSM基于的小区物业管理系统(程序+LW)](https://img-blog.csdnimg.cn/1791d408ea6244e98367dc7f817f5881.png)