0

0

如何在SQL中使用聚合函数?COUNT、SUM、AVG等详解

爱谁谁

爱谁谁

发布时间:2025-09-06 16:17:17

|

687人浏览过

|

来源于php中文网

原创

SQL聚合函数(如COUNT、SUM、AVG、MIN、MAX等)用于对数据进行汇总分析,结合GROUP BY和HAVING可实现分组统计与条件筛选,是数据分析和业务报表的核心工具。

如何在sql中使用聚合函数?count、sum、avg等详解

SQL中的聚合函数是数据分析的核心工具,它们能对一组行执行计算,并返回单个汇总值。无论是计数(COUNT)、求和(SUM)还是计算平均值(AVG),这些函数都能帮助我们从海量数据中快速提取关键信息,是生成报表、监控业务指标不可或缺的一部分。

解决方案

在SQL中,使用聚合函数的基本语法通常是将函数直接应用于你想要计算的列,并结合

FROM
WHERE
GROUP BY
HAVING
等子句来精确控制计算范围和分组逻辑。

1. COUNT:计数

COUNT
函数用于计算行数。它有几种常见的用法:

  • COUNT(*)
    :计算表中所有行的数量,包括包含NULL值的行。这是最常用的计数方式,因为它简单直接,且效率通常很高。
    SELECT COUNT(*) AS TotalOrders FROM Orders;
  • COUNT(column_name)
    :计算指定列中非NULL值的行数。如果你想知道某个字段有多少条有效记录,这个非常有用。
    SELECT COUNT(CustomerID) AS RegisteredCustomers FROM Customers;
  • COUNT(DISTINCT column_name)
    :计算指定列中唯一非NULL值的数量。这在统计不重复的实体时非常关键,比如有多少个不同的城市。
    SELECT COUNT(DISTINCT City) AS UniqueCities FROM Customers;

2. SUM:求和

SUM
函数用于计算指定数值列的总和。它只能应用于数值类型的数据。

SELECT SUM(OrderTotal) AS TotalRevenue FROM Orders WHERE OrderDate = '2023-10-26';

如果需要计算特定客户的总消费,可以结合

GROUP BY

SELECT CustomerID, SUM(OrderTotal) AS CustomerTotalSpent
FROM Orders
GROUP BY CustomerID;

3. AVG:计算平均值

AVG
函数用于计算指定数值列的平均值。它同样只适用于数值类型,并且会自动忽略NULL值。

SELECT AVG(Price) AS AverageProductPrice FROM Products WHERE Category = 'Electronics';

要计算每个类别的平均产品价格:

SELECT Category, AVG(Price) AS AveragePricePerCategory
FROM Products
GROUP BY Category;

当聚合函数与

GROUP BY
子句结合使用时,它们会为每个分组返回一个汇总值。
HAVING
子句则用于在
GROUP BY
之后过滤这些分组,基于聚合结果进行筛选。

为什么我们需要SQL聚合函数?它们在实际业务中扮演什么角色?

说起来,我常常觉得,没有聚合函数,我们就像在茫茫数据海洋里漂浮,根本抓不住重点。想象一下,如果你的数据库里有上百万条订单记录,老板问你“上个月的总销售额是多少?”或者“哪个城市的客户消费能力最强?”,你总不能一条条去数、去加吧?聚合函数就是为了解决这种“看清森林而非树木”的需求而生的。

在实际业务中,它们扮演着至关重要的角色:

  • 业务指标监控与报告: 这是最直接的应用。例如,每天、每周、每月的销售额(SUM)、订单量(COUNT)、平均客单价(AVG)。这些数据是衡量业务健康状况的生命线,是管理层做决策的基础。
  • 性能分析与趋势洞察: 通过聚合函数,我们可以分析不同时间段(GROUP BY OrderDate)的销售趋势,识别产品(GROUP BY ProductID)的畅销或滞销情况,甚至分析用户行为(GROUP BY UserID)的模式。
  • 数据质量检查: 比如
    COUNT(column_name)
    COUNT(*)
    的对比,能快速发现某个关键字段的NULL值比例,这直接关系到数据的完整性和可用性。
  • 资源优化与分配: 通过聚合不同区域、不同渠道的数据,企业可以更合理地分配营销预算、库存资源或人力。
  • 风险评估: 例如,计算某个供应商的历史交货准时率(COUNT(准时)/COUNT(*)),或者某个产品类别的退货率(COUNT(退货)/COUNT(销售)),这些都是风险管理的重要依据。

对我而言,聚合函数不仅仅是SQL语法的一部分,它们更是将原始数据转化为有意义信息、推动业务增长的“魔术棒”。没有它们,数据分析将寸步难行。

COUNT(*)、COUNT(column_name) 和 COUNT(DISTINCT column_name) 有何不同?何时选用?

这三者是

