MySQL 提供了丰富而实用的内置函数,是进行数据查询、处理和分析的核心工具。这些函数主要分为几大类:字符串函数 (如 CONCAT
, UPPER
, SUBSTRING
, LENGTH
)用于处理文本;数值函数 (如 ROUND
, ABS
, MOD
)执行数学运算;日期和时间函数 (如 NOW
, CURDATE
, DATEDIFF
, DATE_ADD
)方便地操作时间数据;聚合函数 (如 COUNT
, SUM
, AVG
, MAX
, MIN
)用于对数据组进行统计计算;以及控制流函数 (如 IF
, IFNULL
, COALESCE
, CASE
)实现条件判断和 NULL
值处理。
1. 字符串函数 (String Functions)
用于处理文本数据。
CONCAT(str1, str2, ...)
: 将多个字符串连接成一个。
arduino
SELECT CONCAT('Hello', ' ', 'World'); -- 结果: 'Hello World'
UPPER(str)
/LOWER(str)
: 将字符串转换为大写或小写。
sql
SELECT UPPER('hello'); -- 结果: 'HELLO'
SELECT LOWER('WORLD'); -- 结果: 'world'
LENGTH(str)
: 返回字符串的字节长度。
sql
SELECT LENGTH('abc'); -- 结果: 3
SELECT LENGTH('你好'); -- utf8mb4下通常是6 (每个汉字3字节)
CHAR_LENGTH(str)
: 返回字符串的字符长度。
sql
SELECT CHAR_LENGTH('abc'); -- 结果: 3
SELECT CHAR_LENGTH('你好'); -- 结果: 2
SUBSTRING(str, pos, len)
: 从字符串str
的位置pos
(从1开始) 提取长度为len
的子串。-pos
(位置) : 指定从字符串的第几个字符 开始提取。位置从 1 开始计数。len
(长度) : 指定要提取的字符数量。
sql
SELECT SUBSTRING('Hello World', 7, 5); -- 结果: 'World'
SELECT SUBSTRING('你好 我是花花无缺', 7, 5); -- 结果: '花无缺'
TRIM(str)
: 去除字符串首尾的空格。
sql
SELECT TRIM(' hello '); -- 结果: 'hello'
REPLACE(str, from_str, to_str)
: 将str
中的from_str
全部替换为to_str
。
arduino
SELECT REPLACE('Hello World', 'World', 'MySQL'); -- 结果: 'Hello MySQL'
LIKE
: 模糊匹配。%
匹配任意字符序列,_
匹配单个字符。
sql
SELECT * FROM users WHERE name LIKE 'J%'; -- 名字以J开头
POSITION
函数用于在一个字符串中查找另一个字符串(子字符串)第一次出现的位置。语法 :POSITION(substr IN str)
,返回子字符串substr
在字符串str
中第一次出现的起始位置 (从 1 开始计数)。如果未找到,则返回 0。等价函数 : 在 MySQL 中,POSITION(substr IN str)
完全等同于LOCATE(substr, str)
。
sql
-- 查找 '_' 在 'mod_854n' 中的位置
SELECT POSITION('_' IN 'mod_854n'); -- 结果: 4
例:取'mod_854n_1',第一个'_'后的字符串
sql
SELECT SUBSTRING('mod_854n_1', LOCATE('_', 'mod_854n_1') + 1) AS result;
-- 结果: '854n_1'
2. 数值函数 (Numeric Functions)
用于数学计算。
ABS(X)
: 返回X
的绝对值。
sql
SELECT ABS(-5); -- 结果: 5
ROUND(X, D)
: 将X
四舍五入到D
位小数。
scss
SELECT ROUND(1.2345, 2); -- 结果: 1.23
FLOOR(X)
: 向下取整(返回小于或等于X
的最大整数)。
sql
SELECT FLOOR(1.9); -- 结果: 1
CEIL(X)
/CEILING(X)
: 向上取整(返回大于或等于X
的最小整数)。
sql
SELECT CEIL(1.1); -- 结果: 2
MOD(N, M)
/N % M
: 返回N
除以M
的余数。
sql
SELECT MOD(10, 3); -- 结果: 1
POWER(N, M)
/N^M
: 返回N的M次方。
sql
select power(2.0,3.0); -- 结果: 8
select power(2.0,-3.0);-- 结果: 0.125
3. 日期和时间函数 (Date and Time Functions)
用于处理日期和时间。
NOW()
: 返回当前的日期和时间。
csharp
SELECT NOW(); -- 结果如: '2025-08-17 13:30:45'
CURDATE()
: 返回当前日期。
csharp
SELECT CURDATE(); -- 结果如: '2025-08-17'
CURTIME()
: 返回当前时间。
csharp
SELECT CURTIME(); -- 结果如: '13:30:45'
DATEDIFF(expr1, expr2)
: 返回expr1
和expr2
相隔的天数。
sql
SELECT DATEDIFF('2025-08-20', '2025-08-17'); -- 结果: 3
DATE_ADD(date, INTERVAL expr unit)
: 给日期添加时间间隔。
sql
SELECT DATE_ADD('2025-08-17', INTERVAL 10 DAY); -- 结果: '2025-08-27'
SELECT DATE_ADD('2025-08-17', INTERVAL 1 MONTH); -- 结果: '2025-09-17'
DATE_FORMAT(date, format)
: 格式化日期。
arduino
SELECT DATE_FORMAT('2025-08-17', '%Y年%m月%d日'); -- 结果: '2025年08月17日'
STR_TO_DATE(str, format)
: 将字符串解析为日期。
arduino
SELECT STR_TO_DATE('2025/08/17', '%Y/%m/%d'); -- 结果: '2025-08-17'
4. 聚合函数 (Aggregate Functions)
对一组值进行计算,通常与 GROUP BY
配合使用。
COUNT(*)
: 计算行数(包括NULL
)。
sql
SELECT COUNT(*) FROM users; -- 统计总人数
SUM(expr)
: 计算总和。
sql
SELECT SUM(price) FROM orders; -- 计算订单总金额
AVG(expr)
: 计算平均值。
sql
SELECT AVG(score) FROM students; -- 计算平均分
MAX(expr)
/MIN(expr)
: 返回最大值/最小值。
sql
SELECT MAX(age), MIN(age) FROM users; -- 查找最大和最小年龄
5. 控制流函数 (Control Flow Functions)
根据条件返回不同结果。
IF(expr, true_val, false_val)
: 简单的条件判断。
sql
SELECT IF(score >= 60, '及格', '不及格') AS result FROM exam;
IFNULL(expr1, expr2)
: 如果expr1
是NULL
,则返回expr2
,否则返回expr1
。
sql
SELECT IFNULL(phone, '未提供') FROM users; -- 手机号为空时显示"未提供"
CASE
语句: 复杂的条件判断。
vbnet
SELECT name,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS level
FROM students;
6. 其他基础函数
COALESCE(value1, value2, ...)
: 返回第一个非NULL
的值(比IFNULL
更强大,支持多个参数)。
sql
SELECT COALESCE(email, phone, '联系方式未知') FROM users; --结果: (优先 `email`,其次 `phone`),如果两者都缺失,则显示 `'联系方式未知'`。