当前位置: 首页 > news >正文

MySQL 常用内置函数与高级查询技巧,看这一篇就够了!

📚你是否曾在写 SQL 时对函数一头雾水?是否想知道如何快速实现数据排名、分组统计?本文将带你全面掌握 MySQL 内置函数(数字、字符串、日期)以及条件判断 CASE WHEN、CTE 表达式等高级技巧,最后还附有 FineBI 数据可视化的简单集成,让你的数据库技能更上一层楼!

📌 引言

MySQL 作为最流行的关系型数据库之一,提供了丰富的内置函数,让我们能够轻松处理数据。无论是数据清洗、统计分析,还是复杂查询,熟练运用函数和表达式都能事半功倍。本文基于我的随堂笔记整理,涵盖:
数字函数:四舍五入、取整、取余、幂运算、随机数等
字符串函数:大小写转换、截取、拼接、替换、长度统计
日期函数:当前时间、日期加减、日期差、提取部分
条件判断:CASE WHEN 的两种写法及执行流程
CTE 表达式:简化子查询,提高可读性
与 FineBI 的简单集成:快速制作数据图表

无论你是刚入门的 SQL 新手,还是有一定经验的开发者,这篇文章都能帮你梳理知识,提升效率。话不多说,直接上干货!

一、数字函数:精确处理数值

  1. ROUND() – 四舍五入
    保留指定小数位数,常用于金额、统计数据的格式化。
    SELECT ROUND(98.7654321, 2); -- 98.77
    SELECT ROUND(98.7654321, 5); -- 98.76543
  2. FLOOR() 和 CEIL() – 向下/向上取整
    FLOOR(x)返回不大于 x 的最大整数。
    CEIL(x)返回不小于 x 的最小整数。
    SELECT FLOOR−6.8; -- -7
    SELECT FLOOR(20.0001); -- 20
    SELECT CEIL−6.8; -- -6
    SELECT CEIL(20.0001); -- 21
  3. MOD() – 取余数
    常用于判断奇偶、周期性计算。
    SELECT MOD(100, 7); -- 2
  4. POW() – 幂运算
    计算一个数的任意次方。
    SELECT POW(5, 3); -- 125
    SELECT POW(10, 0); -- 1
  5. RAND() – 随机数
    生成 0 到 1 之间的随机小数(包含 0,不包含 1)。配合 FLOOR 可以生成指定范围的随机整数。
    -- 生成 100~200 之间的随机整数(包含 100 和 200)
    SELECT FLOOR(RAND() * 101) + 100;

💡小技巧:要生成 m~n 之间的随机整数,公式为FLOOR(RAND() * (n - m + 1)) + m。

  1. ABS() – 绝对值
    返回数字的绝对值。
    SELECT ABS−123.45; -- 123.45
    SELECT ABS(0); -- 0

二、字符串函数:玩转文本处理

  1. 大小写转换
    LOWER(str)/UPPER(str):将字符串转为小写/大写。
    SELECT LOWER('MySql FuNcTiOns 123!'); -- mysql functions 123!
    SELECT UPPER('MySql FuNcTiOns 123!'); -- MYSQL FUNCTIONS 123!
  2. REVERSE() – 反转字符串
    SELECT REVERSE('数据分析学习'); -- 习学分析数据
    SELECT REVERSE('abc123xyz'); -- zyx321cba
  3. 字符串拼接
    CONCAT(str1, str2, ...):直接拼接。
    CONCAT_WS(separator, str1, str2, ...):用指定分隔符拼接。
    SELECT CONCAT('姓名:', '张三', '年龄:', '25'); -- 姓名:张三年龄:25
    SELECT CONCAT_WS'−','2026','03','08'; -- 2026-03-08
  4. REPLACE() – 替换子串
    SELECT REPLACE('java,python,sql', ',', '|'); -- java|python|sql
  5. 字符串截取
    SUBSTR(str, start, length)/SUBSTRING(str, start, length):从 start 开始截取 length 个字符(start 从 1 开始)。
    LEFT(str, length):从左侧截取 length 个字符。
    RIGHT(str, length):从右侧截取 length 个字符。
    -- 从第3个字符开始截取到末尾
    SELECT SUBSTR('MySQL从入门到精通', 3); -- SQL从入门到精通
    -- 从第2个字符开始截取4个字符
    SELECT SUBSTR('MySQL从入门到精通', 2, 4); -- ySQL
    -- 左侧前5个字符
    SELECT LEFT('MySQL从入门到精通', 5); -- MySQL
    -- 右侧后4个字符
    SELECT RIGHT('MySQL从入门到精通', 4); -- 到精通
  6. 字符串长度
    CHAR_LENGTH(str):字符个数(一个汉字算一个字符)。
    LENGTH(str):字节数(UTF-8 编码下,一个汉字占 3 字节)。
    SELECT CHAR_LENGTH('SQL编程你好!'); -- 8(注意感叹号也是一个字符)
    SELECT LENGTH('SQL编程你好!'); -- 14(取决于编码,UTF-8 一般为 34 + 1?)

