聚集函数

  • 聚集函数:运行在行组上,计算和返回单个值的函数。
  • 标准偏差:MySQL还支持一系列的标准偏差聚集函数,此处未涉及。
函数说明
AVG()返回某列的平均值
COUNT()返回某列的行数
MAX()返回某列的最大值
MIN()返回某列的最小值
SUM()返回某列值之和

AVG()函数

1
2
3
4
-- 返回特定供应商所提供产品的平均价格
SELECT AVG(prod_price) AS avg_price
FROM products
WHERE vend_id = 1003;
  • 只用于单个列:AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。

    为了获得多个列的平均值,必须使用多个AVG()函数。

  • NULL值:AVG()函数忽略列值为NULL的行。

COUNT()函数

  • COUNT()函数有两种使用方式
    1. 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值;
    2. 使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。
  • NULL值:如果指定列名,则指定列的值为空的行被COUNT()函数忽略,但如果COUNT()函数中用的是*号,则不忽略。
1
2
3
4
5
6
7
-- 返回customers表中客户的总数
SELECT COUNT(*) AS num_cust
FROM customers;

-- 只对具有电子邮件地址的客户计数
SELECT COUNT(cust_email) AS num_cust
FROM customers;

MAX()函数

  • 对非数值数据使用MAX():虽然MAX()一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。

    在用于文本数据时,如果数据按相应的列排序,则MAX()返回最后一行。

  • NULL值:MAX()函数忽略列值为NULL的行。

1
2
3
-- 返回products表中最贵的物品的价格
SELECT MAX(prod_price) AS max_price
FROM products;

MIN()函数

  • MIN()函数与MAX()函数类似。

  • 对非数值数据使用MAX():虽然MAX()一般用来找出最小的数值或日期值,但MySQL允许将它用来返回任意列中的最小值,包括返回文本列中的最小值。

    在用于文本数据时,如果数据按相应的列排序,则MIN()返回最前面的行。

  • NULL值:MIN()函数忽略列值为NULL的行。

1
2
3
-- 返回products表中最便宜物品的价格
SELECT MIN(prod_price) AS min_price
FROM products;

SUM()函数

  • 在多个列上进行计算:利用标准的算术操作符,所有聚集函数都可用来执行多个列上的计算。
  • NULL值:SUM()函数忽略列值为NULL的行。
1
2
3
4
5
6
7
8
9
-- 检索所订购物品的总数(所有quantity值之和)
SELECT SUM(quantity) AS items_ordered
FROM orderitems
WHERE order_num = 20005;

-- 合计每项物品的item_price * quantity,得出总的订单金额
SELECT SUM(quantity) AS items_ordered
FROM orderitems
WHERE order_num = 20005;

聚集不同值

  • MySQL5及后期版本:聚集函数的DISTINCT的使用,已经被添加到MySQL 5.0.3中,MySQL 4.x中不能正常运行。

  • 以上5个聚集函数都可以如下使用:

    1. 对所有的行执行计算,指定ALL参数或不给参数(因为ALL时默认行为);
    2. 只包含不同的值,指定DISTINCT参数。
  • 注意:如果指定列名,则DISTINCT只能用于COUNT(列名)

    DISTINCT不能用于COUNT(*)。类似的,DISTINCT必须使用列名 ,不能用于计算或表达式。

  • 将DISTINCT用于MAX()和MAX():虽然DISTINCT从技术上可以用于MIN()MAX(),但这样做实际没有价值。一个列中的最小值和最大值不管是否包含不同值都是相同的。

1
2
3
4
-- 返回特定供应商提供的产品的平均价格,只考虑各个不同的价格
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id = 1003;

组合聚集函数

  • 取别名:在指定别名以包含某个聚合函数的结果时,不应该使用表中实际的列名。虽然这样做并非不合法,但使用唯一的名字会使你的SQL更易于理解和使用(以及将来容易排除故障)。
1
2
3
4
5
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM products;