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 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

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

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

输出

以下是产生的结果 -

年龄 COUNT(姓名)
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;

输出

这将产生以下结果 -

地址 平均工资
艾哈迈达巴德 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;

输出

以下是产生的结果 -

年龄 最低工资
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