⚠️注意:在不同字符集下,LENGTH 结果不同,实际开发中需留意。

三、日期函数:时间数据处理利器

  1. 获取当前时间
    NOW():当前系统日期和时间。
    CURRENT_DATE():当前日期。
    CURRENT_TIME():当前时间(时分秒)。
    SELECT NOW(); -- 2026-03-08 15:30:45
    SELECT CURRENT_DATE(); -- 2026-03-08
    SELECT CURRENT_TIME(); -- 15:30:45
  2. 日期加减
    使用DATE_ADD()和DATE_SUB()可以对日期进行加减操作。
    -- 往后推7天
    SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
    -- 往前推3个月
    SELECT DATE_SUB(NOW(), INTERVAL 3 MONTH);
    -- 往后推12小时
    SELECT DATE_ADD(NOW(), INTERVAL 12 HOUR);
  3. 日期差
    DATEDIFF(date1, date2)返回 date1 - date2 的天数。
    SELECT DATEDIFF'2026−03−08','2026−01−01'; -- 66
  4. 提取日期部分
    可以分别提取年、月、日、时、分、秒。
    SELECT YEAR'2025−12−2520:30:59'; -- 2025
    SELECT MONTH(...), DAY(...), HOUR(...), MINUTE(...), SECOND(...);
  5. 周中的第几天 & 年中的第几天
    WEEKDAY():周一为 0,周日为 6。
    DAYOFWEEK():周日为 1,周六为 7。
    DAYOFYEAR():一年中的第几天(1~366)。
    SELECT WEEKDAY(NOW()); -- 例如 0 代表周一
    SELECT DAYOFWEEK(NOW()); -- 例如 1 代表周日
    SELECT DAYOFYEAR(NOW()); -- 例如 67(3月8日)

四、条件判断 CASE WHEN – 灵活的分支逻辑

  1. 普通写法(支持任意条件)
    CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE resultN
    END
    从上到下判断,遇到第一个满足的条件就返回结果,后续不再执行。如果没有匹配且没有 ELSE,返回 NULL。
    示例:根据学生成绩划分等级。
    SELECT id, name, score,
    CASE
    WHEN score >= 90 THEN '优秀'
    WHEN score >= 80 THEN '良好'
    WHEN score >= 60 THEN '及格'
    ELSE '不及格'
    END AS grade
    FROM stu;
  2. 语法糖写法(仅适用于等值判断)
    如果判断条件都是同一个字段的等于比较,可以简化。
    CASE 字段
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ...
    ELSE resultN
    END
    示例:将商品分类编码映射为中文名称。
    SELECT *,
    CASE category_id
    WHEN 'c001' THEN '电脑'
    WHEN 'c002' THEN '服装'
    WHEN 'c003' THEN '美妆'
    ELSE '其它'
    END AS category_name
    FROM product;

💡注意:语法糖不能用于范围判断(如>=),仅适合枚举映射。

五、CTE 表达式(Common Table Expression) – 让子查询更清晰
CTE 允许我们定义一个临时结果集,在同一条 SQL 中多次引用,大大提高可读性。

