在 MySQL 的日常使用和开发中,会用到丰富多样的函数来满足不同场景的数据处理需求,以下从常用的类别详细介绍一些典型函数:
一、字符串函数
1. CONCAT()
- 功能:用于连接两个或多个字符串。
- 示例:
SELECT CONCAT('Hello', ' ', 'World') AS result;
-- 结果为 "Hello World"
- 应用场景:比如在用户信息查询中,把用户的姓和名拼接成完整姓名,
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
,常用于生成报表、展示完整信息等场景。
2. SUBSTRING()
- 功能:截取字符串的一部分,需指定起始位置和截取长度(可选 )。语法有
SUBSTRING(str, pos)
(从 pos 位置开始截取到末尾 )、SUBSTRING(str, pos, len)
(从 pos 位置开始截取 len 长度 ),注意 pos 从 1 开始计数 。 - 示例:
SELECT SUBSTRING('MySQL is great', 1, 5) AS sub_result;
-- 结果为 "MySQL",从第 1 个字符开始截取 5 个字符
SELECT SUBSTRING('MySQL is great', 7) AS sub_result;
-- 结果为 "is great",从第 7 个字符开始截取到末尾
- 应用场景:处理文本内容时提取关键部分,如从日志信息里截取特定标识段,
SELECT SUBSTRING(log_content, 10, 20) AS key_info FROM logs;
,用于分析日志关键内容。
3. LENGTH()
和 CHAR_LENGTH()
LENGTH()
:返回字符串的字节长度,受字符集影响。比如UTF-8
编码下,一个汉字占 3 字节 。CHAR_LENGTH()
:返回字符串的字符数量,不管字符编码,一个汉字、一个英文字母都算 1 个字符 。- 示例:
SELECT LENGTH('你好') AS len_bytes, CHAR_LENGTH('你好') AS len_chars;
-- len_bytes 为 6(UTF-8 下两个汉字共 6 字节 ),len_chars 为 2
- 应用场景:在需要按字符数量限制或统计时用
CHAR_LENGTH()
,如限制用户输入的昵称字符数;判断字符串存储的字节占用情况用LENGTH()
,避免因字符集导致存储超出字段容量。
4. REPLACE()
- 功能:替换字符串中的指定子串。
- 示例:
SELECT REPLACE('MySQL is fun', 'fun', 'great') AS new_str;
-- 结果为 "MySQL is great",把 "fun" 替换成 "great"
- 应用场景:数据清洗时,替换非法字符、统一格式,比如把用户输入内容里的特定敏感词替换掉,
UPDATE users SET bio = REPLACE(bio, '敏感词', '***') WHERE bio LIKE '%敏感词%';
。
二、数值函数
1. SUM()
- 功能:对数值列求和,常用于聚合查询。
- 示例:
SELECT SUM(amount) AS total_amount FROM orders;
-- 计算 orders 表中 amount 列的总和,得到总订单金额等统计值
- 应用场景:统计业务数据,如订单总金额、商品销售总量等,是报表统计、数据分析中常用的聚合函数。
2. AVG()
- 功能:计算数值列的平均值。
- 示例:
SELECT AVG(score) AS avg_score FROM student_scores;
-- 计算学生成绩表中 score 列的平均分
- 应用场景:用于统计平均数据,像平均成绩、平均订单金额、平均用户活跃度等,辅助分析业务数据的均值情况。
3. ROUND()
- 功能:对数值进行四舍五入,可指定保留小数位数。
- 示例:
SELECT ROUND(3.14159, 2) AS rounded_num;
-- 结果为 3.14,保留 2 位小数进行四舍五入
- 应用场景:处理财务数据、统计结果等需要规范小数位数的场景,比如将商品价格、计算出的平均值等按指定小数位展示。
4. MOD()
- 功能:计算两个数相除的余数,同
%
运算符功能类似 。 - 示例:
SELECT MOD(10, 3) AS remainder;
-- 结果为 1,10 除以 3 的余数是 1
- 应用场景:按余数分组、判断奇偶性(如
MOD(num, 2)
,结果为 0 是偶数,1 是奇数 )等场景,比如统计奇数 ID 的用户数量SELECT COUNT(*) FROM users WHERE MOD(id, 2) = 1;
。
三、日期和时间函数
1. NOW()
- 功能:返回当前的日期和时间,格式为
YYYY - MM - DD HH:MM:SS
。 - 示例:
SELECT NOW() AS current_datetime;
-- 获取执行查询时的当前日期时间,用于记录操作时间等
- 应用场景:在插入数据时记录创建时间、更新时间(结合
DEFAULT
约束 ),比如INSERT INTO orders (order_time) VALUES (NOW());
,或者用于查询条件,筛选最近一段时间的数据。
2. DATE()
- 功能:提取日期时间值中的日期部分,格式为
YYYY - MM - DD
。 - 示例:
SELECT DATE(NOW()) AS current_date;
-- 结果为当前日期,如 2025-06-19
- 应用场景:按日期分组统计数据,比如统计每天的订单数量
SELECT DATE(order_time) AS order_date, COUNT(*) FROM orders GROUP BY DATE(order_time);
,方便分析每日业务情况。
3. DATEDIFF()
- 功能:计算两个日期之间的天数差,语法为
DATEDIFF(date1, date2)
,结果是date1 - date2
的天数 。 - 示例:
SELECT DATEDIFF('2025-06-20', '2025-06-10') AS days_diff;
-- 结果为 10 ,计算两个日期相差天数
- 应用场景:计算用户注册时长、订单创建到完成的天数等,如
SELECT user_id, DATEDIFF(NOW(), register_date) AS days_registered FROM users;
,分析用户留存天数分布。
4. DATE_FORMAT()
- 功能:按指定格式格式化日期时间值。
- 示例:
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i:%s') AS formatted_datetime;
-- 结果如 "2025年06月19日 15:30:00" ,按自定义格式输出
- 应用场景:在生成报表、展示数据时,将日期时间格式化为符合业务需求的形式,提升可读性,比如网站显示文章发布时间为“2025年06月19日 10:00” 这种格式。
四、聚合函数(除前面提到的 SUM
、AVG
外 )
1. COUNT()
- 功能:统计查询结果的行数,有
COUNT(*)
(统计所有行,包括NULL
)、COUNT(column)
(统计指定列非NULL
值的行数 )、COUNT(DISTINCT column)
(统计指定列去重后的行数 ) 。 - 示例:
SELECT COUNT(*) AS total_rows FROM users; -- 统计用户表总记录数
SELECT COUNT(DISTINCT city) AS distinct_cities FROM users; -- 统计用户表中不同城市的数量
- 应用场景:统计数据总量、不同类别数量等,是数据分析、报表统计中最常用的函数之一,比如统计网站注册用户总数、不同商品分类的商品数量等。
2. MAX()
和 MIN()
MAX()
:返回指定列的最大值 。MIN()
:返回指定列的最小值 。- 示例:
SELECT MAX(score) AS max_score, MIN(score) AS min_score FROM student_scores;
-- 找出学生成绩表中的最高和最低分
- 应用场景:分析数据的极值情况,如商品的最高价格、最低库存,用户的最大年龄、最小注册时间等,辅助业务决策,比如找出价格最高的商品进行推广,关注库存最低的商品及时补货。
五、条件判断函数
1. IF()
- 功能:简单的条件判断,语法
IF(condition, value_if_true, value_if_false)
,若条件condition
为真,返回value_if_true
,否则返回value_if_false
。 - 示例:
SELECT name, IF(score >= 60, '及格', '不及格') AS result FROM student_scores;
-- 根据成绩判断是否及格,输出对应结果
- 应用场景:对查询结果进行简单条件转换,如根据数值判断状态、分类等,在报表展示、数据预处理时常用。
2. CASE WHEN
- 功能:更复杂的条件分支判断,有简单格式和搜索格式 。
- 简单格式:
CASE expr WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE result ELSE END
,比较expr
和value
。 - 搜索格式:
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE result ELSE END
,根据条件condition
判断。
- 简单格式:
- 示例:
-- 简单格式
SELECT name,
CASE gender
WHEN 'M' THEN '男性'
WHEN 'F' THEN '女性'
ELSE '未知'
END AS gender_cn
FROM users;
-- 搜索格式
SELECT score,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 70 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS grade
FROM student_scores;
- 应用场景:处理多条件分支的业务逻辑,如根据不同的数值范围、枚举值进行分类、转换,生成符合业务需求的结果,常用于复杂报表、数据分类统计等场景。
这些函数覆盖了 MySQL 日常使用中数据处理、查询分析、业务逻辑实现等多方面的需求,合理运用它们能大幅提升 SQL 语句的功能和效率,满足多样化的业务场景 。当然,MySQL 还有很多其他函数(如加密函数 PASSWORD()
、AES_ENCRYPT()
, JSON 函数 JSON_EXTRACT()
等 ),可根据具体业务需求进一步探索使用。