聚集函数 aggregate function

用于汇总数据,而不查出数据本身。

AVG( ) 函数

用于确定单个列的平均值。要分别获得多个列的平均值,必须使用多个 AVG() 函数。

SELECT AVG(prod_price) AS avg_price
FROM Products;

忽略 NULL

COUNT( ) 函数

COUNT(*) 对表中行的数目计数,包括表列的 NULL 值 COUNT(column name) 对特定列的行进行计数,忽略 NULL 值

MAX( ) 函数

返回指定列的最大值,许多 DBMS 允许用于任意列,忽略 NULL

MIN( ) 函数

返回指定列的最小值,许多 DBMS 允许用于任意列,忽略 NULL

SUM( ) 函数

返回指定列值的和,忽略 NULL

在多个列上进行计算

利用算术操作符,所有聚集函数都可以用来执行多个列上的计算

SELECT SUM(item_price * quantity) AS total_price
FROM OrderItems
WHERE order_num = 20005;

聚集非重复值

聚集函数默认附加 ALL 参数,对所有行执行计算 要使它只计算不同的值,需指定 DISTINCT 参数

SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';

注意,DISTINCT 不能用于 COUNT(*),必须使用列名,不能用于表达式。

分组

汇总计算时,对每个组分别计算。

创建分组 GROUP BY

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
  • GROUP BY 子句可以包含任意数目的列或表达式,因此可以对分组进行嵌套,在最后指定的分组进行汇总
  • 如果在 SELECT 中使用表达式,也必须在 GROUP BY 指定相同的表达式
  • 除了聚集计算语句,SELECT 的每一列都必须在 GROUP BY 中给出

过滤分组 HAVING

前面所有 WHERE 子句都可以用 HAVING 替换,唯一的区别是 WHERE 过滤行,HAVING 过滤分组

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id
HAVING COUNT(*) >=2;