COUNT
函数最常见的变体,初学者确实很容易混淆,但它们之间的差异在处理实际数据时至关重要。

  • *`COUNT()`:计算所有行**

    • 含义: 它会计算指定表或查询结果集中所有行的数量,无论这些行中的任何列是否包含NULL值。它的效率通常很高,因为数据库系统可以直接从索引或行元数据中获取行数。
    • 何时选用: 当你只需要知道一个表或一个特定筛选条件下的总记录数时,比如“我们总共有多少个客户?”或者“这个月发出了多少份订单?”。
    • 示例:
      SELECT COUNT(*) FROM Employees;
      (统计所有员工人数)
  • COUNT(column_name)
    :计算指定列的非NULL值行

    • 含义: 它只计算
      column_name
      列中值不为NULL的行的数量。如果某行的
      column_name
      字段是NULL,则该行不会被计入。
    • 何时选用: 当你需要了解某个特定属性的“有效”或“已填写”记录数时。比如,你可能想知道“有多少客户填写了他们的邮箱地址?”或者“有多少产品有具体的描述信息?”这对于数据质量分析特别有用。
    • 示例:
      SELECT COUNT(Email) FROM Customers;
      (统计填写了邮箱的客户数)
  • COUNT(DISTINCT column_name)
    :计算指定列的唯一非NULL值行

    Replit Ghostwrite
    Replit Ghostwrite

    一种基于 ML 的工具,可提供代码完成、生成、转换和编辑器内搜索功能。

    下载
    • 含义: 它会先对
      column_name
      列的值进行去重,然后再计算去重后非NULL值的数量。
    • 何时选用: 当你需要统计某个属性的“种类”或“唯一实体”的数量时。比如,“我们有多少个不同的产品类别?”或者“有多少个独立的城市有我们的客户?”。
    • 示例:
      SELECT COUNT(DISTINCT Department) FROM Employees;
      (统计公司有多少个不同的部门)

一个实际的例子: 假设我们有一个

Orders
表,其中包含
OrderID
CustomerID
DeliveryAddress

  • SELECT COUNT(*) FROM Orders;
    可能会返回1000,表示总共有1000笔订单。
  • SELECT COUNT(CustomerID) FROM Orders;
    如果所有订单都有对应的客户ID,它也可能返回1000。但如果有些订单是匿名购买(
    CustomerID
    为NULL),它就会返回少于1000的值。
  • SELECT COUNT(DISTINCT CustomerID) FROM Orders;
    这会告诉我们总共有多少个独立的客户下过订单,即使同一个客户下了多笔订单,也只算一次。

理解这些差异,能让我们在数据分析时更加精准,避免因为误用而得出错误的结论。我个人在做数据清洗和报表核对时,经常会利用这三者的不同来交叉验证数据的完整性和准确性。

如何结合GROUP BY和HAVING子句,实现更复杂的数据分析?

GROUP BY
HAVING
是SQL聚合函数的高级搭档,它们让我们可以对数据进行更深层次的切片和筛选。如果说聚合函数是统计工具,那么
GROUP BY
就是分类工具,而
HAVING
则是基于分类结果的筛选器。

GROUP BY
子句:分组聚合
GROUP BY
的作用是将具有相同值的行归为一组,然后对每个组独立地应用聚合函数。

  • 基本用法: 你想根据哪个或哪些字段来“分批”进行统计,就把这些字段放到
    GROUP BY
    后面。
  • 示例: 想知道每个产品类别有多少件商品:
    SELECT Category, COUNT(ProductID) AS NumberOfProducts
    FROM Products
    GROUP BY Category;

    这里,数据库会先找出所有不同的

    Category
    值(如“电子产品”、“服装”、“图书”),然后为每个类别计算其包含的
    ProductID
    数量。

HAVING
子句:筛选分组
HAVING
子句是专门用于过滤
GROUP BY
后的分组的。它与
WHERE
子句很相似,但
WHERE
是在数据分组前对单行数据进行筛选,而
HAVING
是在数据分组后,对聚合结果进行筛选。

  • 基本用法:
    HAVING
    后面跟着的条件通常包含聚合函数。
  • 示例: 找出那些平均价格超过100元的类别:
    SELECT Category, AVG(Price) AS AveragePrice
    FROM Products
    GROUP BY Category
    HAVING AVG(Price) > 100;

    在这个例子中,首先按

    Category
    分组,然后计算每个组的
    AVG(Price)
    ,最后只保留那些
    AVG(Price)
    大于100的组。

结合WHERE、GROUP BY和HAVING的复杂分析: 这三者结合起来,可以实现非常强大的数据分析。它们的执行顺序大致是:

FROM
->
WHERE
->
GROUP BY
->
HAVING
->
SELECT
->
ORDER BY

  1. FROM
    确定数据源。
  2. WHERE
    先过滤原始行,排除不符合条件的单行数据。
  3. GROUP BY
    将经过
    WHERE
    过滤后的行进行分组。
  4. HAVING
    GROUP BY
    后的每个分组进行聚合计算,并根据聚合结果进行筛选。
  5. SELECT
    选出最终要显示的列(包括聚合函数的结果)。

