SQL 查询数据:汇总数据

在日常的数据库操作中,我们很少只需要查询原始数据,更多时候需要对数据进行统计、汇总分析 —— 比如统计用户总数、计算平均年龄、找出年龄最大的用户等。SQL 中的聚集函数(Aggregate Function)就是专门用来实现这类需求的工具,本文将手把手教你掌握常用聚集函数的用法。

 

什么是聚集函数?

聚集函数是对一组数据进行计算并返回单个结果的函数,它能快速实现数据的汇总统计,无需手动遍历计算。常用的聚集函数包括:

  • AVG()  计算平均值

  • COUNT()   统计总数

  • MAX()  计算最大值

  • MIN()  计算最小值

  • SUM()  求和

  

常用聚集函数详解

AVG ():计算平均值

AVG() 用于计算某列的平均值,仅适用于数值型列(如年龄、金额等),会自动忽略 NULL 值。

示例 1:计算所有用户的平均年龄

> SELECT AVG(age) AS avg_age FROM `user`

avg_age|
-------+
28.3000|

1 row(s) fetched.

示例 2:计算女性用户的平均年龄

> SELECT AVG(age) AS female_avg_age FROM `user` WHERE gender = '女'

female_avg_age|
--------------+
       27.8000|

1 row(s) fetched.

 

COUNT ():统计行数

COUNT() 用于统计记录数,有两种常用用法:

  • COUNT(*):统计所有行数(包括 NULL 值);

  • COUNT(列名):统计指定列非 NULL 的行数。

示例 1:统计用户表总人数

> SELECT COUNT(*) AS total_user FROM `user`

total_user|
----------+
        10|

1 row(s) fetched.

示例 2:统计有邮箱的用户数量(排除 email 为 NULL 的记录)

> SELECT COUNT(email) AS has_email_user FROM `user`

has_email_user|
--------------+
             8|

1 row(s) fetched.

示例 3:统计性别为男性的用户数

> SELECT COUNT(*) AS male_user FROM `user` WHERE gender = '男'

male_user|
---------+
        4|

1 row(s) fetched.

 

MAX ():查找最大值

MAX() 用于获取某列的最大值,支持数值型、字符型、日期型列(字符型按字符编码排序,日期型按时间先后)。

示例 1:查找用户中最大的年龄

> SELECT MAX(age) AS max_age FROM `user`

max_age|
-------+
     35|

1 row(s) fetched.

示例 2:查找创建时间最晚的用户(结合表中 create_time 字段)

> SELECT name, create_time FROM `user` WHERE create_time = (SELECT MAX(create_time) FROM `user`)

name|create_time        |
----+-------------------+
孙七  |2025-01-27 12:17:00|

1 row(s) fetched.

 

MIN ():查找最小值

MIN() 与 MAX() 相反,用于获取某列的最小值,用法完全一致。

示例 1:查找用户中最小的年龄

> SELECT MIN(age) AS min_age FROM `user`

min_age|
-------+
     22|

1 row(s) fetched.

示例 2:查找手机号最小的用户(字符型排序)

> SELECT name, phone FROM `user` WHERE phone = (SELECT MIN(phone) FROM `user`)

name|phone      |
----+-----------+
张三  |13800138000|

1 row(s) fetched.

 

SUM ():计算总和

SUM() 用于计算某列数值的总和,仅适用于数值型列,自动忽略 NULL 值。

示例 1:计算所有男性用户的年龄总和

> SELECT SUM(age) AS male_total_age FROM `user` WHERE gender = '男'

male_total_age|
--------------+
           112|

1 row(s) fetched.

示例 2:计算年龄大于 30 岁的用户年龄总和

> SELECT SUM(age) AS over_30_total_age FROM `user` WHERE age > 30

over_30_total_age|
-----------------+
               98|

1 row(s) fetched.

 

聚集不同值(DISTINCT)

默认情况下,聚集函数会计算所有值(包括重复值);如果需要只计算唯一值,可以结合 DISTINCT 关键字。

示例 1:计算不同年龄的平均值(去重后)

-- 先看所有年龄:25、30、28、22、35、27、32、29、24、31(无重复)
-- 若有重复值(比如新增一个25岁用户),则:
> SELECT AVG(DISTINCT age) AS distinct_avg_age FROM `user`

distinct_avg_age|
----------------+
         28.3000|

1 row(s) fetched.

示例 2:统计不同性别的数量(去重)

> SELECT COUNT(DISTINCT gender) AS distinct_gender FROM `user`

distinct_gender|
---------------+
              2|

1 row(s) fetched.

 

组合聚集函数

实际场景中,我们常需要一次性获取多个汇总结果,此时可以在一个 SELECT 语句中组合多个聚集函数。

示例:一次性统计用户年龄的核心指标

> SELECT
  COUNT(*) AS total_user,        -- 总人数
  AVG(age) AS avg_age,           -- 平均年龄
  MAX(age) AS max_age,           -- 最大年龄
  MIN(age) AS min_age,           -- 最小年龄
  SUM(age) AS total_age,         -- 年龄总和
  COUNT(DISTINCT gender) AS gender_type -- 性别类型数
FROM `user`

total_user|avg_age|max_age|min_age|total_age|gender_type|
----------+-------+-------+-------+---------+-----------+
        10|28.3000|     35|     22|      283|          2|

1 row(s) fetched.

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号