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_name 为 NULL 的行。
假设 city 表有一个名为 District(行政区)的列,并且某些城市可能没有指定行政区(即 District 为 NULL)。
SELECT COUNT(District)
FROM city
WHERE CountryCode = 'IND';这个查询统计了位于印度(IND)的城市中,其 District 列具有非空值的数量。如果印度某个城市的 District 为 NULL,它将不会被包含在这个统计中。
关键区别: 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 中进行任何数据分析的基础。它们让你能够将海量的原始数据浓缩成有意义的指标,从而更容易理解数据集中的趋势、总计和极值。