聚合函数:是指用于操作一组行以计算并返回单个值的函数。
SQL聚合函数
函数 | 描述 |
---|---|
AVG() | 返回列的平均值 |
COUNT() | 返回列的行数 |
MAX() | 返回列的最大值 |
MIN() | 返回列的最小值 |
SUM() | 返回列的值汇总 |
AVG()用于返回特定列的平均值,这是通过统计表中的行数以及他们的值之和来实现的,AVG()可用于返回列或者特定列或行的平均值。
第一个示例使用AVG()返回products表中的所有产品的平均价格:
select avg(prod_price) as avg_price
from products;
AVG()也可用于特定列或行的平均值。下面的示例返回由特定供应商提供的产品的平均价格:
select avg(prod_price) as avg_price
from products
where vend_id = 1003;
注意:
- AVG()只能用于特定数字列的平均值,并且必须把该列名指定为函数参数。要获得多个列的平均值,就必须使用多个AVG()函数。
- 列中包含NULL值的行将被AVG()函数忽略。
count()所做的事情是:统计。使用COUNT(),可以确定表中的行数或者与特定条件匹配的行数。
使用场景:
- 使用count(*)统计表中的行数,无论列包含的数值还是NULL值;
- 使用COUNT(column)统计在特定列中具有值(忽略NULL)的行数
第一个示例返回customers表中的顾客总数
SELECT COUNT(*) AS num_cust
FROM customers;
下面的示例只统计具有电子邮件地址的顾客数量:
SELECT COUNT(cust_email) AS num_cust
FROM customers;
MAX()返回指定列中最大值。MAX()需要指定列名,如下所示:
SELECT MAX(prod_price) AS max_price
FROM products;
提示:
尽管MAX()通常用于查找最大的数字或者日期值,Oracle还允许把它用于返回任何列中的最大值,包括文本列。当用于文本数据时,如果数据是按照该列排序的,那么MAX()将返回最后一行。
注意:
具有NULL值的行将被MAX()函数忽略。
MIN()所做的事情与MAX()正好相反;它返回指定列中的最小值。像MAX()一样,MIN()需要指定列名,如下所示:
SELECT MIN(prod_price) AS min_price
FROM products;
提示:将MIN()用于非数值型数据
与MAX()函数一样,Oracle允许将MIN()用于返回任何列中的最小值,包括文本列。当用于文本数据时,如果数据是按该列排序的,那么MIN()将返回第一行。
注意:
具有NULL值的行将被MIN()函数忽略。
SUM()用于返回特定列中的值的总和(总计)。
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;
提示:在多个列上执行计算
所有的聚合函数都可用于使用标准的数学运算符在多个列上执行计算
注意:
具有NULL值的行将被SUM()函数忽略。
可以用如下方式使用上述五种函数:
提示:ALL是默认的
ALL不需要指定,因为它是默认参数。如果没有指定DISTINCT,就假定使用ALL。
下面的示例使用AVG()函数返回由特定供应商提供的产品平均价格。其中使用的SELECT语句与前面示例中的相同,但是这里使用了DISTINCT参数,使得平均价格只包括特定的价格:
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id = 1003;
警告:使用DISTINCT
如果指定列名,DISTINCT将只能与COUNT()结合使用。DISTINCT不能与COUNT(*)结合使用,因此不允许COUNT(DISTINCT *),它会生成一个错误。类似地,必须把DISTINCT用于列名,而不能用于计算或表达式。
提示:将DISTINCT与MIN()和MAX()结合使用
尽管技术上可以将DISTINCT与MIN()和MAX()结合使用,实际上这样做没有意义。无论是否只包括独特的值,列中的最小值和最大值都是相同的。
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;
提示:指定别名
当指定别名以包含聚合函数的结果时,不要尝试使用表中实际的列名。尽管实际上这样做是合法的,但是使用独特的名称将使SQL更容易被理解和处理(对于将来的查错也是如此)。