首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第1章 数据库和SQL
1-1 数据库是什么
我们身边的数据库
为什么DBMS那么重要
DBMS的种类
1-2 数据库的结构
RDBMS的常见系统结构
表的结构
1-3 SQL概要
标准SQL
SQL语句及其种类
SQL的基本书写规则
1-4 表的创建
表的内容的创建
数据库的创建(CREATE DATABASE语句)
表的创建(CREATE TABLE语句)
命名规则
数据类型的指定
约束的设置
1-5 表的删除和更新
表的删除(DROP TABLE语句)
表定义的更新(ALTER TABLE语句)
向Product表中插入数据
第2章 查询基础
2-1 SELECT语句基础
列的查询
查询出表中所有的列
为列设定别名
常数的查询
从结果中删除重复行
根据WHERE语句来选择记录
注释的书写方法
算术运算符
需要注意NULL
比较运算符
对字符串使用不等号时的注意事项
不能对NULL使用比较运算符
2-3 逻辑运算符
NOT运算符
AND运算符和OR运算符
通过括号强化处理
逻辑运算符和真值
含有NULL时的真值
第3章 聚合与排序
3-1 对表进行聚合查询
聚合函数
计算表中数据的行数
计算NULL之外的数据的行数
计算合计值
计算平均值
计算值和小值
使用聚合函数删除重复值(关键字DISTINCT)
3-2 对表进行分组
GROUP BY子句
聚合键中包含NULL的情况
使用WHERE子句时GROUP BY的执行结果
与聚合函数和GROUP BY子句有关的常见错误
3-3 为聚合结果指定条件
HAVING子句
HAVING子句的构成要素
相对于HAVING子句,更适合写在WHERE子句中的条件
3-4 对查询结果进行排序
ORDER BY子句
指定升序或降序
指定多个排序键
NULL的顺序
在排序键中使用显示用的别名
ORDER BY子句中可以使用的列
不要使用列编号
当前位置:
首页>>
技术小册>>
SQL基础教程(上)
小册名称:SQL基础教程(上)
### 3-2 对表进行分组 在SQL中,数据分组(Grouping)是一项强大的功能,它允许我们根据一个或多个列的值将表中的记录划分成不同的组,并对每个组执行聚合操作,如计算总数、平均值、最大值、最小值等。这种能力对于数据分析、报表生成和决策支持等场景至关重要。本章节将深入介绍SQL中如何对表进行分组,包括分组的基本语法、常用的聚合函数、分组过滤(HAVING子句)以及分组与排序的结合使用。 #### 3.2.1 分组的基本语法 在SQL中,`GROUP BY`子句用于指定根据哪些列的值来对表中的记录进行分组。一旦指定了分组列,SQL就会根据这些列的唯一值组合来划分记录。每个组内的记录在这些列上的值都是相同的。 **基本语法结构如下**: ```sql SELECT column_name(s), AGGREGATE_FUNCTION(column_name) FROM table_name WHERE condition GROUP BY column_name(s) ORDER BY column_name(s) | AGGREGATE_FUNCTION(column_name); ``` - `SELECT` 子句中选择要显示的列和聚合函数。 - `FROM` 子句指定要查询的表。 - `WHERE` 子句(可选)用于过滤要分组的记录。 - `GROUP BY` 子句指定用于分组的列。 - `ORDER BY` 子句(可选)用于对结果集进行排序。 **示例**: 假设我们有一个名为`sales`的表,记录了不同销售员在不同月份的销售额,表结构包括`salesperson_id`(销售员ID)、`month`(月份)和`amount`(销售额)。 如果我们想计算每个销售员的总销售额,可以这样写SQL查询: ```sql SELECT salesperson_id, SUM(amount) AS total_sales FROM sales GROUP BY salesperson_id; ``` 这条查询会按`salesperson_id`分组,并计算每个组的`amount`总和,即每个销售员的总销售额。 #### 3.2.2 常用的聚合函数 在分组查询中,经常使用的聚合函数包括: - **COUNT()**:计算行数。 - **SUM()**:计算数值列的总和。 - **AVG()**:计算数值列的平均值。 - **MAX()**:找出列中的最大值。 - **MIN()**:找出列中的最小值。 这些函数可以与`GROUP BY`子句结合使用,以提供关于数据集的统计信息。 **示例**: ```sql -- 计算每个月的总销售额 SELECT month, SUM(amount) AS total_monthly_sales FROM sales GROUP BY month; -- 计算平均销售额最高的销售员ID SELECT salesperson_id, AVG(amount) AS avg_sales FROM sales GROUP BY salesperson_id ORDER BY avg_sales DESC LIMIT 1; ``` #### 3.2.3 分组过滤(HAVING子句) 虽然`WHERE`子句可以在数据分组前对记录进行过滤,但如果你需要根据聚合函数的结果来过滤分组,就需要使用`HAVING`子句。`HAVING`子句在`GROUP BY`子句之后执行,用于过滤分组后的结果。 **基本语法**: ```sql SELECT column_name(s), AGGREGATE_FUNCTION(column_name) FROM table_name WHERE condition GROUP BY column_name(s) HAVING condition ORDER BY column_name(s) | AGGREGATE_FUNCTION(column_name); ``` **示例**: 如果我们想找出总销售额超过10000的销售员,可以这样写: ```sql SELECT salesperson_id, SUM(amount) AS total_sales FROM sales GROUP BY salesperson_id HAVING SUM(amount) > 10000; ``` 注意,这里的`HAVING SUM(amount) > 10000`不能替换为`WHERE SUM(amount) > 10000`,因为`WHERE`子句在数据分组前执行,而`SUM(amount)`是一个聚合操作,必须在分组后才能计算。 #### 3.2.4 分组与排序的结合使用 在分组查询中,经常需要对结果集进行排序,以便更好地理解数据。`ORDER BY`子句可以在`GROUP BY`子句之后使用,根据分组后的列或聚合函数的结果来排序。 **示例**: 如果我们想先按销售员ID分组计算总销售额,然后按照总销售额降序排列结果,可以这样写: ```sql SELECT salesperson_id, SUM(amount) AS total_sales FROM sales GROUP BY salesperson_id ORDER BY total_sales DESC; ``` 这个查询首先按`salesperson_id`分组,计算每个销售员的总销售额,然后按照`total_sales`降序排列结果,让我们一眼就能看出哪些销售员的销售业绩最好。 #### 3.2.5 分组查询的注意事项 1. **分组列的选择**:确保`GROUP BY`子句中列的选择是有意义的,它们应该能够清晰地定义你想要的分组方式。 2. **非聚合列的使用**:在`SELECT`子句中,除了聚合函数外,其他列必须包含在`GROUP BY`子句中,否则SQL会报错。 3. **性能考虑**:大型数据集上的分组操作可能非常耗时,特别是在没有适当索引的情况下。考虑查询优化和索引策略以提高性能。 4. **聚合函数与分组**:理解不同聚合函数的作用和它们如何与`GROUP BY`子句结合使用,是编写有效分组查询的关键。 通过本章的学习,你应该能够掌握SQL中对表进行分组的基本方法和技巧,包括如何使用`GROUP BY`子句、常用的聚合函数、`HAVING`子句进行分组过滤,以及如何将分组与排序结合使用来生成有意义的统计信息和报表。这些技能对于任何涉及数据分析和报表生成的数据库管理工作都是不可或缺的。
上一篇:
使用聚合函数删除重复值(关键字DISTINCT)
下一篇:
GROUP BY子句
该分类下的相关小册推荐:
SQL基础教程(下)
PostgreSQL入门教程
高性能的Postgres SQL
SQL基础教程(中)