SQL GROUP BY 子句

2025年6月1日 | 阅读 7 分钟

在 SQL 中,GROUP BY 子句用于将结果集中的相似数据分组。它通常与聚合函数如 SUM()COUNT()MIN()MAX()AVG() 等一起使用。GROUP BY 主要用于当我们想基于特定列(或多列)对行进行分组时。这意味着,如果一列中的不同行具有相同的值,它会将这些行安排成一个组。我们主要使用此子句对表中的行执行计算。

语法

描述

SELECT: SELECT 语句用于显示数据库中的特定数据。

FROM: 它用于指定我们要从中选择数据的表的名称。

GROUP BY: 这是一个子句,用于根据列上给定的聚合函数对选定的数据进行分组。

aggregate_func: 这是聚合函数的名称,查询将在此函数上执行 SUM()、MIN()、MAX() 等函数。聚合函数用于对数据进行计算并返回单个集合结果。

columnName: 这是表中查询将执行的列的名称。

tableName: 这是用户正在工作和运行查询的表的名称。

GROUP BY 示例

现在让我们看一些示例,以便更清楚地理解这个主题。为此,我们将创建一个表,然后在此表上执行一些查询。

首先,我们将在数据库中创建一个名为 customers 的表。现在,让我们使用 CREATE TABLE 语句创建一个表。

现在,让我们使用 INSERT INTO 语句向 customers 表中插入行。

现在让我们检索 customers 表的值。我们将使用 SELECT 语句来获取表。

结果表

cust_idfirst_namelast_name年龄国家金额
1J.K.Rowling59英国2000.00
2艾玛Watson35英国4506.00
3ViratKohli36印度2560.00
4ShraddhaKapoor38印度2000.00
5TomCruise62USA18000.00
6JenniferLopez55USA12500.00

现在,我们将对 customers 表应用不同的 SQL 查询,以了解 GROUP BY 子句的用法。

示例 1:按单列 GROUP BY

按单列 GROUP BY 用于将具有相同值的行分组到该列中。我们将计算每个国家的总金额,并按国家名称对数据进行分组。

SQL 查询 1

使用上述查询,具有重复国家/地区的行将被归入 country 列,并且它们对应的 amount 将计算为重复行 amount 的总和。

查询输出

 
The output shows the total amount spent by all customers in each country.
国家SUM(amount)
英国6506.00
印度4560.00
USA30500.00

SQL 查询 2

使用上述查询,具有重复 country 的行将被归入单个列,并且 COUNT() 函数将计算每个国家有多少客户。

查询输出

 
The output displays that each country appears two times in the customers table.
国家COUNT(*)
英国2
印度2
USA2

示例 2:按多列 GROUP BY

GROUP BY 子句可用于按多个列对行进行分组。当我们要分析列的组合时使用它。在此示例中,我们将选择三列并查找 amount 列的总和,以查看每个唯一组的组合结果。

SQL 查询

在上面的查询中,直接选择了 first_namelast_nameage 列,然后按名字、姓氏和年龄的每个唯一组合进行分组。SUM() 函数用于对每个客户的所有 amount 值求和。

查询输出

 
Each row shows the total amount spent by a specific person with their first name, last name and age.
first_namelast_name年龄金额
J.K.Rowling59592000.00
艾玛Watson362560.00
ViratKohli362000.00
ShraddhaKapoor382000.00
TomCruise6218000.00
JenniferLopez5512500.00

示例 3:带 WHERE 子句的 GROUP BY

WHERE 子句用于在行分组之前过滤行,而 GROUP BY 子句用于对过滤后的行进行分组。如果您想按要求的数据进行分组,则必须首先使用 WHERE 子句对其进行过滤。

语法

描述

WHERE: 这是一个子句,用于在分组之前过滤行。它使用算术运算符、条件运算符等运算符来给出条件。

condition: 用于过滤我们想要分组的数据。

SQL 查询

在上面的查询中,直接选择了 first_nameage 列,然后使用 WHERE 子句过滤行,只接收年龄小于 50 的客户。GROUP BY 对过滤后的数据进行分组,SUM(amount) 对每个客户的总花费金额进行求和。

查询输出

 
Each row shows the total amount of customers younger than 50.
first_name年龄金额
艾玛354506.00
Virat362560.00
Shraddha382000.00

示例 4:带 ORDER BY 子句的 GROUP BY(分组后过滤行)

ORDER BY 子句用于在数据分组后对其进行排序。

语法

描述

ORDER BY: 这是一个子句,用于按升序或降序排列数据。默认情况下,它按升序排列行。

ASC: 用于按升序排列行。

DESC: 用于按降序排列行。

SQL 查询 1:按单列排序

上述查询将按 first_name 降序排列行。

查询输出

 
Each row is arranged in ascending order with the total amount spent by a specific person.
first_name金额
Virat2560.00
Tom18000.00
Shraddha2000.00
Jennifer12500.00
J.K.2000.00
艾玛4506.00

SQL 查询 2:按多列排序

上述查询将按 first_name 升序排列行,并按 age 降序排列行。

查询输出

 
Each row shows the total amount spent by each person and is sorted by first_name in ascending order and then by age in descending order.
first_name年龄金额
艾玛354506.00
J.K.592000.00
Jennifer5512500.00
Shraddha382000.00
Tom6218000.00
Virat362560.00

示例 5:带 HAVING 子句的 GROUP BY

HAVING 子句可用于在数据分组后对其进行过滤。如果您想从组中检索所需数据,则可以使用 HAVING 子句过滤数据。

语法

描述

HAVING: 这是一个子句,用于在分组后过滤行。它使用算术运算符、条件运算符等运算符来给出条件。

condition: 用于过滤分组后的数据。

SQL 查询

上述查询将首先按国家/地区对数据进行分组,然后 HAVING 子句将过滤分组后的数据,并显示总金额大于 5000 的行。

查询输出

 
The output shows the grouped countries where the total amount spent by the customers is greater than 5000
国家total amount
英国6506.00
USA30500.00

示例 6:同时带 WHERE 子句和 HAVING 子句的 GROUP BY

GROUP BY 子句可以与 WHERE 子句和 HAVING 子句一起使用。WHERE 子句将在分组前过滤数据,而 HAVING 子句将在分组后过滤数据。

语法

SQL 查询

上述查询将首先选择国家/地区为 India 或 USA 的行,然后按国家/地区对数据进行分组。之后,HAVING 子句过滤掉总金额小于 5000 的行。

查询输出

 
The output shows only rows with an amount less than 5000.
国家total_amount
印度4560.00

注意

  • SELECT 语句与 SQL 查询中的 GROUP BY 子句一起使用。
  • WHERE 子句在 SQL 中位于 GROUP BY 子句之前。
  • WHERE 子句用于在分组前过滤数据。
  • ORDER BY 子句在 SQL 中位于 GROUP BY 子句之后。
  • HAVING 子句在 SQL 中位于 GROUP BY 子句之后。
  • HAVING 子句用于在结果集中的分组后过滤数据。

结论

GROUP BY 子句是一个强大的 SQL 语句,用于将指定列中具有相同值的数��进行分组。在此子句中,SELECT 语句可以使用常量、聚合函数、表达式和列名。如果您想有效地解释数据库中的数据,掌握 GROUP BY 子句至关重要。


下一主题SQL 教程