首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL常用函数完全指南:提升你的数据处理效率

MySQL常用函数完全指南:提升你的数据处理效率

作者头像
编程小白狼
发布2025-12-24 08:44:14
发布2025-12-24 08:44:14
1780
举报
文章被收录于专栏:编程小白狼编程小白狼

MySQL作为最流行的关系型数据库之一,提供了丰富的内置函数来简化数据处理和转换操作。掌握这些函数不仅能提高开发效率,还能优化查询性能。本文将系统性地介绍MySQL中各类常用函数,并通过实际示例帮助你快速上手。

一、字符串处理函数

字符串函数是日常开发中最常用的函数类别,主要用于文本数据的处理和转换。

1. 基础字符串操作
代码语言:javascript
复制
-- 字符串连接
SELECT CONCAT('Hello', ' ', 'World'); -- Hello World
SELECT CONCAT_WS('-', '2023', '12', '01'); -- 2023-12-01 (使用分隔符连接)

-- 大小写转换
SELECT UPPER('mysql'); -- MYSQL
SELECT LOWER('MySQL'); -- mysql

-- 去除空格
SELECT TRIM('  hello  '); -- 'hello'
SELECT LTRIM('  hello'); -- 'hello'
SELECT RTRIM('hello  '); -- 'hello'
2. 字符串截取与定位
代码语言:javascript
复制
-- 获取字符串长度
SELECT LENGTH('MySQL'); -- 5 (字节数)
SELECT CHAR_LENGTH('数据库'); -- 3 (字符数)

-- 字符串截取
SELECT SUBSTRING('MySQL Database', 1, 5); -- MySQL
SELECT LEFT('MySQL', 2); -- My
SELECT RIGHT('MySQL', 3); -- SQL

-- 查找位置
SELECT LOCATE('SQL', 'MySQL SQL'); -- 3
SELECT INSTR('MySQL', 'SQL'); -- 3
3. 字符串替换与格式化
代码语言:javascript
复制
-- 替换字符串
SELECT REPLACE('Hello World', 'World', 'MySQL'); -- Hello MySQL

-- 重复字符串
SELECT REPEAT('Ha', 3); -- HaHaHa

-- 反转字符串
SELECT REVERSE('ABCDE'); -- EDCBA

-- 格式化字符串
SELECT LPAD('5', 3, '0'); -- 005
SELECT RPAD('Name', 10, '*'); -- Name******

二、数值计算函数

数值函数用于数学计算和数值格式化,在统计分析和数据计算中非常实用。

1. 基本数学运算
代码语言:javascript
复制
-- 四舍五入
SELECT ROUND(123.4567, 2); -- 123.46
SELECT ROUND(123.4567); -- 123

-- 向上/向下取整
SELECT CEIL(123.1); -- 124
SELECT FLOOR(123.9); -- 123

-- 绝对值
SELECT ABS(-123); -- 123

-- 取余数
SELECT MOD(10, 3); -- 1

-- 幂运算
SELECT POWER(2, 3); -- 8
SELECT SQRT(16); -- 4
2. 数值格式化与比较
代码语言:javascript
复制
-- 格式化数字
SELECT FORMAT(1234567.89, 2); -- 1,234,567.89

-- 截断小数
SELECT TRUNCATE(123.4567, 2); -- 123.45

-- 符号判断
SELECT SIGN(-10); -- -1
SELECT SIGN(0); -- 0
SELECT SIGN(10); -- 1

-- 随机数
SELECT RAND(); -- 0.0到1.0之间的随机数
SELECT RAND() * 100; -- 0到100之间的随机数

三、日期时间函数

日期时间函数对于处理时间序列数据、生成报表和进行时间计算至关重要。

1. 获取当前时间
代码语言:javascript
复制
-- 获取当前日期时间
SELECT NOW(); -- 2023-12-01 15:30:45
SELECT CURDATE(); -- 2023-12-01
SELECT CURTIME(); -- 15:30:45

