一、Group by 分组查询
GROUP BY ⼦句的作⽤是通过⼀定的规则将⼀个数据集划分成若⼲个⼩的分组,然后针对若⼲个
分组进⾏数据处理,⽐如使⽤聚合函数对分组进⾏统计。
1.1语法
sql
SELECT {col_name | expr} ,... ,aggregate_function (aggregate_expr)
FROM table_references
GROUP BY {col_name | expr}, ...
[HAVING where_condition]
col_name | expr:要查询的列或表达式,可以有多个,必须在 GROUP BY ⼦句中作为分组的依
据
aggregate_function:聚合函数,⽐如COUNT(), SUM(), AVG(), MAX(), MIN()
aggregate_expr:聚合函数传⼊的列或表达式,如果列或表达式不在 GOURP BY ⼦句中,必须
包含中聚合函数中
1.2示例
准备测试表及数据职员表emp,列分别为:id(编号),name(姓名),role(⻆⾊),salary(薪⽔)
sql
drop table if exists emp;
create table emp (
id bigint primary key auto_increment,
name varchar(20) not null,
role varchar(20) not null,
salary decimal(10, 2) not null
);
insert into emp values (1, '⻢云', '⽼板', 1500000.00);
insert into emp values (2, '⻢化腾', '⽼板', 1800000.00);
insert into emp values (3, '张三', '程序员', 10000.00);
insert into emp values (4, '李四', '程序员', 12000.00);
insert into emp values (5, '王五', '程序员', 9000.00);
insert into emp values (6, '赵六', '程序员', 8000.00);
insert into emp values (7, '孙悟空', '游戏⻆⾊', 956.8);
insert into emp values (8, '猪悟能', '游戏⻆⾊', 700.5);
insert into emp values (9, '沙和尚', '游戏⻆⾊', 333.3);
select * from emp;

统计每个⻆⾊的⼈数
sql
mysql> select role, count(*) from emp group by role;

统计每个⻆⾊的平均⼯资,最⾼⼯资,最低⼯资
sql
mysql> select role, ROUND(avg(salary),2) as 平均⼯资, ROUND(max(salary),2) as 最⾼⼯资, ROUND(min(salary),2) as 最低⼯资 from emp group by role;

二、having子句
使用GROUPBY对结果进行分组处理之后,对分组的结果进行过滤时,不能使用WHERE子句,而要使用HAVING 子句
显示平均工资低于1500的角色和它的平均工资
sql
mysql> select role, avg(salary) from emp group by role having avg(salary) < 1500;

