当前位置:  首页>> 技术小册>> SQL基础教程(上)

3-1 对表进行聚合查询

在数据库管理系统中,聚合查询是一种强大的工具,它允许我们根据一组行计算出单个值,如总和、平均值、最大值、最小值或计数等。这些操作对于数据分析、报告生成以及理解数据分布至关重要。在本章“3-1 对表进行聚合查询”中,我们将深入探讨SQL中的聚合函数及其使用方法,了解如何通过聚合查询从表中提取有价值的信息。

3.1.1 聚合函数简介

SQL提供了几种内置的聚合函数,用于对一组值执行计算并返回一个结果。这些函数包括:

  • COUNT():计算行数。
  • SUM():计算数值列中值的总和。
  • AVG():计算数值列中值的平均值。
  • MAX():找出列中的最大值。
  • MIN():找出列中的最小值。

3.1.2 使用COUNT()函数

COUNT()函数是最基本的聚合函数之一,用于计算表中的行数或者特定条件下的行数。它有两种常见用法:COUNT(*)COUNT(列名)

  • COUNT(*):计算包括NULL值在内的所有行数。

    1. SELECT COUNT(*) FROM employees;

    这条语句会返回employees表中的总行数。

  • COUNT(列名):计算指定列中非NULL值的数量。

    1. SELECT COUNT(email) FROM employees;

    这条语句会返回employees表中email列非NULL值的数量。

3.1.3 使用SUM()、AVG()函数

SUM()AVG()函数通常用于数值列,以计算总和或平均值。

  • SUM()示例:

    1. SELECT department_id, SUM(salary) AS total_salary
    2. FROM employees
    3. GROUP BY department_id;

    此查询按department_id分组,并计算每个部门的总薪资。

  • AVG()示例:

    1. SELECT department_id, AVG(salary) AS average_salary
    2. FROM employees
    3. GROUP BY department_id;

    此查询同样按department_id分组,但计算的是每个部门的平均薪资。

3.1.4 使用MAX()和MIN()函数

MAX()MIN()函数用于找出列中的最大值和最小值,它们同样适用于数值列和非数值列(如字符串,但在非数值列中主要用于日期或文本排序)。

  • MAX()示例:

    1. SELECT MAX(salary) AS highest_salary
    2. FROM employees;

    这条语句会返回employees表中薪资最高的值。

  • MIN()示例:

    1. SELECT MIN(hire_date) AS earliest_hire_date
    2. FROM employees;

    这条语句会返回employees表中最早的入职日期。

3.1.5 GROUP BY子句

在进行聚合查询时,GROUP BY子句至关重要。它允许我们将结果集按照一个或多个列进行分组,以便对每个分组独立应用聚合函数。

  • 单列分组

    1. SELECT department_id, COUNT(*) AS num_employees
    2. FROM employees
    3. GROUP BY department_id;

    department_id分组并计算每个部门的员工数。

  • 多列分组

    1. SELECT department_id, job_title, COUNT(*) AS num_employees
    2. FROM employees
    3. GROUP BY department_id, job_title;

    同时按department_idjob_title分组,计算每个部门内每个职位的员工数。

3.1.6 HAVING子句

虽然WHERE子句用于过滤行,但HAVING子句用于过滤分组后的结果集。它通常与GROUP BY一起使用,以应用条件到聚合函数的结果上。

  • HAVING示例

    1. SELECT department_id, AVG(salary) AS average_salary
    2. FROM employees
    3. GROUP BY department_id
    4. HAVING AVG(salary) > 50000;

    这条语句查找平均薪资超过50000的部门及其平均薪资。

3.1.7 聚合查询的注意事项

  • 非聚合列的选择:在SELECT语句中使用GROUP BY时,所有非聚合列都必须包含在GROUP BY子句中。
  • 空值处理:聚合函数如COUNT(列名)会忽略NULL值,而COUNT(*)会计算所有行。
  • 性能考虑:聚合查询可能涉及大量数据的处理,特别是在大型数据库上执行时。优化查询(如使用索引、减少数据扫描量)是提高性能的关键。
  • 理解数据:在进行聚合查询之前,了解数据的结构和分布对于选择正确的聚合函数和分组策略至关重要。

3.1.8 实战练习

为了巩固所学知识,以下是一些实践练习题目,建议读者尝试解答:

  1. 查询每个部门员工数量的分布情况。
  2. 计算公司内各职位的平均薪资,并筛选出平均薪资超过一定水平的职位。
  3. 分析每个部门薪资最高和最低的员工的详细信息。

通过这些练习,读者不仅能加深对聚合查询的理解,还能学会如何根据实际情况灵活运用SQL进行数据分析。

结语

在数据库管理和数据分析领域,掌握聚合查询是不可或缺的技能。通过对本章内容的学习,读者应该能够熟练使用SQL中的聚合函数(如COUNT()SUM()AVG()MAX()MIN())以及GROUP BYHAVING子句来执行复杂的聚合查询。这些技能将帮助读者从数据库中提取出有价值的信息,为数据驱动的决策提供有力支持。


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