SQL GROUP BY子句

SQL GROUP BY子句

SQL GROUP BY子句

SQL的 GROUP BY 子句与SELECT语句一起使用,将相同的数据按组进行排列。该子句紧随SELECT语句的WHERE子句之后,并在ORDER BY和HAVING子句之前(如果存在)。

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

例如,如果有一个名为SALES_DATA的表格,其中包含年份、产品和销售额等列的销售数据。为了计算一年的总销售额,可以使用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, 'Hyderabad', 2000.00),
   (2, 'Khilan', 32, 'Hyderabad', 1500.00),
   (3, 'Kaushik', 23, 'Delhi', 2000.00),
   (4, 'Chaitali', 32, 'Delhi', 6500.00),
   (5, 'Hardik', 23, 'Bhopal', 8500.00),
   (6, 'Komal', 25, 'Indore', 4500.00),
   (7, 'Muffy', 25, 'Indore', 10000.00);

创建的表格如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Hyderabad 2000.00
2 Khilan 32 Hyderabad 1500.00
3 Kaushik 23 Delhi 2000.00
4 Chaitali 32 Delhi 6500.00
5 Hardik 23 Bhopal 8500.00
6 Komal 25 Indore 4500.00
7 Muffy 25 Indore 10000.00

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

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

输出

以下是生成的结果−

AGE COUNT(Name)
32 3
23 2
25 2

示例

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

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

输出

以下是上述查询的输出结果:

AGE MAX_SALARY
32 6500.00
23 8500.00
25 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;

输出

这将产生以下结果−

ADDRESS AVG_SALARY
Hyderabad 1750.000000
Delhi 4250.000000
Bhopal 8500.000000
Indore 7250.000000

多列使用GROUP BY子句

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

示例

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

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

输出

这将产生以下结果-

ADDRESS AGE TOTAL_SALARY
Hyderabad 32 3500.00
Delhi 23 2000.00
Delhi 32 6500.00
Bhopal 23 8500.00
Indore 25 14500.00

GROUP BY和ORDER BY子句

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

语法

以下是在SQL中使用GROUP BY子句与ORDER 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;

输出

以下是产生的结果 –

AGE MIN_SALARY
25 4500.00
23 2000.00
32 1500.00

GROUP BY和HAVING子句

我们也可以在表中使用GROUP BY子句和HAVING子句,根据特定条件筛选分组的数据。

语法

以下是在SQL中使用HAVING子句的GROUP BY子句的语法:

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;

输出

生成的结果如下:

ADDRESS AGE MIN_SUM
Hyderabad 32 1500.00
Delhi 32 6500.00
Indore 25 4500.00

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程