在 SQL 操作中,数据处理函数是提升查询效率、简化数据加工的核心工具。不同数据库(如 MySQL、Oracle、SQL Server)的函数语法略有差异,本文基于 MySQL 语法,结合 user 表实战案例,详解文本、日期时间、数值三类核心处理函数的使用方法。
SQL 函数是预定义的内置程序,接收输入参数后执行特定逻辑并返回结果,可用于 SELECT、WHERE、ORDER BY 等子句中,实现数据的快速转换、计算、筛选。
例如:使用 ave() 函数计算用户的平均年龄
> SELECT avg(age) as avg_age FROM `user`
avg_age|
-------+
28.3000|
1 row(s) fetched.注意,上面示例中,avg() 就是一个内置的函数。
简化复杂逻辑:无需手动编写繁琐的字符串拼接、日期计算代码;
提升查询效率:内置函数经过数据库优化,执行效率远高于手动处理;
统一数据格式:比如将手机号脱敏、日期统一为「年 - 月 - 日」格式。
文本处理函数用于对 CHAR/VARCHAR 等字符串类型数据进行操作,如拼接、截取、大小写转换等,以下是高频使用场景:
函数 | 功能 | 示例(基于用户表) |
CONCAT() | 字符串拼接 | CONCAT (name, '-', gender) → 张三 - 男 |
SUBSTRING() | 截取字符串 | SUBSTRING (phone, 1, 3) → 138(手机号前 3 位) |
REPLACE() | 替换字符串 | REPLACE (address, ' 路 ', ' 大道 ') → 替换地址中 “路” 为 “大道” |
LENGTH() | 计算字符串长度 | LENGTH (address) → 地址字符数 |
UPPER()/LOWER() | 大小写转换 | UPPER(email) → ZHANGSAN@EXAMPLE.COM |
示例 1: 显示 “姓名 - 手机号后 4 位” 格式,如 “张三 - 8000”
> SELECT CONCAT(name, '-', SUBSTRING(phone, 8, 4)) AS user_info FROM `user`
user_info|
---------+
张三-8000 |
李四-8001 |
王五-8002 |
赵六-8003 |
孙七-8004 |
周八-8005 |
吴九-8006 |
郑十-8007 |
钱十一-8008 |
孙十二-8009 |
10 row(s) fetched.示例 2:筛选地址中包含 “路” 且字符长度大于 10 的用户
> SELECT name, address FROM `user` WHERE address LIKE '%路%' AND LENGTH(address) > 10
name|address |
----+--------------+
张三 |北京市朝阳区建国路88号 |
李四 |上海市浦东新区张江路100号|
王五 |广州市天河区天河路385号 |
孙七 |杭州市西湖区西湖路58号 |
吴九 |重庆市渝中区解放碑路18号 |
郑十 |武汉市武昌区中南路99号 |
钱十一 |西安市雁塔区雁塔路15号 |
孙十二 |南京市玄武区玄武湖路78号 |
8 row(s) fetched.日期函数可实现时间提取、计算、格式转换等操作。
函数 | 功能 | 示例(基于用户表) |
DATE_FORMAT() | 日期格式转换 | DATE_FORMAT(create_time, '%Y-%m-%d') → 2025-01-05 |
YEAR()/MONTH()/DAY() | 提取年 / 月 / 日 | YEAR(create_time) → 2025 |
HOUR()/MINUTE() | 提取小时 / 分钟 | HOUR (create_time) → 14(创建时间的小时) |
DATEDIFF() | 计算两个日期差值(天) | DATEDIFF (NOW (), create_time) → 距创建天数 |
DATE_ADD() | 日期加法 | DATE_ADD (create_time, INTERVAL 7 DAY) → 加 7 天 |
示例 1:提取用户创建时间的 “年-月-日 时:分” 格式
> SELECT name,DATE_FORMAT(create_time, '%Y-%m-%d %H:%i') AS create_time_format FROM `user`
name|create_time_format|
----+------------------+
张三 |2025-01-24 02:41 |
李四 |2025-01-18 14:22 |
王五 |2025-01-19 15:49 |
赵六 |2025-01-11 11:56 |
孙七 |2025-01-27 12:17 |
周八 |2025-01-12 01:37 |
吴九 |2025-01-06 19:15 |
郑十 |2025-01-26 19:22 |
钱十一 |2025-01-22 15:08 |
孙十二 |2025-01-01 17:34 |
10 row(s) fetched.示例 2:查询 2025 年 1 月创建的用户
> SELECT name, phone, create_time FROM `user` WHERE YEAR(create_time) = 2025 AND MONTH(create_time) = 1
name|phone |create_time |
----+-----------+-------------------+
张三 |13800138000|2025-01-24 02:41:00|
李四 |13800138001|2025-01-18 14:22:00|
王五 |13800138002|2025-01-19 15:49:00|
赵六 |13800138003|2025-01-11 11:56:00|
孙七 |13800138004|2025-01-27 12:17:00|
周八 |13800138005|2025-01-12 01:37:00|
吴九 |13800138006|2025-01-06 19:15:00|
郑十 |13800138007|2025-01-26 19:22:00|
钱十一 |13800138008|2025-01-22 15:08:00|
孙十二 |13800138009|2025-01-01 17:34:00|
10 row(s) fetched.示例 3:计算用户创建时间距今的天数
> SELECT name,DATEDIFF(CURDATE(), DATE(create_time)) AS days_since_create FROM `user`
name|days_since_create|
----+-----------------+
张三 | 338|
李四 | 344|
王五 | 343|
赵六 | 351|
孙七 | 335|
周八 | 350|
吴九 | 356|
郑十 | 336|
钱十一 | 340|
孙十二 | 361|
10 row(s) fetched.
数值函数可实现四舍五入、取整、求和 / 平均值等计算,适用于统计分析场景。
函数 | 功能 | 示例(基于用户表) |
AVG() | 计算平均值 | AVG (age) → 所有用户平均年龄 |
SUM() | 求和 | SUM (age) → 所有用户年龄总和 |
MAX()/MIN() | 最大值 / 最小值 | MAX (age) → 最大年龄(孙七 35 岁) |
ROUND() | 四舍五入 | ROUND (AVG (age), 1) → 平均年龄保留 1 位小数 |
CEIL()/FLOOR() | 向上 / 向下取整 | CEIL (age/10) → 年龄按 10 向上取整(25→3) |
示例 1:统计不同性别的年龄平均值(保留 1 位小数)
> SELECT COALESCE(gender, '未知') AS gender, ROUND(AVG(age), 1) AS avg_age
FROM `user` GROUP BY gender
gender|avg_age|
------+-------+
未知 | 32.0|
男 | 28.0|
女 | 27.8|
3 row(s) fetched.示例 2:计算所有用户年龄的总和、最大值、最小值
> SELECT SUM(age) AS total_age, MAX(age) AS max_age, MIN(age) AS min_age FROM `user`
total_age|max_age|min_age|
---------+-------+-------+
283| 35| 22|
1 row(s) fetched.