在 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.