MySQL 中的聚合函数
聚合函数都是关于
- 对表中的单个列的多个行
- 执行计算
- 并返回一个单一的值。
ISO标准定义了五个(5)聚合函数,它们分别是:
1) COUNT
2) SUM
3) AVG
4) MIN
5) MAX
为什么使用聚合函数
从业务角度来看,不同的组织层级有不同的信息需求。高层管理者通常对了解总体数字感兴趣,而不一定是具体细节。
聚合函数使我们能够轻松地从数据库中生成汇总数据。
例如,在我们的myflix数据库中,管理层可能需要以下报告:
- 租借次数最少的电影。
- 租借次数最多的电影。
- 每部电影每月平均被租借的次数。
我们可以轻松地使用聚合函数来生成上述报告。
让我们详细了解一下聚合函数。
COUNT函数
COUNT函数返回指定字段中值的总数。它适用于数字和非数字数据类型。所有聚合函数默认在处理数据前会排除NULL值。
COUNT(*)是COUNT函数的一个特殊实现,它返回指定表中所有行的计数。COUNT(*)也考虑Nulls和重复项。
下表显示了电影租赁表中的数据
reference_ number | transaction_ date | return_date | membership_ number | movie_id | movie_ returned |
---|---|---|---|---|---|
11 | 20-06-2012 | NULL | 1 | 1 | 0 |
12 | 22-06-2012 | 25-06-2012 | 1 | 2 | 0 |
13 | 22-06-2012 | 25-06-2012 | 3 | 2 | 0 |
14 | 21-06-2012 | 24-06-2012 | 2 | 2 | 0 |
15 | 23-06-2012 | NULL | 3 | 3 | 0 |
假设我们想知道ID为2的电影被租借的次数。
SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;
在MySQL workbench中针对myflixdb执行上述查询,我们得到以下结果。
COUNT('movie_id') |
---|
3 |
DISTINCT关键字
DISTINCT关键字允许我们从结果中省略重复项。这是通过将相似的值分组来实现的。
为了理解DISTINCT的概念,让我们执行一个简单的查询。
SELECT `movie_id` FROM `movierentals`;
movie_id |
---|
1 |
2 |
2 |
2 |
3 |
现在让我们使用distinct关键字执行相同的查询 -
SELECT DISTINCT `movie_id` FROM `movierentals`;
如下所示,distinct从结果中省略了重复记录。
movie_id |
---|
1 |
2 |
3 |
MIN函数
MIN函数返回指定表字段中的最小值。
例如,假设我们想知道我们图书馆中最老电影的发行年份,我们可以使用MySQL的MIN函数来获取所需信息。
以下查询可以帮助我们实现这一目标。
SELECT MIN(`year_released`) FROM `movies`;
在MySQL workbench中针对myflixdb执行上述查询,我们得到以下结果。
MIN('year_released') |
---|
2005 |
MAX函数
正如其名称所示,MAX函数是MIN函数的反面。它从指定的表字段中返回最大值。
假设我们想获得数据库中最新电影的发行年份。我们可以轻松地使用MAX函数来实现这一目标。
以下示例返回最新电影的发行年份。
SELECT MAX(`year_released`) FROM `movies`;
在MySQL workbench中使用myflixdb执行上述查询,我们得到以下结果。
MAX('year_released') |
---|
2012 |
SUM函数
假设我们想要一个报告,该报告显示到目前为止的总付款金额。我们可以使用MySQL的SUM函数,该函数返回指定列中所有值的总和。SUM仅适用于数字字段。NULL值不包含在返回的结果中。
下表显示了payments表中的数据-
payment_ id | membership_ number | payment_ date | description | amount_ paid | external_ reference _number |
---|---|---|---|---|---|
1 | 1 | 23-07-2012 | 电影租赁付款 | 2500 | 11 |
2 | 1 | 25-07-2012 | 电影租赁付款 | 2000 | 12 |
3 | 3 | 30-07-2012 | 电影租赁付款 | 6000 | NULL |
下面显示的查询获取所有付款并对它们求和以返回单个结果。
SELECT SUM(`amount_paid`) FROM `payments`;
在MySQL workbench中针对myflixdb执行上述查询,得到以下结果。
SUM('amount_paid') |
---|
10500 |
AVG函数
MySQL AVG函数返回指定列中值的平均值。与SUM函数一样,它仅适用于数字数据类型。
假设我们想找到平均付款金额。我们可以使用以下查询 –
SELECT AVG(`amount_paid`) FROM `payments`;
在MySQL workbench中执行上述查询,我们得到以下结果。
AVG('amount_paid') |
---|
3500 |
脑筋急转弯
你觉得聚合函数很简单。试试这个!
以下示例按姓名对会员进行分组,计算付款总数、平均付款金额和付款总金额。
SELECT m.`full_names`,COUNT(p.`payment_id`) AS `paymentscount`,AVG(p.`amount_paid`) AS `averagepaymentamount`,SUM(p.`amount_paid`) AS `totalpayments` FROM members m, payments p WHERE m.`membership_number` = p.`membership_number` GROUP BY m.`full_names`;
在MySQL workbench中执行上述示例,我们得到以下结果。
摘要
- MySQL支持所有五个(5)ISO标准聚合函数 COUNT、SUM、AVG、MIN 和 MAX。
- SUM和AVG函数仅适用于数字数据。
- 如果要从聚合函数结果中排除重复值,请使用DISTINCT关键字。ALL关键字甚至包括重复项。如果未指定任何内容,则假定ALL为默认值。
- 聚合函数可以与其他SQL子句结合使用,例如GROUP BY