基本语法
WITH 临时表名 AS (SELECT ...)
SELECT ... FROM 临时表名 ...;
示例1:分类查询
WITH t1 AS (SELECT * FROM product WHERE category_id IS NOT NULL),
t2 AS (SELECT * FROM product WHERE category_id IS NULL)
SELECT * FROM t1; -- 只查看有分类的商品
示例2:与窗口函数结合求 TopN
求每个部门薪资最高的前两名员工。
WITH ranked AS (
SELECT *,
RANK() OVER(PARTITION BY deptid ORDER BY salary DESC) AS rk
FROM employee
)
SELECT * FROM ranked WHERE rk <= 2;
CTE 相比子查询更加直观,尤其适合多层嵌套的场景。

六、FineBI 简单使用:让数据说话

FineBI 是帆软推出的一款商业智能工具,可以连接 MySQL 数据库,快速制作可视化图表。

基本步骤
1.在 FineBI 中新建数据连接,选择 MySQL,填写数据库地址、用户名、密码。
2.添加数据表,选择需要分析的字段。
3.创建仪表板,拖拽字段生成图表(柱状图、折线图、饼图等)。
4.设置过滤条件、联动钻取等交互功能。
(由于篇幅原因,详细步骤不再展开,有兴趣的读者可查阅 FineBI 官方文档。)

七、总结

本文详细介绍了 MySQL 中常用的数字函数、字符串函数、日期函数,以及 CASE WHEN 条件判断和 CTE 表达式的使用。这些技能在日常数据查询和分析中非常实用。建议读者在本地数据库上练习每个示例,并尝试结合真实场景编写复杂查询。
如果你觉得本文对你有帮助,欢迎点赞、收藏、转发,也欢迎在评论区留下你的疑问或心得,我们一起进步!

(注:本文基于 MySQL 8.0 编写,不同版本可能存在细微差异。)

本文为博主原创,转载请注明出处。

http://www.jsqmd.com/news/452782/

相关文章:

  • 2026年天津消防电缆生产厂家推荐:耐火、防火、阻燃、阻燃B1级等电缆厂家都包含 - 品牌2026
  • 在空论视域中:一个跨时空的思想对话——儒释道千年裂隙在自感(定稿)
  • 详细介绍:Visual Studio 原生项目(.vcxproj) 和 CMake 项目对比
  • LangChain 能干什么
  • 如何甄别专业的装修套餐企业?关键标准与选择逻辑 - 2026年企业推荐榜
  • C++11(下) 入门三部曲终章(基础篇):夯实语法,解锁基础编程能力 - 详解
  • 2026-03-09 闲话
  • 波段末段的心态
  • 模型加载权重的时候发生了什么
  • 2026年矿山煤矿电力电缆生产厂家推荐:中低压、低压、中压、变频等厂家名单 - 品牌2026
  • 2026年天津消防电缆生产厂家推荐(含耐火、阻燃、阻燃B1级等全品类) - 品牌2026
  • 346. Java IO API - 操作文件和目录
  • 0309晨间日记
  • 超越简单分类:构建面向真实世界的多层文本分类系统
  • 基于贾子军事战略理论体系的美国军事 AI 系统深度研究报告
  • Harmonyos应用示例32. 有余数的除法:分草莓动画
  • Harmonyos应用示例33. 数量间的乘除关系:倍数关系可视化
  • Harmonyos应用示例34. 万以内的数的认识:数位拨珠器
  • Harmonyos应用示例35. 万以内的数的认识:数字排序游戏
  • Harmonyos应用示例36. 万以内的加法和减法:竖式计算器
  • Harmonyos应用示例37. 万以内的加法和减法:智慧购物
  • Harmonyos应用示例38. 数学连环画:故事拼图
  • Harmonyos应用示例39. 有余数的除法:余数与除数关系
  • 拒绝全表扫描灾难:用 SSCAN 安全遍历 Redis 亿级 Set 集合
  • 2603,禁止微软更新工具
  • 2603C++,简单实现协程
  • 如何快速搭建简单SpringBoot项目网页
  • 如何使用 Python 连接 MySQL 数据库?
  • 如何在docker中的mysql容器内执行命令与执行SQL文件
  • Flutter 组件 postgres_crdt 的适配 鸿蒙Harmony 实战 - 驾驭分布式无冲突复制数据类型、实现鸿蒙端高性能离线对等同步架构方案