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`),如果两者都缺失,则显示 `'联系方式未知'`。