一个综合示例: 我们想找出那些在2023年,总销售额超过5000元,并且至少有10笔订单的客户。

SELECT CustomerID,
       SUM(OrderTotal) AS TotalSpent,
       COUNT(OrderID) AS NumberOfOrders
FROM Orders
WHERE OrderDate BETWEEN '2023-01-01' AND '2023-12-31' -- WHERE先过滤2023年的订单
GROUP BY CustomerID                                 -- 然后按客户ID分组
HAVING SUM(OrderTotal) > 5000 AND COUNT(OrderID) >= 10; -- 最后筛选出符合条件的客户组

这个查询清晰地展示了如何层层递进地筛选和汇总数据。

WHERE
先缩小了数据集的范围,
GROUP BY
在此基础上对每个客户进行了汇总,而
HAVING
则根据汇总后的结果进一步筛选出我们真正关心的“高价值”客户。这种组合拳,在日常的数据探索和业务报表生成中,我用得非常多,它能帮助我们从海量数据中精准定位到有价值的信息。

除了COUNT、SUM、AVG,还有哪些常用的SQL聚合函数?它们有什么独特用途?

除了我们详细讨论的

COUNT
SUM
AVG
,SQL标准和各种数据库系统还提供了许多其他有用的聚合函数,它们各自有独特的用途,能帮助我们进行更全面的数据分析。

  • MIN(column_name)
    :最小值

    • 用途: 找出指定列中的最小(最早、最低)值。可以是数字、日期、字符串。
    • 示例: 找出最早的订单日期:
      SELECT MIN(OrderDate) AS EarliestOrderDate FROM Orders;
    • 实际场景: 寻找产品最低售价、员工最早入职时间、某个事件的最早发生时间等。
  • MAX(column_name)
    :最大值

    • 用途: 找出指定列中的最大(最晚、最高)值。同样适用于数字、日期、字符串。
    • 示例: 找出最贵的商品价格:
      SELECT MAX(Price) AS HighestProductPrice FROM Products;
    • 实际场景: 寻找产品最高售价、员工最晚入职时间、某个事件的最新发生时间等。
  • STDDEV(column_name)
    /
    STDDEV_POP(column_name)
    /
    STDDEV_SAMP(column_name)
    :标准差

    • 用途: 计算一组数值的标准差,衡量数据的离散程度。
      STDDEV_POP
      是总体标准差,
      STDDEV_SAMP
      是样本标准差。具体函数名可能因数据库系统而异(如MySQL是
      STDDEV
      ,SQL Server是
      STDEV
      )。
    • 示例: 计算产品价格的标准差:
      SELECT STDDEV(Price) AS PriceStandardDeviation FROM Products;
    • 实际场景: 在金融分析中评估投资回报的波动性,在质量控制中监控产品尺寸的一致性,或者在市场研究中分析消费者行为的稳定性。在做数据质量分析或者风险评估时,这些函数能帮我们看到数据波动有多大。
  • VARIANCE(column_name)
    /
    VAR_POP(column_name)
    /
    VAR_SAMP(column_name)
    :方差

    • 用途: 计算一组数值的方差,同样衡量数据的离散程度,是标准差的平方。
    • 示例: 计算订单金额的方差:
      SELECT VARIANCE(OrderTotal) AS OrderTotalVariance FROM Orders;
    • 实际场景: 与标准差类似,用于更深层次的统计分析。
  • GROUP_CONCAT(column_name SEPARATOR '...')
    (MySQL) /
    STRING_AGG(column_name, '...')
    (SQL Server, PostgreSQL):字符串连接

    • 用途: 将一个分组内的多行字符串值连接成一个单一的字符串。
    • 示例: 找出每个客户购买过的所有产品名称:
      -- MySQL
      SELECT CustomerID, GROUP_CONCAT(ProductName SEPARATOR ', ') AS PurchasedProducts
      FROM OrderDetails
      GROUP BY CustomerID;
      -- SQL Server / PostgreSQL
      SELECT CustomerID, STRING_AGG(ProductName, ', ') AS PurchasedProducts
      FROM OrderDetails
      GROUP BY CustomerID;
    • 实际场景: 生成摘要报告,如列出每个部门的所有员工姓名,或者每个项目涉及的所有技术标签。

这些函数极大地扩展了SQL的数据分析能力,它们不仅仅是简单的统计,更是深入理解数据分布、趋势和关联性的强大工具。在我的日常工作中,根据不同的分析需求,我会灵活地选择和组合这些聚合函数,以从数据中挖掘出更多有价值的洞察。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

684

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1117

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

359

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

717

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

419

2024.04.29

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
R 教程
R 教程

共45课时 | 5.4万人学习

SQL 教程
SQL 教程

共61课时 | 3.5万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号