SQL 查询数据:使用数据处理函数

在 SQL 操作中,数据处理函数是提升查询效率、简化数据加工的核心工具。不同数据库(如 MySQL、Oracle、SQL Server)的函数语法略有差异,本文基于 MySQL 语法,结合 user 表实战案例,详解文本、日期时间、数值三类核心处理函数的使用方法。

认识 SQL 函数

函数的定义

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.

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号