当前位置:  首页>> 技术小册>> 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 NULLIS NOT NULLORDER BY中显式指定NULL值的排序位置。

3.5 聚合与排序的综合应用

在实际应用中,聚合与排序常常结合使用,以生成复杂的数据分析报告。

  • 示例:查询每个部门薪资最高的员工信息。
    首先,我们可能需要使用子查询或窗口函数(如ROW_NUMBER())来找到每个部门薪资最高的员工,然后对这些结果进行排序(如果需要的话)。但考虑到简单性和普及性,这里提供一个使用子查询的示例:

    1. SELECT e1.*
    2. FROM employees e1
    3. INNER JOIN (
    4. SELECT department_id, MAX(salary) AS max_salary
    5. FROM employees
    6. GROUP BY department_id
    7. ) e2 ON e1.department_id = e2.department_id AND e1.salary = e2.max_salary
    8. ORDER BY e1.department_id, e1.salary DESC;

    这个查询首先通过子查询找出每个部门薪资最高的员工薪资,然后通过内连接将这些信息与原始的员工表连接起来,以获取完整的员工信息。最后,根据部门ID和薪资(降序)对结果进行排序。

总结

本章详细介绍了SQL中的聚合函数、GROUP BY子句、HAVING子句以及ORDER BY子句的使用方法和应用场景。通过掌握这些技能,你可以更加灵活地对数据库中的数据进行统计分析和排序展示,为数据驱动的决策提供有力支持。在实际应用中,聚合与排序往往是相辅相成的,合理结合使用可以大大提高数据处理的效率和准确性。


该分类下的相关小册推荐: