易君召
易君召
发布于 2026-08-01 / 2 阅读
0

基于MySQL 8.0 的常用函数分类 + 实战示例

先准备一张测试表方便所有示例复用

CREATE TABLE `user` (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(50),
  age INT,
  salary DECIMAL(10,2),
  create_time DATETIME,
  remark TEXT
);

INSERT INTO `user` VALUES
(1,'Zhang San',25,8500.50,'2025-03-15 09:20:10','优秀员工'),
(2,'Li Si',32,12000.00,'2025-04-22 14:10:30',''),
(3,'Wang Wu',28,9600.80,'2025-05-10 16:45:00','潜力新人');

一、字符串函数

函数

作用

实战 SQL 示例

输出

CONCAT()

字符串拼接

SELECT CONCAT(username,'-',age) AS info FROM user;

Zhang San-25

CONCAT_WS()

带分隔符拼接(自动跳过 NULL)

`SELECT CONCAT_WS('

',username,remark) FROM user;`

Li Si

SUBSTRING()

截取字符串

SELECT SUBSTRING(username,1,5) FROM user;

Zhang

LEFT() / RIGHT()

左 / 右截取

SELECT LEFT(username,3),RIGHT(username,3) FROM user;

Zha、San

TRIM()

去除首尾空格

SELECT TRIM(' test ');

test

REPLACE()

字符串替换

SELECT REPLACE(username,' ','_') FROM user;

Zhang_San

UPPER() / LOWER()

大小写转换

SELECT UPPER(username),LOWER(username) FROM user;

ZHANG SAN

LENGTH()

字节长度;CHAR_LENGTH()字符长度

SELECT LENGTH('中文'),CHAR_LENGTH('中文');

6、2

-- 常用场景:手机号中间4位脱敏
SELECT CONCAT(LEFT('13812345678',3),'****',RIGHT('13812345678',4));

二、数值函数

函数

作用

示例

ROUND(x,n)

四舍五入,保留 n 位小数

SELECT ROUND(8500.567,2); -- 8500.57

FLOOR(x)

向下取整

SELECT FLOOR(9.9); --9

CEIL(x)

向上取整

SELECT CEIL(9.1); --10

MOD(a,b)

取模(取余数)

SELECT MOD(10,3); --1

ABS()

绝对值

SELECT ABS(-100);

SUM()、AVG()、MAX()、MIN()

聚合数值函数

sql

-- 薪资统计实战
SELECT 
  AVG(salary) avg_salary,
  MAX(salary) max_sal,
  FLOOR(AVG(salary)) avg_floor
FROM user;

三、日期时间函数(开发高频)

函数

说明

示例

NOW()

当前日期 + 时间 datetime

SELECT NOW();

CURDATE()

当前日期

SELECT CURDATE();

CURTIME()

当前时间

SELECT CURTIME();

DATE()

提取 datetime 中的日期部分

SELECT DATE(create_time) FROM user;

YEAR() MONTH() DAY()

提取年 / 月 / 日

DATE_ADD()

日期增加时间

SELECT DATE_ADD(NOW(),INTERVAL 7 DAY); --7天后

DATE_SUB()

日期减去时间

SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH);

DATEDIFF(a,b)

日期差值(天)a-b

SELECT DATEDIFF('2025-05-01','2025-03-01');

TIMESTAMPDIFF()

计算间隔(年 / 月 / 日 / 时)

TIMESTAMPDIFF(YEAR,'2000-01-01',CURDATE())

DATE_FORMAT()

日期格式化⭐最常用

sql

-- 日期格式化实战
SELECT DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%s') FROM user;
-- %Y4位年 %m月 %d日 %H24小时 %i分钟 %s秒

-- 查询近30天创建的数据
SELECT * FROM user 
WHERE create_time >= DATE_SUB(NOW(),INTERVAL 30 DAY);

四、流程控制函数(条件判断)

1. IF()

语法:IF(条件,满足值,不满足值)

sql

SELECT 
  username,
  salary,
  IF(salary>10000,'高薪','普通薪资') AS level
FROM user;

2. IFNULL()

IFNULL(字段,默认值):字段为 NULL 时返回默认值

sql

SELECT username, IFNULL(remark,'无备注') remark FROM user;

3. CASE WHEN ⭐复杂条件(推荐)

sql

SELECT 
  username,salary,
  CASE 
    WHEN salary >=12000 THEN 'A档'
    WHEN salary >=9000 THEN 'B档'
    ELSE 'C档'
  END AS salary_level
FROM user;

五、聚合函数(搭配 GROUP BY)

COUNT() SUM() AVG() MAX() MIN()

sql

-- 统计薪资档位人数
SELECT
  CASE 
    WHEN salary >=10000 THEN '高薪' ELSE '普通' 
  END salary_type,
  COUNT(id) count_num,
  AVG(salary) avg_sal
FROM user
GROUP BY salary_type;

注意:COUNT(*)统计所有行;COUNT(字段)忽略 NULL

六、JSON 函数(MySQL5.7+/8.0)

适合存储 json 结构数据

sql

CREATE TABLE test_json(data JSON);
INSERT INTO test_json VALUES('{"name":"tom","age":20}');

-- -> 获取json值,->> 返回字符串
SELECT data->>'$.name' FROM test_json;
-- JSON_SET 修改json字段
UPDATE test_json SET data=JSON_SET(data,'$.age',21);

七、窗口函数 MySQL8.0+(面试高频)

必须开启 MySQL8,支持排序分组排名

sql

-- 薪资排名
SELECT 
  username,salary,
  ROW_NUMBER() OVER(ORDER BY salary DESC) rn, --连续排名不并列
  RANK() OVER(ORDER BY salary DESC) rk,       --并列跳号
  DENSE_RANK() OVER(ORDER BY salary DESC) dr  --并列不跳号
FROM user;

八、常用开发综合实战案例

案例 1:用户列表信息整合、脱敏、条件标签

sql

SELECT
  id,
  CONCAT_WS(' | ',username,IFNULL(remark,'无备注')) user_info,
  IF(age>=30,'资深','青年') user_type,
  DATE_FORMAT(create_time,'%Y-%m-%d') create_date
FROM user;

案例 2:统计月度新增用户

sql

SELECT 
  DATE_FORMAT(create_time,'%Y-%m') month,
  COUNT(id) new_user_count
FROM user
GROUP BY month
ORDER BY month;

案例 3:计算员工工龄

sql

SELECT 
  username,create_time,
  TIMESTAMPDIFF(YEAR,create_time,CURDATE()) work_year
FROM user;

⚠️ 重要避坑提醒

  1. 不要在索引列上包裹函数WHERE YEAR(create_time) = 2025 无法走索引,优化写法:

sql

WHERE create_time BETWEEN '2025-01-01' AND '2025-12-31 23:59:59'
  1. IFNULL只判断 NULL,空字符串''不属于 NULL

  2. CHAR_LENGTH统计字符,LENGTH统计字节(中文 utf8mb4 占 3 字节)

  3. 窗口函数仅支持 MySQL8.0,5.7 不兼容


原文链接 https://www.yijunzhao.cn/archives/mysql-8-functions-categories-practical-examples

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/