-- 系统时间戳
SELECT CURRENT_TIMESTAMP();
SELECT UNIX_TIMESTAMP(); -- 秒级时间戳
SELECT UNIX_TIMESTAMP(NOW()) * 1000; -- 毫秒级时间戳
2. 日期时间提取与计算
代码语言:javascript
复制
-- 提取日期部分
SELECT DATE('2023-12-01 15:30:45'); -- 2023-12-01
SELECT TIME('2023-12-01 15:30:45'); -- 15:30:45
SELECT YEAR('2023-12-01'); -- 2023
SELECT MONTH('2023-12-01'); -- 12
SELECT DAY('2023-12-01'); -- 1

-- 日期加减
SELECT DATE_ADD('2023-12-01', INTERVAL 7 DAY); -- 2023-12-08
SELECT DATE_SUB('2023-12-01', INTERVAL 1 MONTH); -- 2023-11-01

-- 日期差值
SELECT DATEDIFF('2023-12-31', '2023-12-01'); -- 30
SELECT TIMEDIFF('15:30:45', '09:00:00'); -- 06:30:45
3. 日期格式化
代码语言:javascript
复制
-- 格式化日期
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 2023-12-01 15:30:45
SELECT DATE_FORMAT(NOW(), '%W, %M %d, %Y'); -- Friday, December 01, 2023

-- 常用格式符号:
-- %Y 四位年份,%y 两位年份
-- %m 月份(01-12),%c 月份(1-12)
-- %d 日期(01-31),%e 日期(1-31)
-- %H 24小时制,%h 12小时制
-- %i 分钟,%s 秒

四、聚合函数

聚合函数对数据集执行计算并返回单个值,常用于数据统计和分析。

代码语言:javascript
复制
-- 基本聚合函数
SELECT 
    COUNT(*) AS total_rows, -- 行数统计
    COUNT(DISTINCT user_id) AS unique_users, -- 去重计数
    SUM(amount) AS total_amount, -- 求和
    AVG(amount) AS avg_amount, -- 平均值
    MIN(amount) AS min_amount, -- 最小值
    MAX(amount) AS max_amount, -- 最大值
    GROUP_CONCAT(product_name) AS all_products -- 连接字符串
FROM orders
GROUP BY category_id;

-- 条件聚合
SELECT 
    SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_amount,
    SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) AS pending_amount
FROM orders;

-- 统计示例:月度销售报告
SELECT 
    DATE_FORMAT(order_date, '%Y-%m') AS month,
    COUNT(*) AS order_count,
    SUM(total_amount) AS revenue,
    AVG(total_amount) AS avg_order_value,
    MAX(total_amount) AS max_order
FROM orders
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
ORDER BY month DESC;

五、条件判断函数

条件函数用于实现类似程序中的if-else逻辑,让SQL查询更加灵活。

代码语言:javascript
复制
-- IF函数
SELECT 
    product_name,
    price,
    IF(price > 100, '高价', IF(price > 50, '中等', '低价')) AS price_level
FROM products;

-- CASE WHEN表达式
SELECT 
    user_id,
    order_amount,
    CASE 
        WHEN order_amount >= 1000 THEN 'VIP客户'
        WHEN order_amount >= 500 THEN '重要客户'
        WHEN order_amount >= 100 THEN '普通客户'
        ELSE '新客户'
    END AS customer_level
FROM orders;

-- NULL值处理
SELECT 
    COALESCE(NULL, NULL, 'default_value'); -- 返回第一个非NULL值
SELECT 
    IFNULL(NULL, 'replacement'); -- 如果为NULL则替换
SELECT 
    NULLIF(expr1, expr2); -- 两值相等返回NULL

六、类型转换函数

类型转换函数确保数据在不同类型间正确转换和处理。

代码语言:javascript
复制
-- 显式类型转换
SELECT CAST('123' AS UNSIGNED); -- 字符串转无符号整数
SELECT CONVERT('2023-12-01', DATE); -- 字符串转日期

-- 隐式转换示例
SELECT '100' + 200; -- 300 (字符串自动转数字)
SELECT CONCAT('ID:', 123); -- ID:123 (数字自动转字符串)

-- 数据类型检查
SELECT 
    column_name,
    CASE 
        WHEN ISNULL(column_name) THEN '为空'
        WHEN column_name = '' THEN '空字符串'
        ELSE '有值'
    END AS status
FROM table;

七、高级实用函数

