使用多列进行GROUP BY操作

使用多列进行GROUP BY操作

技术背景

在数据库操作中,我们常常需要对数据进行分组统计,这时就会用到GROUP BY语句。GROUP BY可以将数据按照指定的列进行分组,结合聚合函数,能够对每个分组进行计算,如求和、计数、求平均值等。

实现步骤

单列分组

Group By X表示将所有X值相同的记录放在一个组中。例如,对于一个记录大学课程选课情况的表Subject_Selection

1
2
3
4
5
6
7
8
9
10
11
+---------+----------+----------+
| Subject | Semester | Attendee |
+---------+----------+----------+
| ITB001 | 1 | John |
| ITB001 | 1 | Bob |
| ITB001 | 1 | Mickey |
| ITB001 | 2 | Jenny |
| ITB001 | 2 | James |
| MKB114 | 1 | John |
| MKB114 | 1 | Erica |
+---------+----------+----------+

使用GROUP BYSubject列进行分组:

1
2
3
select Subject, Count(*)
from Subject_Selection
group by Subject;

结果如下:

1
2
3
4
5
6
+---------+-------+
| Subject | Count |
+---------+-------+
| ITB001 | 5 |
| MKB114 | 2 |
+---------+-------+

多列分组

Group By X, Y表示将所有XY值都相同的记录放在一个组中。对上述表使用GROUP BYSubjectSemester两列进行分组:

1
2
3
select Subject, Semester, Count(*)
from Subject_Selection
group by Subject, Semester;

结果如下:

1
2
3
4
5
6
7
+---------+----------+-------+
| Subject | Semester | Count |
+---------+----------+-------+
| ITB001 | 1 | 3 |
| ITB001 | 2 | 2 |
| MKB114 | 1 | 2 |
+---------+----------+-------+

结合聚合函数和其他子句

使用聚合函数时,SQL语句的顺序通常为:

  1. SELECT:用于从数据库中选择数据。
  2. FROM:列出表。
  3. WHERE:过滤记录。
  4. GROUP BY:在SELECT语句中收集多个记录的数据,并按一个或多个列对结果进行分组。
  5. HAVING:与GROUP BY子句结合使用,限制返回的分组行,仅返回满足条件的组。
  6. ORDER BY:对结果集进行排序。

示例语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- GROUP BY 一个参数
SELECT column_name, AGGREGATE_FUNCTION(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

-- GROUP BY 两个参数
SELECT
column_name1,
column_name2,
AGGREGATE_FUNCTION(column_name3)
FROM
table_name
GROUP BY
column_name1,
column_name2;

核心代码

聚合函数

  • MIN():返回给定列中的最小值。
  • MAX():返回给定列中的最大值。
  • SUM():返回给定列中数值的总和。
  • AVG():返回给定列的平均值。
  • COUNT():返回给定列中的值的总数。
  • COUNT(*):返回表中的行数。

SQL脚本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
-- 查找总销售额大于950美元的销售订单
SELECT
orderId, SUM(unitPrice * qty) Total
FROM
OrderDetails
GROUP BY orderId
HAVING Total > 950;

-- 统计所有订单,按customerID分组并升序排序
SELECT
customerId, COUNT(*)
FROM
Orders
GROUP BY customerId
ORDER BY COUNT(*) ASC;

-- 查找平均单价大于10美元的类别
SELECT
categoryName, AVG(unitPrice)
FROM
Products p
INNER JOIN
Categories c ON c.categoryId = p.categoryId
GROUP BY categoryName
HAVING AVG(unitPrice) > 10;

-- 查找每个类别中最便宜的产品
SELECT categoryId,
productId,
productName,
unitPrice
FROM Products p1
WHERE unitPrice = (
SELECT MIN(unitPrice)
FROM Products p2
WHERE p2.categoryId = p1.categoryId);

-- 查找每个类别中最近日期的产品
SELECT categoryId,
productId,
productName,
unitPrice,
productDate
FROM Products p1
WHERE productDate = (
SELECT MAX(productDate)
FROM Products p2
WHERE p2.categoryId = p1.categoryId);

-- 按categoryId和productId分组
SELECT
categoryId, categoryName, productId, SUM(unitPrice)
FROM
Products p
INNER JOIN
Categories c ON c.categoryId = p.categoryId
GROUP BY categoryId, productId;

最佳实践

  • 当需要对数据进行分组统计时,合理使用GROUP BY和聚合函数可以提高查询效率。
  • 在使用聚合函数时,严格按照SELECTFROMWHEREGROUP BYHAVINGORDER BY的顺序编写语句,避免出错。
  • 根据实际需求选择合适的聚合函数,如需要求最小值使用MIN(),求平均值使用AVG()等。

常见问题

  • 语法错误:如果不按照正确的顺序编写SELECTFROMWHEREGROUP BYHAVINGORDER BY语句,可能会导致语法错误。
  • 结果不符合预期:在使用GROUP BY时,如果列名指定错误或分组逻辑不正确,可能会得到不符合预期的结果。
  • 性能问题:在处理大量数据时,GROUP BY操作可能会导致性能下降,可以通过添加合适的索引来优化性能。

使用多列进行GROUP BY操作
https://119291.xyz/posts/using-group-by-on-multiple-columns/
作者
ww
发布于
2025年6月3日
许可协议