- SQL教程
- SQL - 主页
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 数据库
- SQL - 语法
- SQL - 数据类型
- SQL - 运算符
- SQL - 表达式
- SQL数据库
- SQL-创建数据库
- SQL - 删除数据库
- SQL - 选择数据库
- SQL - 重命名数据库
- SQL - 显示数据库
- SQL-备份数据库
- SQL表
- SQL - 创建表
- SQL - 显示表
- SQL - 重命名表
- SQL - 截断表
- SQL - 克隆表
- SQL - 临时表
- SQL - 更改表
- SQL - 删除表
- SQL - 删除表
- SQL - 约束
- SQL查询
- SQL - 插入查询
- SQL - 选择查询
- SQL - 选择进入
- SQL - 插入选择
- SQL - 更新查询
- SQL - 删除查询
- SQL - 对结果进行排序
- SQL 视图
- SQL - 创建视图
- SQL - 更新视图
- SQL - 删除视图
- SQL - 重命名视图
- SQL 运算符和子句
- SQL-Where 子句
- SQL - 顶部子句
- SQL - 不同子句
- SQL - Order By 子句
- SQL - Group By 子句
- SQL-Having 子句
- SQL - 与与或
- SQL - 布尔(位)运算符
- SQL - LIKE 运算符
- SQL - IN 运算符
- SQL - ANY、ALL 运算符
- SQL - EXISTS 运算符
- SQL-案例
- SQL - NOT 运算符
- SQL - 不等于
- SQL - 为空
- SQL - 不为空
- SQL - 非空
- SQL - BETWEEN 运算符
- SQL - UNION 运算符
- SQL - UNION 与 UNION ALL
- SQL - 相交运算符
- SQL - EXCEPT 运算符
- SQL - 别名
- SQL 连接
- SQL - 使用联接
- SQL-内连接
- SQL-左连接
- SQL-右连接
- SQL-交叉连接
- SQL-全连接
- SQL-自连接
- SQL - 删除连接
- SQL - 更新连接
- SQL - 左连接与右连接
- SQL - 联合与连接
- SQL 键
- SQL - 唯一键
- SQL - 主键
- SQL-外键
- SQL - 复合键
- SQL - 备用键
- SQL索引
- SQL - 索引
- SQL - 创建索引
- SQL - 删除索引
- SQL - 显示索引
- SQL-唯一索引
- SQL - 聚集索引
- SQL - 非聚集索引
- 高级SQL
- SQL - 通配符
- SQL - 注释
- SQL-注入
- SQL-托管
- SQL - 最小值和最大值
- SQL - 空函数
- SQL - 检查约束
- SQL - 默认约束
- SQL-存储过程
- SQL - NULL 值
- SQL - 事务
- SQL - 子查询
- SQL - 处理重复项
- SQL - 使用序列
- SQL-自动递增
- SQL - 日期和时间
- SQL-游标
- SQL - 公用表表达式
- SQL - 分组依据与排序依据
- SQL - IN 与 EXISTS
- SQL——数据库调优
- SQL 函数参考
- SQL - 日期函数
- SQL - 字符串函数
- SQL - 聚合函数
- SQL - 数字函数
- SQL - 文本和图像函数
- SQL - 统计函数
- SQL - 逻辑函数
- SQL - 游标函数
- SQL-JSON 函数
- SQL - 转换函数
- SQL - 数据类型函数
- SQL 有用资源
- SQL - 问题与解答
- SQL - 快速指南
- SQL - 有用的函数
- SQL - 有用的资源
- SQL - 讨论
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 |