1. 窗口函数(MySQL 8.0+)
代码语言:javascript
复制
-- 排名函数
SELECT 
    employee_id,
    department_id,
    salary,
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_in_dept,
    RANK() OVER (ORDER BY salary DESC) AS overall_rank,
    DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;

-- 累计计算
SELECT 
    order_date,
    daily_sales,
    SUM(daily_sales) OVER (ORDER BY order_date) AS cumulative_sales,
    AVG(daily_sales) OVER (ORDER BY order_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS weekly_avg
FROM sales;
2. JSON函数(MySQL 5.7+)
代码语言:javascript
复制
-- JSON处理
SELECT 
    JSON_EXTRACT('{"name": "John", "age": 30}', '$.name'); -- "John"
SELECT 
    JSON_SET('{"name": "John"}', '$.age', 30); -- 添加/修改属性
SELECT 
    JSON_ARRAY(1, 2, 3); -- [1, 2, 3]
SELECT 
    JSON_OBJECT('name', 'John', 'age', 30); -- {"name": "John", "age": 30}

八、性能优化建议

  1. 索引友好性:避免在WHERE条件中对字段使用函数,这会破坏索引使用
代码语言:javascript
复制
-- 不推荐(索引失效)
SELECT * FROM orders WHERE DATE(order_date) = '2023-12-01';

-- 推荐(可使用索引)
SELECT * FROM orders WHERE order_date >= '2023-12-01' AND order_date < '2023-12-02';
  1. 函数缓存:确定性函数(如NOW())在查询中只计算一次
  2. 批量处理:尽量在数据库层面完成计算,减少数据传输

九、实战应用示例

用户行为分析查询
代码语言:javascript
复制
-- 分析用户活跃度
SELECT 
    user_id,
    DATE(login_time) AS login_date,
    COUNT(*) AS login_count,
    TIMESTAMPDIFF(MINUTE, MIN(login_time), MAX(login_time)) AS session_duration,
    GROUP_CONCAT(DISTINCT DATE_FORMAT(login_time, '%H:00')) AS active_hours
FROM user_logs
WHERE login_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY user_id, DATE(login_time)
HAVING login_count >= 3
ORDER BY login_date DESC, login_count DESC;
销售数据统计
代码语言:javascript
复制
-- 生成销售报表
SELECT 
    p.category,
    DATE_FORMAT(o.order_date, '%Y-%m') AS month,
    COUNT(DISTINCT o.customer_id) AS customer_count,
    COUNT(o.order_id) AS order_count,
    SUM(o.quantity) AS total_quantity,
    SUM(o.amount) AS total_amount,
    ROUND(AVG(o.amount), 2) AS avg_amount,
    SUM(CASE WHEN o.payment_status = 'paid' THEN o.amount ELSE 0 END) AS paid_amount
FROM orders o
JOIN products p ON o.product_id = p.id
WHERE o.order_date >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
GROUP BY p.category, DATE_FORMAT(o.order_date, '%Y-%m')
WITH ROLLUP; -- 添加小计行

总结

MySQL函数库提供了强大的数据处理能力,合理使用这些函数可以:

  1. 减少应用层逻辑:将数据处理下推到数据库层
  2. 提高查询效率:减少不必要的数据传输
  3. 保证数据一致性:统一的数据处理规则
  4. 简化复杂操作:用一条SQL完成复杂的数据转换

掌握这些函数的关键在于理解其适用场景,避免滥用导致的性能问题。建议在实际开发中根据具体需求选择合适的函数,并在使用前通过EXPLAIN分析查询性能。

记住,最好的学习方式是在实际项目中应用这些函数,通过实践来加深理解和记忆。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、字符串处理函数
    • 1. 基础字符串操作
    • 2. 字符串截取与定位
    • 3. 字符串替换与格式化
  • 二、数值计算函数
    • 1. 基本数学运算
    • 2. 数值格式化与比较
  • 三、日期时间函数
    • 1. 获取当前时间
    • 2. 日期时间提取与计算
    • 3. 日期格式化
  • 四、聚合函数
  • 五、条件判断函数
  • 六、类型转换函数
  • 七、高级实用函数
    • 1. 窗口函数(MySQL 8.0+)
    • 2. JSON函数(MySQL 5.7+)
  • 八、性能优化建议
  • 九、实战应用示例
    • 用户行为分析查询
    • 销售数据统计
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档