在数据库操作中,我们经常需要对数据进行各种处理,比如提取字符串中的部分内容、计算数值的总和、获取当前日期等。这时候,MySQL 函数就像一位得力助手,能帮我们高效地完成这些任务。
一、MySQL 函数是什么
MySQL 函数是一种预先定义好的操作,它接收零个或多个输入参数,经过内部的逻辑处理后,返回一个结果。这些函数被集成在 MySQL 数据库管理系统中,能够极大地简化我们对数据的查询、计算和转换操作。
从功能角度看,MySQL 函数可以分为内置函数和自定义函数。内置函数由 MySQL 官方提供,涵盖了数据处理的方方面面;自定义函数则是用户根据自身业务需求编写的函数,能满足特定场景下的数据处理要求。
二、常用 MySQL 函数类型及示例
(一)字符串函数
字符串函数主要用于对字符串类型的数据进行处理,比如连接、截取、转换大小写等。
- CONCAT (str1, str2, ...):用于连接多个字符串。若其中有一个参数为 NULL,则返回 NULL。
示例:SELECT CONCAT (' 姓名:', ' 张三 ', ',年龄:', '25') AS result;
执行结果为:“姓名:张三,年龄:25”。
SELECT CONCAT ('a', NULL, 'b') AS result;
执行结果为:NULL。
- SUBSTRING (str, pos, len):从指定位置开始截取指定长度的字符串,pos 表示起始位置(从 1 开始计数),len 表示截取的长度。若 len 省略,则截取从 pos 到字符串末尾的所有字符;若 pos 为负数,则从字符串末尾开始计数。
示例:SELECT SUBSTRING ('Hello World', 7, 5) AS result;
执行结果为:“World”。
SELECT SUBSTRING ('Hello World', -5) AS result;
执行结果为:“World”。
- UPPER (str) 和 LOWER (str):分别用于将字符串转换为大写和小写。
示例:SELECT UPPER ('hello') AS upper_result, LOWER ('HELLO') AS lower_result;
执行结果为:“HELLO” 和 “hello”。
- TRIM ([{BOTH | LEADING | TRAILING} [remstr] FROM] str):去除字符串首尾的指定字符,默认去除空格。BOTH 表示去除首尾,LEADING 表示去除开头,TRAILING 表示去除结尾。
示例:SELECT TRIM (' Hello ') AS result;
执行结果为:“Hello”。
SELECT TRIM (LEADING 'x' FROM 'xxHello') AS result;
执行结果为:“Hello”。
- LENGTH (str):返回字符串的长度,以字节为单位。
示例:SELECT LENGTH ('Hello') AS result;
执行结果为:5。(在 UTF-8 编码下,一个英文字符占 1 个字节)
(二)数值函数
数值函数主要用于对数值类型的数据进行计算和处理。
- SUM (expr):计算指定列的总和,忽略 NULL 值。
示例:假设有一个学生成绩表 score,其中有一列是 math_score,执行 SELECT SUM (math_score) AS total_math_score FROM score; 可得到所有学生数学成绩的总和。
- AVG (expr):计算指定列的平均值,忽略 NULL 值。
示例:SELECT AVG (math_score) AS avg_math_score FROM score; 可得到学生数学成绩的平均值。
- MAX (expr) 和 MIN (expr):分别用于获取指定列的最大值和最小值,忽略 NULL 值。
示例:SELECT MAX (math_score) AS max_math_score, MIN (math_score) AS min_math_score FROM score; 可得到数学成绩的最高分和最低分。
- ROUND (x, d):将数值 x 四舍五入保留 d 位小数,d 默认值为 0。
示例:SELECT ROUND (3.1415, 2) AS result;
执行结果为:3.14。
SELECT ROUND (3.5) AS result;
执行结果为:4。
- MOD (n, m):返回 n 除以 m 的余数。
示例:SELECT MOD (10, 3) AS result;
执行结果为:1。
(三)日期时间函数
日期时间函数用于处理日期和时间类型的数据。
- NOW ():返回当前的日期和时间,格式为 'YYYY-MM-DD HH:MM:SS'。
示例:SELECT NOW () AS current_datetime; 执行结果类似 “2025-08-11 10:30:45”。
- CURDATE () 和 CURTIME ():CURDATE () 返回当前日期,格式为 'YYYY-MM-DD';CURTIME () 返回当前时间,格式为 'HH:MM:SS'。
示例:SELECT CURDATE () AS current_date, CURTIME () AS current_time;
执行结果类似 “2025-08-11” 和 “10:35:20”。
- DATE_FORMAT (date, format):将日期按照指定的格式进行转换。常用的格式符有:% Y(四位年份)、% m(两位月份)、% d(两位日期)、% H(24 小时制小时)、% i(分钟)、% s(秒)。
示例:SELECT DATE_FORMAT (NOW (), '% Y 年 % m 月 % d 日 % H:% i:% s') AS formatted_datetime;
执行结果为 “2025 年 08 月 11 日 10:40:15”。
- DATEDIFF (date1, date2):计算两个日期之间的天数差,结果为 date1 - date2。
示例:SELECT DATEDIFF ('2025-08-15', '2025-08-11') AS day_diff; 执行结果为 4。
SELECT DATEDIFF ('2025-08-10', '2025-08-11') AS day_diff; 执行结果为 - 1。
- ADDDATE (date, INTERVAL expr unit):给日期添加指定的时间间隔。
示例:SELECT ADDDATE ('2025-08-11', INTERVAL 3 DAY) AS result;
执行结果为 “2025-08-14”。
SELECT ADDDATE ('2025-08-11', INTERVAL 1 MONTH) AS result;
执行结果为 “2025-09-11”。
(四)聚合函数
聚合函数用于对一组数据进行汇总计算,通常与 GROUP BY 子句一起使用。
- COUNT (expr):计算指定列的非 NULL 值的数量。COUNT () 则计算所有行数,包括 NULL 值。
示例:SELECT COUNT (math_score) AS count_math FROM score;(计算 math_score 列非 NULL 值的数量)
SELECT COUNT () AS total_rows FROM score;(计算表中所有行数)
- GROUP_CONCAT (expr):将分组后的指定列的值连接成一个字符串。
示例:假设有表 student,包含 class(班级)和 name(姓名)列,执行 SELECT class, GROUP_CONCAT (name) AS students FROM student GROUP BY class; 可得到每个班级的学生姓名列表,用逗号分隔。
三、自定义函数
除了 MySQL 内置的函数外,我们还可以根据自己的需求创建自定义函数。自定义函数可以封装特定的业务逻辑,提高代码的复用性。
(一)创建自定义函数的语法
CREATE FUNCTION 函数名(参数1 数据类型 [, 参数2 数据类型, ...])
RETURNS 返回值数据类型
[DETERMINISTIC | NOT DETERMINISTIC]
[COMMENT '函数注释']
BEGIN
-- 函数体,包含具体的逻辑处理
RETURN 返回值;
END
- DETERMINISTIC:表示函数是确定性的,即相同的输入会得到相同的输出;NOT DETERMINISTIC 则表示函数是非确定性的,默认值为 NOT DETERMINISTIC。
- COMMENT:用于对函数进行说明,方便后续维护。
(二)示例
1.计算两个数的乘积
CREATE FUNCTION multiply(a INT, b INT)
RETURNS INT
DETERMINISTIC
COMMENT '计算两个整数的乘积'
BEGIN
DECLARE result INT;
SET result = a * b;
RETURN result;
END
调用该函数:SELECT multiply (3, 4) AS product; 执行结果为 12。
2.根据学生分数判断等级(90 及以上为 A,80-89 为 B,70-79 为 C,60-69 为 D,60 以下为 E)
CREATE FUNCTION get_grade(score INT)
RETURNS CHAR(1)
DETERMINISTIC
COMMENT '根据分数返回等级'
BEGIN
DECLARE grade CHAR(1);
IF score >= 90 THEN
SET grade = 'A';
ELSEIF score >= 80 THEN
SET grade = 'B';
ELSEIF score >= 70 THEN
SET grade = 'C';
ELSEIF score >= 60 THEN
SET grade = 'D';
ELSE
SET grade = 'E';
END IF;
RETURN grade;
END
调用该函数:SELECT get_grade (85) AS grade; 执行结果为 'B'。
(三)自定义函数的修改与删除
- 修改函数:MySQL 中不能直接修改函数的定义,若要修改,需先删除函数,再重新创建。
- 删除函数:
DROP FUNCTION [IF EXISTS] 函数名;
示例:DROP FUNCTION IF EXISTS multiply;(删除名为 multiply 的函数,若存在)
四、使用 MySQL 函数的注意事项
- 函数的参数类型和数量必须与函数定义一致,否则会出现错误。例如,调用需要两个参数的函数时只传递一个参数,会导致执行失败。
- 不同的 MySQL 版本可能对函数的支持有所差异,在使用时要注意兼容性。比如某些新函数在旧版本中可能无法使用。
- 对于复杂的逻辑处理,自定义函数虽然方便,但也要注意其性能,避免过度使用导致查询效率下降。可以通过执行计划分析函数对查询性能的影响。
- 自定义函数需要特定的权限才能创建、修改和删除。创建函数需要 CREATE ROUTINE 权限,修改或删除函数需要 ALTER ROUTINE 权限,执行函数需要 EXECUTE 权限。
- 避免在函数中使用过多的复杂逻辑和大量的数据操作,以免增加函数的执行时间,影响整体查询效率。
- 函数与存储过程的区别:函数必须有返回值,且只能返回一个值;存储过程可以没有返回值,也可以通过 OUT 参数返回多个值。函数可以在 SELECT 语句中使用,而存储过程不能。