MySQL 零基础教程

MySQL 聚合函数

当你从数据库检索数据时,通常不仅仅是为了查看单独的行;你往往需要对多行信息进行汇总或聚合。这就是聚合函数(Aggregate Functions)发挥作用的地方。它们对一组行执行计算并返回单个值,为你提供深入了解数据的强大洞察力。

1. COUNT:统计行数

COUNT() 函数的作用正如其名:用来计数。它可以统计表中的总行数、满足特定条件的行数,甚至特定列中非空(non-NULL)值的数量。

1.1 统计所有行

要了解表中有多少行,你可以使用 COUNT(*)

SELECT COUNT(*)
FROM city;

这个查询将返回一个数字,代表 city(城市)表中的城市总数,而不管它们的列值是什么。

1.2 使用 WHERE 统计特定行

通常,你会想要统计满足特定条件的行。你可以将 COUNT(*)WHERE 子句结合使用:

SELECT COUNT(*)
FROM city
WHERE CountryCode = 'USA';

这将告诉你 city 表中有多少个城市位于美国(USA)。

1.3 统计列中的非空值

如果你想统计特定列中有多少行具有非空(non-NULL)值,你需要使用 COUNT(column_name)。这与 COUNT(*) 不同,因为 COUNT(column_name) 会忽略 column_nameNULL 的行。

假设 city 表有一个名为 District(行政区)的列,并且某些城市可能没有指定行政区(即 DistrictNULL)。

SELECT COUNT(District)
FROM city
WHERE CountryCode = 'IND';

这个查询统计了位于印度(IND)的城市中,其 District 列具有非空值的数量。如果印度某个城市的 DistrictNULL,它将不会被包含在这个统计中。

关键区别: COUNT(*) 统计所有行,包括任何列中带有 NULL 值的行。COUNT(column_name) 仅统计 column_name 不是 NULL 的行。

1.4 统计去重后的值

有时你想知道一列中存在多少个唯一值。例如,city 表中包含了多少个不同的国家?你可以使用 COUNT(DISTINCT column_name)

SELECT COUNT(DISTINCT CountryCode)
FROM city;

这个查询将扫描 CountryCode(国家代码)列,并且每个唯一的国家代码只计算一次,从而得出列出的不同国家的总数。

2. SUM:计算数值总和

SUM() 函数计算数值列的总和。它对于获取总计非常有用,比如一个国家的总人口或各大洲的总面积。

让我们找出美国所有城市的总人口:

SELECT SUM(Population)
FROM city
WHERE CountryCode = 'USA';

这个查询将返回一个数字:CountryCode 为 'USA' 的所有城市的 Population(人口)总和。如果没有匹配的行,SUM() 会返回 NULL。如果该列包含非数值数据,则会发生错误。

3. AVG:计算平均值

AVG() 函数计算数值列的平均值(算术平均数)。与 SUM() 类似,它在计算时会忽略 NULL 值。

要查找日本城市的平均人口:

SELECT AVG(Population)
FROM city
WHERE CountryCode = 'JPN';

这将得出日本城市的平均人口。请注意,如果某个城市的人口数据为 NULL,它将被排除在此平均值计算之外。

4. MIN 与 MAX:查找极值

MIN()MAX() 函数分别从指定列中检索最小和最大值。它们可以用于数值、字符串或日期/时间列。

4.1 查找最小值

要查找法国城市中人口最少的数量:

SELECT MIN(Population)
FROM city
WHERE CountryCode = 'FRA';

此查询返回在法国城市中找到的最小 Population 值。

4.2 查找最大值

要查找中国城市中人口最多的数量:

SELECT MAX(Population)
FROM city
WHERE CountryCode = 'CHN';

这将返回中国城市的最大 Population 值。

4.3 对非数值数据使用 MIN/MAX

MIN()MAX() 也适用于查找按字母顺序排列的第一个或最后一个字符串,或者最早或最晚的日期。

让我们在 city 表中找出按字母顺序排列的第一个和最后一个城市名称:

SELECT MIN(Name), MAX(Name)
FROM city;

这将为你提供在字母表中排在最前面的城市名称,以及排在最后面的城市名称。

5. 组合使用聚合函数

你可以在单个 SELECT 语句中使用多个聚合函数:

SELECT
    COUNT(*) AS NumberOfCities,
    SUM(Population) AS TotalPopulation,
    AVG(Population) AS AveragePopulation,
    MIN(Population) AS SmallestPopulation,
    MAX(Population) AS LargestPopulation
FROM city
WHERE CountryCode = 'BRA';

这个查询为巴西的所有城市计算了五个不同的聚合值,在一个结果行中提供了一份全面的摘要。AS 关键字重命名了输出列,使结果更加清晰易读。

6. 聚合函数的重要注意事项

  • NULL 值: 所有的聚合函数(除了 COUNT(*))都会忽略它们所操作的列中的 NULL 值。如果 SUM(column_name) 遇到一个 NULL 值,它只会跳过它并对非空值求和。如果该列中的所有值都是 NULL,则 SUM()AVG()MIN()MAX() 将返回 NULL。而 COUNT(column_name) 将返回 0。
  • 不能混合独立行: 当你在没有 GROUP BY 子句(我们将在稍后介绍)的情况下使用聚合函数时,SELECT 语句只能包含聚合函数或字面量值。你不能在同一个 SELECT 列表中将聚合函数与非聚合的列名混合使用。因为聚合函数会为整个结果集返回单个值,而常规列会尝试返回多个值。
-- 错误示例(将导致报错)
SELECT Name, COUNT(*) FROM city;

如果 MySQL 要统计所有城市,它将不知道该向你展示哪一个具体的 Name(名称)。

  • DISTINCT 关键字DISTINCT 关键字也可以在 SUM()AVG()MIN()MAX() 内部使用,尽管它最常用于 COUNT()。例如,SUM(DISTINCT Population) 将只对唯一的人口数值求和,但这在实际中极少用到。

这些函数是 SQL 中进行任何数据分析的基础。它们让你能够将海量的原始数据浓缩成有意义的指标,从而更容易理解数据集中的趋势、总计和极值。