首页
技术小册
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基础教程(上)
### GROUP BY子句 在SQL(Structured Query Language,结构化查询语言)中,`GROUP BY`子句是一个强大的工具,它允许我们将查询结果集中的行分组为较小的集合,并对每个这样的集合执行聚合操作(如计数、求和、平均值等)。这一功能在处理包含重复数据或需要按特定列进行汇总的数据集时尤为有用。本章将深入探讨`GROUP BY`子句的工作原理、语法、使用场景以及一些高级技巧。 #### 一、`GROUP BY`子句的基本语法 `GROUP BY`子句通常与聚合函数(如`COUNT()`, `SUM()`, `AVG()`, `MAX()`, `MIN()`等)一起使用,以计算每个分组中的聚合值。其基本语法如下: ```sql SELECT column_name(s), AGGREGATE_FUNCTION(column_name) FROM table_name WHERE condition GROUP BY column_name(s) ORDER BY column_name(s); ``` - `column_name(s)`:指定了要进行分组的列名。可以是一个或多个列,当使用多个列时,它们将共同决定分组的依据。 - `AGGREGATE_FUNCTION(column_name)`:对分组后的每一组应用聚合函数,以计算该组的统计信息。 - `table_name`:指定了查询的表名。 - `WHERE`子句(可选):在分组前对记录进行过滤。 - `ORDER BY`子句(可选):对分组后的结果进行排序。 #### 二、`GROUP BY`子句的工作原理 `GROUP BY`子句首先根据指定的列(或列的组合)对结果集中的行进行排序,然后将具有相同值的行视为一个分组。之后,对每个分组应用聚合函数,以计算该组的统计信息。最后,返回每个分组的唯一值和相应的聚合结果。 重要的是要注意,`GROUP BY`子句中的列(或列的组合)必须出现在`SELECT`列表中,除非它们被用作聚合函数的一部分。此外,如果`SELECT`列表中包含非聚合列,则这些列必须全部包含在`GROUP BY`子句中。 #### 三、使用场景示例 ##### 示例1:计算每个部门的员工数量 假设有一个名为`employees`的表,包含`department_id`和`employee_name`两个字段,我们想要计算每个部门的员工数量。 ```sql SELECT department_id, COUNT(employee_name) AS employee_count FROM employees GROUP BY department_id; ``` 这条查询将返回每个`department_id`及其对应的员工数量。 ##### 示例2:计算每个部门的平均工资 继续上面的例子,如果我们还想要知道每个部门的平均工资,可以这样做: ```sql SELECT department_id, AVG(salary) AS average_salary FROM employees GROUP BY department_id; ``` 这里假设`employees`表中还包含`salary`字段。这条查询将返回每个部门的ID及其员工的平均工资。 ##### 示例3:结合`HAVING`子句进行过滤 `HAVING`子句类似于`WHERE`子句,但它用于对分组后的结果进行过滤,而不是在分组前过滤记录。例如,如果我们只想查看员工数量超过5人的部门: ```sql SELECT department_id, COUNT(employee_name) AS employee_count FROM employees GROUP BY department_id HAVING COUNT(employee_name) > 5; ``` #### 四、高级技巧 ##### 1. 多列分组 `GROUP BY`子句可以包含多个列,以实现更复杂的分组逻辑。例如,如果我们想要按部门和职位级别分组计算员工数量: ```sql SELECT department_id, job_level, COUNT(employee_name) AS employee_count FROM employees GROUP BY department_id, job_level; ``` ##### 2. 与聚合函数结合使用 除了基本的计数和平均值外,`GROUP BY`还可以与其他聚合函数结合使用,如求和(`SUM`)、最大值(`MAX`)、最小值(`MIN`)等,以满足不同的分析需求。 ##### 3. 嵌套查询与`GROUP BY` `GROUP BY`子句还可以与嵌套查询(子查询)结合使用,以实现更复杂的查询逻辑。例如,可以先通过子查询筛选出特定条件的记录,再对这些记录进行分组和聚合操作。 ##### 4. 窗口函数与`GROUP BY`的对比 虽然`GROUP BY`子句在聚合数据方面非常强大,但在某些情况下,使用窗口函数(如`ROW_NUMBER()`, `RANK()`, `SUM() OVER()`等)可能更为灵活和高效。窗口函数允许我们在不改变原始行数的情况下,对每行数据进行聚合计算,而`GROUP BY`则会将多行数据合并为一行。 #### 五、注意事项 - 确保`GROUP BY`子句中的列与`SELECT`列表中的非聚合列相匹配。 - 使用`HAVING`子句对分组后的结果进行过滤,而不是`WHERE`子句。 - 理解`GROUP BY`与窗口函数之间的区别,以便在适当的情况下选择最合适的工具。 - 在处理大数据集时,注意`GROUP BY`操作可能对性能产生影响,考虑使用索引或优化查询逻辑。 通过本章的学习,你应该能够熟练掌握`GROUP BY`子句的基本用法和高级技巧,从而在SQL查询中更加灵活地处理分组和聚合数据的需求。
上一篇:
3-2 对表进行分组
下一篇:
聚合键中包含NULL的情况
该分类下的相关小册推荐:
高性能的Postgres SQL
PostgreSQL入门教程
SQL基础教程(下)
SQL基础教程(中)