Having 与Where 的区别
Having ⽤于对分组结果的条件过滤
Where ⽤于对表中真实数据的条件过滤
三、内置函数
3.1⽇期函数
用于处理日期 / 时间类型数据,比如获取当前时间、日期格式化、计算日期差等。
sql
-- 1. 获取当前日期/时间
SELECT NOW(); -- 返回当前日期+时间(如:2026-02-25 15:30:20)
SELECT CURDATE(); -- 返回当前日期(如:2026-02-25)
SELECT CURTIME(); -- 返回当前时间(如:15:30:20)
-- 2. 日期格式化(DATE_FORMAT:按指定格式转换日期)
-- 格式符:%Y(4位年)、%m(2位月)、%d(2位日)、%H(24小时)、%i(分)、%s(秒)
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2026-02-25
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i'); -- 2026年02月25日 15:30
-- 3. 日期增减(DATE_ADD/DATE_SUB)
SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY); -- 当前日期+7天
SELECT DATE_SUB(CURDATE(), INTERVAL 1 MONTH); -- 当前日期-1个月
-- 4. 计算日期差(DATEDIFF:结束日期-开始日期,返回天数)
SELECT DATEDIFF('2026-03-01', '2026-02-25'); -- 4(2月25到3月1日差4天)
-- 5. 提取日期部分(YEAR/MONTH/DAY/HOUR)
SELECT YEAR(NOW()); -- 2026(提取年份)
SELECT MONTH(NOW()); -- 2(提取月份)
SELECT DAY(NOW()); -- 25(提取日期)
3.2字符串处理函数
用于处理文本类型数据,比如拼接、截取、替换、大小写转换等。
sql
-- 1. 字符串拼接(CONCAT)
SELECT CONCAT('Hello', ' ', 'MySQL'); -- Hello MySQL
-- 2. 字符串截取(SUBSTRING:字符串, 起始位置, 长度)
SELECT SUBSTRING('PythonMySQL', 7, 5); -- MySQL(从第7位开始取5位)
-- 3. 替换字符串(REPLACE)
SELECT REPLACE('abc123abc', 'abc', 'xyz'); -- xyz123xyz
-- 4. 大小写转换
SELECT UPPER('mysql'); -- MYSQL(转大写)
SELECT LOWER('MYSQL'); -- mysql(转小写)
-- 5. 去除空格(TRIM:去除首尾空格;LTRIM:左空格;RTRIM:右空格)
SELECT TRIM(' MySQL '); -- MySQL
-- 6. 获取字符串长度(LENGTH:字节长度;CHAR_LENGTH:字符长度)
SELECT LENGTH('MySQL'); -- 5(英文占1字节)
SELECT LENGTH('数据库'); -- 9(UTF8下中文占3字节)
SELECT CHAR_LENGTH('数据库'); -- 3(字符数)
3.3数学函数
用于数值计算,比如取整、四舍五入、随机数、绝对值等。
sql
-- 1. 四舍五入(ROUND:数值, 保留小数位)
SELECT ROUND(3.1415, 2); -- 3.14
SELECT ROUND(3.5); -- 4(默认保留0位)
-- 2. 取整(FLOOR向下取整,CEIL向上取整)
SELECT FLOOR(3.9); -- 3
SELECT CEIL(3.1); -- 4
-- 3. 绝对值
SELECT ABS(-10.5); -- 10.5
-- 4. 随机数(RAND():返回0-1之间的随机小数)
SELECT RAND(); -- 如:0.87654321
SELECT FLOOR(RAND()*100); -- 0-99的随机整数
-- 5. 取余(MOD)
SELECT MOD(10, 3); -- 1(10除以3的余数)
-- 6. 幂运算(POWER)
SELECT POWER(2, 3); -- 8(2的3次方)
3.4、其他常用函数
这类函数覆盖空值处理、条件判断、聚合计算等高频场景。
sql
-- 1. 空值处理(IFNULL:如果值为NULL,替换为指定值)
SELECT IFNULL(NULL, '空值'); -- 空值
SELECT IFNULL('有值', '空值'); -- 有值
-- 2. 条件判断(IF:IF(条件, 满足返回值, 不满足返回值))
SELECT IF(10>5, '成立', '不成立'); -- 成立
SELECT IF(score>=60, '及格', '不及格') FROM student; -- 按分数判断
-- 3. 多条件判断(CASE WHEN)
SELECT
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS 成绩等级
FROM student;
-- 4. 聚合函数(统计用,常配合GROUP BY)
SELECT COUNT(*) FROM student; -- 统计总行数
SELECT SUM(score) FROM student; -- 求和
SELECT AVG(score) FROM student; -- 平均值
SELECT MAX(score) FROM student; -- 最大值
SELECT MIN(score) FROM student; -- 最小值
-- 5. 去重(DISTINCT)
SELECT DISTINCT class FROM student; -- 统计不重复的班级
总结
- MySQL 内置函数按功能可分为日期、字符串、数学、聚合 / 条件等类别,直接调用即可高效处理数据;
- 日期函数核心是
NOW()/CURDATE()(获取时间)、DATE_FORMAT()(格式化)、DATEDIFF()(算差值); - 字符串函数常用
CONCAT()(拼接)、SUBSTRING()(截取)、REPLACE()(替换); - 数学函数重点掌握
ROUND()(四舍五入)、RAND()(随机数); - 空值处理
IFNULL()、条件判断IF()/CASE WHEN是业务开发中高频使用的函数。
CRUD总结
