参数说明
| 参数 | 说明 |
|---|---|
| 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 |