1.聚集函数(aggregate function)
对某些行运行的函数,计算并返回一个值。
汇总表中的数据,而不需要实际数据本身的SQL查询有:
确定表中行数;
获得表中某些行的和;
找出表列的最大值、最小值、平均值。
为了方便这种类型的检索,SQL给出了5个聚集函数。
函数 |
语法(MySQL) |
AVG() |
返回某列的平均值 |
COUNT() |
返回某列的行数 |
MAX() |
返回某列的最大值 |
MIN() |
返回某列的最小值 |
SUM() |
返回某列值之和 |
(1)AVG()函数
通过对表中行数计算并计算其列值之和。可用来返回所有列的平均值,也可用来返回特定列或行的平均值。
为了计算Products表中所有产品的平均价格,输入:
SELECT AVG(prod_price) AS avg_price
FROM Products;
输出:
为了返回特定供应商所提供产品的平均价格,输入:
SELECT AVG(prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';
输出:
AVG()只能用于单个列,为了获得多个列的平均值,必须使用AVG()函数。AVG()函数忽略列值为NULL的行。
(2)COUNT()函数
进行计数,可确定表中行的数目或符合特定条件的行的数目。
使用COUNT(*)对表中行的数目进行极速,不管表列中包含的是空值(NULL)还是非空值;
使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。
为了返回Customers表中顾客的总数,输入:
SELECT COUNT(*) AS num_cust
FROM Customers;
输出:
只对具有电子邮件地址的客户计数,输入:
SELECT COUNT(cust_email) AS num_cust
FROM Customers;
输出:
(3)MAX函数
返回列中的最大值,要求指定列名。
输入:
SELECT MAX(prod_price) AS max_price
FROM Products;
输出:
(4)MIN函数
返回列中的最小值,要求指定列名。
输入:
SELECT MIN(prod_price) AS min_price
FROM Products;
输出:
(5)SUM()函数
用来返回指定列值的和(总计)。
OrderItems包含订单中实际的物品,每个物品有相应的数量。为了检索所订购物品的总数(所有quantity值之和),输入:
SELECT SUM(quantity) AS items_ordered
FROM OrderItems
WHERE order_num = 20005;
输出:
SUM()也可以用来合计计算值。为了合计每项物品的item_price*quantity,得出总的订单金额,输入:
SELECT SUM(item_price*quantity) AS total_price
FROM OrderItems
WHERE order_num = 20005;
输出:
SUM()函数忽略列值为NULL的行。
2.聚集不同值
以上聚集函数都可以如下使用:
对所有行执行计算,指定ALL参数或不知道参数(因为ALL是默认行为);
只包含不同的值,指定DISTINCT参数。DISTINCT必须使用列名,不能用于计算或者表达式。
下面使用AVG()函数返回特定供应商提供产品的平均价格,若使用DISTINCT参数,平均值只考虑各个不同的价格。
输入:
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';
输出:
使用了DISTINCT后的avg_price更高,这是因为有多个物品具有相同的较低价格,排除它们提升了平均价格。
3.组合聚集函数
输入:
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;
输出:
这里用单条SELECT语句执行了4个聚集计算,返回4个值:Products表中物品的数目,产品杰哥的最高值、最低值以及平均值。