mysql 专业笔记 -- 第 14 章:GROUP BY

参数说明

参数 说明
expression1, expression2, ... 未包含在聚合函数内的表达式,必须包含在 GROUP BY 子句中
aggregate_function 聚合函数,如 SUM、COUNT、MIN、MAX 或 AVG
tables 要从中检索记录的表。FROM 子句中必须至少列出一个表
WHERE conditions 可选。必须满足的条件,满足条件的记录才会被选中

第 14.1 节:使用 HAVING 的 GROUP BY

sql 复制代码
SELECT department, COUNT(*) AS "Man_Power"
FROM employees
GROUP BY department
HAVING COUNT(*) >= 10;

使用 GROUP BY ... HAVING 来过滤聚合记录,类似于使用 SELECT ... WHERE 来过滤单个记录。

你也可以写成 HAVING Man_Power >= 10,因为 HAVING 能识别"别名"。

第 14.2 节:使用 GROUP_CONCAT 的 GROUP BY

GROUP_CONCAT 用于获取每组中表达式的连接值,当某列对应多行结果时使用。例如,每个姓名对应多个分数:

表 Grade:

Name Score
Adam A+
Adam A-
Adam B
Adam C+
Bill D-
John A-
sql 复制代码
SELECT Name, GROUP_CONCAT(Score ORDER BY Score DESC SEPARATOR ' ') AS Grades
FROM Grade
GROUP BY Name;

结果:

图片占位符

复制代码
+------+------------------+
| Name | Grades           |
+------+------------------+
| Adam | A+ A- B C+       |
| Bill | D-               |
| John | A-               |
+------+------------------+

第 14.3 节:使用 MIN 函数的 GROUP BY

假设有一个员工表,每行包含员工的姓名、部门和薪水。

sql 复制代码
SELECT department, MIN(salary) AS "Lowest salary"
FROM employees
GROUP BY department;

这将告诉你哪个部门的员工薪水最低,以及该薪水是多少。要找出每个部门中薪水最低的员工姓名,则是一个不同的问题,超出了本示例的范围。请参见"分组最大值"。

第 14.4 节:带聚合函数的 GROUP BY

表 ORDERS

(原文图片占位,此处构造示例数据)

假设 orders 表结构如下:

customer total items
Bob 1300 20
Bob 800 11
Carly 1000 10
Carly 800 5
Fred 600 3
Jenny 200 2
Tess 11500 50
Tess 2500 8
SUM

返回数值列的总和。

例如,每个客户的总订单金额和总商品数:

sql 复制代码
SELECT customer, SUM(total) AS sum_total, SUM(items) AS sum_items
FROM orders
GROUP BY customer
ORDER BY customer;

结果:

customer sum_total sum_items
Bob 2100 31
Carly 1800 15
Fred 600 3
Jenny 200 2
Tess 14000 58
AVG

返回数值列的平均值。

例如,每个客户的平均订单金额:

sql 复制代码
SELECT customer, AVG(total) AS avg_total
FROM orders
GROUP BY customer
ORDER BY customer;

结果:

customer avg_total
Bob 1050
Carly 900
Fred 600
Jenny 200
Tess 7000
MAX

返回某列或表达式的最大值。

例如,每个客户的最高订单总金额:

sql 复制代码
SELECT customer, MAX(total) AS max_total
FROM orders
GROUP BY customer
ORDER BY customer;

结果:

customer max_total
Bob 1300
Carly 1000
Fred 600
Jenny 200
Tess 11500
MIN

返回某列或表达式的最小值。

例如,每个客户的最低订单总金额:

sql 复制代码
SELECT customer, MIN(total) AS min_total
FROM orders
GROUP BY customer
ORDER BY customer;

结果:

customer min_total
Bob 800
Carly 800
Fred 600
Jenny 200
Tess 2500
相关推荐
敲代码的小小酥2 分钟前
谈SpringMVC与Spring WebFlux的区别与适用场景
java·后端·spring
IT_陈寒2 分钟前
Redis开发实战:从入门到精通
前端·人工智能·后端
日日大王学编程5 分钟前
2026主流AI Agent产品分类、核心差异与技术特性全解析
人工智能·后端·python
mldong35 分钟前
同一个节点接力办几轮,流程才往下走:jeeflow 的后加签
后端·架构
量化分析码农38 分钟前
【Python量化多因子实战 03】多因子怎么合成?等权、IC 加权与回归加权实测
后端
Z21-X40 分钟前
云原生运维学习笔记:容器技术的演进、底层原理与 Docker 全生命周期管理
运维·笔记·学习·云原生
Rabitebla9 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
Decay__9 小时前
18_MySQL 智能巡检方案 —— 巡检项清单 / 一键巡检脚本 / 健康评分
运维·数据库·sql·mysql·架构
java_logo9 小时前
Docker 部署 Liquibase:轻松搭建数据库变更管理
数据库·docker·容器·数据库管理·liquibase·轩辕镜像·数据库变更
深蓝AI9 小时前
JWT 不是登录方案:三种登录态架构怎么选
后端