- 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 - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - 更新查询
- SQL - 删除查询
- SQL - 排序结果
- SQL 视图
- SQL - 创建视图
- SQL - 更新视图
- SQL - 删除视图
- SQL - 重命名视图
- SQL 运算符和子句
- SQL - WHERE 子句
- SQL - TOP 子句
- SQL - DISTINCT 子句
- SQL - ORDER BY 子句
- SQL - GROUP BY 子句
- SQL - HAVING 子句
- SQL - AND & OR
- SQL - 布尔 (BIT) 运算符
- SQL - LIKE 运算符
- SQL - IN 运算符
- SQL - ANY,ALL 运算符
- SQL - EXISTS 运算符
- SQL - CASE
- SQL - NOT 运算符
- SQL - 不等于
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 运算符
- SQL - UNION 运算符
- SQL - UNION 与 UNION ALL
- SQL - INTERSECT 运算符
- SQL - EXCEPT 运算符
- SQL - 别名
- SQL 连接
- SQL - 使用连接
- SQL - 内连接
- SQL - 左连接
- SQL - 右连接
- SQL - 交叉连接
- SQL - 全连接
- SQL - 自连接
- SQL - 删除连接
- SQL - 更新连接
- SQL - 左连接与右连接
- SQL - UNION 与 JOIN
- SQL 密钥
- SQL - 唯一键
- SQL - 主键
- SQL - 外键
- SQL - 复合键
- SQL - 备用键
- SQL 索引
- SQL - 索引
- SQL - 创建索引
- SQL - 删除索引
- SQL - 显示索引
- SQL - 唯一索引
- SQL - 聚簇索引
- SQL - 非聚簇索引
- 高级 SQL
- SQL - 通配符
- SQL - 注释
- SQL - 注入
- SQL - 托管
- SQL - MIN & MAX
- SQL - NULL 函数
- SQL - 检查约束
- SQL - 默认约束
- SQL - 存储过程
- SQL - NULL 值
- SQL - 事务
- SQL - 子查询
- SQL - 处理重复项
- SQL - 使用序列
- SQL - 自动递增
- SQL - 日期和时间
- SQL - 游标
- SQL - 公共表表达式
- SQL - GROUP BY 与 ORDER BY
- 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 | 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 |