首页
技术小册
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章 聚合与排序 在数据库管理中,数据的聚合与排序是数据处理和分析中不可或缺的两个环节。它们不仅帮助我们从海量数据中提取有价值的信息,还能使数据展示更加直观、易于理解。本章将深入探讨SQL中的聚合函数与数据排序方法,为你在数据分析和报表生成中提供强有力的工具。 #### 3.1 聚合函数简介 聚合函数(Aggregate Functions)是对一组值执行计算并返回单一值的函数。在SQL中,聚合函数常用于对表中的行进行分组后,对每个分组进行统计计算。常见的聚合函数包括`COUNT()`、`SUM()`、`AVG()`、`MAX()`和`MIN()`等。 - **COUNT()**:计算行数或指定列中非NULL值的数量。 - `SELECT COUNT(*) FROM employees;` 计算`employees`表中所有行的数量。 - `SELECT COUNT(department_id) FROM employees;` 计算`department_id`列中非NULL值的数量。 - **SUM()**:计算数值列的总和。 - `SELECT SUM(salary) FROM employees;` 计算`employees`表中所有员工的薪资总和。 - **AVG()**:计算数值列的平均值。 - `SELECT AVG(salary) FROM employees;` 计算`employees`表中所有员工薪资的平均值。 - **MAX()** 和 **MIN()**:分别找出某列的最大值和最小值。 - `SELECT MAX(salary) FROM employees;` 找出`employees`表中薪资最高的员工的薪资。 - `SELECT MIN(salary) FROM employees;` 找出`employees`表中薪资最低的员工的薪资。 #### 3.2 GROUP BY 子句 当需要对数据进行分组统计时,`GROUP BY`子句就显得尤为重要。它允许你将结果集按照一个或多个列进行分组,然后对每个分组应用聚合函数。 - **基本用法**: - `SELECT department_id, COUNT(*) FROM employees GROUP BY department_id;` 这条语句按`department_id`对员工进行分组,并计算每个部门的员工数量。 - **多列分组**: - 你可以同时按多个列进行分组,如按部门和职位分组统计员工数。 - `SELECT department_id, job_title, COUNT(*) FROM employees GROUP BY department_id, job_title;` - **与聚合函数结合使用**: - 聚合函数常与`GROUP BY`一起使用,以实现对每个分组的统计计算。 #### 3.3 HAVING 子句 虽然`WHERE`子句能够筛选行,但它不能用于聚合函数的结果。为了对聚合结果进行筛选,SQL提供了`HAVING`子句。`HAVING`子句在`GROUP BY`之后、`ORDER BY`之前使用,用于指定对分组后的结果进行筛选的条件。 - **基本用法**: - `SELECT department_id, COUNT(*) AS employee_count FROM employees GROUP BY department_id HAVING COUNT(*) > 10;` 这条语句筛选出员工数超过10人的部门及其员工数。 - **与聚合函数结合**: - `HAVING`子句可以包含任何有效的SQL条件表达式,包括聚合函数。 #### 3.4 数据排序:ORDER BY 子句 在SQL查询中,`ORDER BY`子句用于对结果集进行排序。默认情况下,排序是升序的(ASC),但你可以指定降序(DESC)来改变排序方向。 - **基本用法**: - `SELECT * FROM employees ORDER BY salary DESC;` 这条语句按薪资从高到低对员工进行排序。 - **多列排序**: - 你可以根据多个列进行排序,SQL会首先按照第一列排序,如果第一列有相同的值,则按照第二列排序,以此类推。 - `SELECT * FROM employees ORDER BY department_id ASC, salary DESC;` 首先按部门ID升序排序,如果部门ID相同,则按薪资降序排序。 - **空值排序**: - 在排序时,NULL值默认被视为最低值(在升序排序中)或最高值(在某些数据库系统中,在降序排序中可能有所不同,具体取决于数据库的实现)。你可以使用`IS NULL`或`IS NOT NULL`在`ORDER BY`中显式指定NULL值的排序位置。 #### 3.5 聚合与排序的综合应用 在实际应用中,聚合与排序常常结合使用,以生成复杂的数据分析报告。 - **示例**:查询每个部门薪资最高的员工信息。 首先,我们可能需要使用子查询或窗口函数(如`ROW_NUMBER()`)来找到每个部门薪资最高的员工,然后对这些结果进行排序(如果需要的话)。但考虑到简单性和普及性,这里提供一个使用子查询的示例: ```sql SELECT e1.* FROM employees e1 INNER JOIN ( SELECT department_id, MAX(salary) AS max_salary FROM employees GROUP BY department_id ) e2 ON e1.department_id = e2.department_id AND e1.salary = e2.max_salary ORDER BY e1.department_id, e1.salary DESC; ``` 这个查询首先通过子查询找出每个部门薪资最高的员工薪资,然后通过内连接将这些信息与原始的员工表连接起来,以获取完整的员工信息。最后,根据部门ID和薪资(降序)对结果进行排序。 #### 总结 本章详细介绍了SQL中的聚合函数、`GROUP BY`子句、`HAVING`子句以及`ORDER BY`子句的使用方法和应用场景。通过掌握这些技能,你可以更加灵活地对数据库中的数据进行统计分析和排序展示,为数据驱动的决策提供有力支持。在实际应用中,聚合与排序往往是相辅相成的,合理结合使用可以大大提高数据处理的效率和准确性。
上一篇:
含有NULL时的真值
下一篇:
3-1 对表进行聚合查询
该分类下的相关小册推荐:
SQL基础教程(下)
PostgreSQL入门教程
SQL基础教程(中)
高性能的Postgres SQL