SQL - GROUP BY 子句



SQL GROUP BY 子句

SQL 的GROUP BY 子句与 SELECT 语句一起使用,用于将相同的数据排列成组。此子句位于 SELECT 语句中的 WHERE 子句之后,并在 ORDER BY 和 HAVING 子句(如果存在)之前。

根据特定列对表中的记录进行分组的主要目的是对这些组执行计算。因此,GROUP BY 子句通常与聚合函数一起使用,例如 SUM()、COUNT()、AVG()、MAX() 或 MIN() 等。

例如,如果您有一个名为 SALES_DATA 的表,其中包含带有 YEAR、PRODUCT 和 SALES 列的销售数据。要计算一年中的总销售额,可以使用 GROUP BY 子句根据年份对该表中的记录进行分组,并使用 SUM() 函数计算每个组中的销售额总和。

语法

以下是 SQL GROUP BY 子句的基本语法:

SELECT column_name(s)
FROM table_name
GROUP BY column_name(s);

其中,column_name(s) 指的是表中我们要根据其对数据进行分组的一个或多个列的名称,而 table_name 指的是我们要从中检索数据的表的名称。

带有聚合函数的 GROUP BY 子句

通常,我们对表的记录进行分组以对其执行计算。因此,SQL GROUP BY 子句通常与聚合函数一起使用,例如 SUM()、AVG()、MIN()、MAX()、COUNT() 等。

示例

假设我们创建了一个名为 CUSTOMERS 的表,其中包含客户的个人详细信息,包括他们的姓名、年龄、地址和工资,使用以下查询:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

现在使用 INSERT 语句将值插入此表,如下所示:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

创建的表如下所示:

ID 姓名 年龄 地址 工资
1 Ramesh 32 艾哈迈达巴德 2000.00
2 Khilan 25 德里 1500.00
3 Kaushik 23 科塔 2000.00
4 Chaitali 25 孟买 6500.00
5 Hardik 27 博帕尔 8500.00
6 Komal 22 海得拉巴 4500.00
7 Muffy 24 因多尔 10000.00

以下 SQL 查询根据 AGE 对 CUSTOMERS 表进行分组,并计算每个组中的记录数:

SELECT AGE, COUNT(Name) FROM CUSTOMERS GROUP BY AGE;

输出

以下是产生的结果:

年龄 COUNT(Name)
32 1
25 2
23 1
27 1
22 1
24 1

示例

在以下查询中,我们正在查找每个年龄的最高工资:

SELECT AGE, MAX(salary) AS MAX_SALARY 
FROM CUSTOMERS GROUP BY AGE;

输出

以下是上述查询的输出:

年龄 MAX_SALARY
32 2000.00
25 6500.00
23 2000.00
27 8500.00
22 4500.00
24 10000.00

类似地,我们可以根据 AGE 列对 CUSTOMERS 表的记录进行分组,并分别使用 MIN()、AVG() 和 SUM() 函数计算每个组中的 SALARY 值的最大值、平均值和总和。

单个列上的 GROUP BY 子句

当我们将 GROUP BY 子句与单个列一起使用时,表中在该特定列中具有相同值的全部行将合并为一条记录。

示例

在以下示例中,我们根据 ADDRESS 列对上面创建的 CUSTOMERS 表进行分组,并计算每个城市的客户的平均工资:

SELECT ADDRESS, AVG(SALARY) as AVG_SALARY 
FROM CUSTOMERS GROUP BY ADDRESS;

输出

这将产生以下结果:

地址 AVG_SALARY
艾哈迈达巴德 2000.000000
德里 1500.000000
科塔 2000.000000
孟买 6500.000000
博帕尔 8500.000000
海得拉巴 4500.000000
因多尔 10000.000000

具有多个列的 GROUP BY 子句

当我们将 GROUP BY 子句与多个列一起使用时,表中在所有指定列中具有相同值的全部行将合并为一个组。

示例

在以下查询中,我们根据 ADDRESS 和 AGE 列对 CUSTOMERS 表的记录进行分组,并:

SELECT ADDRESS, AGE, SUM(SALARY) AS TOTAL_SALARY 
FROM CUSTOMERS GROUP BY ADDRESS, AGE;

输出

这将产生以下结果:

地址 年龄 TOTAL_SALARY
艾哈迈达巴德 32 2000.00
德里 25 1500.00
科塔 23 2000.00
孟买 25 6500.00
博帕尔 27 8500.00
海得拉巴 22 4500.00
因多尔 24 10000.00

GROUP BY 与 ORDER BY 子句

我们可以在 SQL 中将 ORDER BY 子句与 GROUP BY 一起使用,以根据一个或多个列对分组数据进行排序。

语法

以下是 SQL 中使用 ORDER BY 子句与 GROUP BY 子句的语法:

SELECT column1, column2, ..., aggregate_function(columnX) AS alias
FROM table
GROUP BY column1, column2, ...
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;

示例

在这里,我们正在查找每个年龄的最高工资,并按从高到低排序:

SELECT AGE, MIN(SALARY) AS MIN_SALARY 
FROM CUSTOMERS 
GROUP BY AGE ORDER BY MIN_SALARY DESC;

输出

以下是产生的结果:

年龄 MIN_SALARY
24 10000.00
27 8500.00
22 4500.00
32 2000.00
23 2000.00
25 1500.00

GROUP BY 与 HAVING 子句

我们还可以将 GROUP BY 子句与 HAVING 子句一起使用,根据特定条件筛选表中的分组数据。

语法

以下是 SQL 中使用 ORDER BY 子句与 HAVING 子句的语法:

SELECT column1, column2, aggregate_function(column)
FROM table_name
GROUP BY column1, column2
HAVING condition;

示例

在以下查询中,我们根据客户的年龄对客户进行分组,并计算每个组的最低工资。使用 HAVING 子句,我们正在筛选年龄大于 24 的组:

SELECT ADDRESS, AGE, MIN(SALARY) AS MIN_SUM 
FROM CUSTOMERS 
GROUP BY ADDRESS, AGE HAVING AGE>24;

输出

产生的结果如下:

地址 年龄 MIN_SUM
艾哈迈达巴德 32 2000.00
德里 25 1500.00
孟买 25 6500.00
博帕尔 27 8500.00
广告