基本语法
SELECT 列1, 列2, ..., 聚合函数(列)
FROM 表名
[WHERE 条件]
GROUP BY 分组列1, 分组列2, ...
[HAVING 分组后条件]
[ORDER BY 排序列];
核心功能解析
1. 单字段分组
按性别分组查询
SELECT sex, COUNT(*) AS count FROM students GROUP BY sex;
2. 多字段分组
按年龄和性别双重分组
SELECT age, sex, COUNT(*) AS count FROM students GROUP BY age, sex;
3. 与 GROUP_CONCAT() 结合
显示每个分组的所有学生姓名
SELECT dept_id, GROUP_CONCAT(name) AS students FROM students GROUP BY dept_id;
聚合函数应用
聚合函数 | 描述 | 示例 |
---|---|---|
COUNT() | 计数 | COUNT(*) 统计记录数 |
SUM() | 求和 | SUM(score) 计算总分 |
AVG() | 平均值 | AVG(height) 计算平均身高 |
MAX() | 最大值 | MAX(age) 查找最大年龄 |
MIN() | 最小值 | MIN(login_date) 查找最早登录 |
STD() | 标准差 | STD(score) 计算成绩标准差 |
VARIANCE() | 方差 | VARIANCE(price) 计算价格方差 |
统计各部门学生数量、平均年龄和最大身高
SELECT dept_id, COUNT(*) AS student_count, AVG(age) AS avg_age, MAX(height) AS max_height FROM students GROUP BY dept_id;
高级分组特性
1. WITH ROLLUP 小计功能
按部门和性别分组,并添加小计行
SELECT dept_id, sex, COUNT(*) AS count FROM students GROUP BY dept_id, sex WITH ROLLUP;
2. HAVING 子句过滤分组
筛选学生数超过3人的部门
SELECT dept_id, COUNT(*) AS student_count FROM students GROUP BY dept_id HAVING COUNT(*) > 3;
3. 分组排序
按平均身高降序排列各部门
SELECT dept_id, AVG(height) AS avg_height FROM students GROUP BY dept_id ORDER BY avg_height DESC;
使用注意事项
1. SELECT 子句限制:
GROUP BY 子句中的列必须出现在 SELECT 子句中
或者列必须包含在聚合函数中
2. NULL 值处理:
GROUP BY 会将所有 NULL 值分到同一组
可以使用 `IFNULL()` 函数处理 NULL 值
3. 性能优化:
为分组字段建立索引
避免在大表上使用复杂的多字段分组
使用 WHERE 先过滤数据再分组
4. 与 DISTINCT 区别:
GROUP BY 通常配合聚合函数使用
DISTINCT 只是简单去重
实际应用场景
1. 销售数据分析
按产品和月份统计销售额
SELECT product_id, DATE_FORMAT(order_date, '%Y-%m') AS month, SUM(quantity * price) AS total_sales FROM orders GROUP BY product_id, DATE_FORMAT(order_date, '%Y-%m');
2. 用户行为分析
统计用户每日活跃时段
SELECT user_id, HOUR(login_time) AS hour_of_day, COUNT(*) AS login_count FROM user_logins GROUP BY user_id, HOUR(login_time);
3. 成绩统计分析
各科目成绩分布统计
SELECT subject, FLOOR(score/10)*10 AS score_range, COUNT(*) AS student_count, GROUP_CONCAT(student_name) AS students FROM exam_results GROUP BY subject, FLOOR(score/10)*10 ORDER BY subject, score_range;
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程