基本语法

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;

点赞(2)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)