9-汇总数据
9.1-聚集函数
在实际开发过程中,可能会遇到下面这些情况:
-
确定大于某个值的有多少行数据,比如游戏排行榜,查询玩家排行多少名。
-
获取表中某些行的和,比如双十一当天,某个用户总订单价格是多少元。
-
获取表中最大值,最小值,平均值。
上述这些例子只需要返回统计后的数值,而不需要返回所有数值,然后在进行统计,这么做节省了时间,提高了效率。
为了方便做类似上述例子的操作,SQL给出了五个函数。
9.1.1 avg()函数
avg()函数的执行过程:先对表中行数进行计算,然后求得某列的和,最后求取平均值。
例如:返回products表中的平均价格
select avg(prod_price) as avg_price
from products;
avg()也可以结合WHERE子句来确定特定的列或者行的平均值。
select avg(prod_price) as avg_price
from products
where vend_id = 'DLL01';
上述SQL语句是仅过滤供应商为‘DLL01’的产品的价格的平均值。
只用于单个列 AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。
注意:avg函数会忽略列值为NULL的行。
9.1.2 count()函数
count()函数是用来计数的。可利用count()确定表中行的数目或者符合规定的行的数目。
-
使用count(*) 对表中行的数目进行计数,不管表列中包含的是空值NULL还是非空值。
-
使用count(column)对特定列中具有值的行进行计数。忽略NULL值。
select count(*) as num_cust
from customers;
上述SQL语句查询customers表中的顾客总数。count(*)对所有具有值的行进行计数,计算得到的值在num_cust中返回。
select count(cust_email) as num_cust
from customers;
上述SQL语句用于统计顾客表中拥有邮箱的顾客有多少,主动忽略了NULL值。
NULL值 如果指定列名,则COUNT()函数会忽略指定列的值为NULL的行,但如果COUNT()函数中用的是星号(*),则不忽略。
9.1.3 max()函数
max()函数返回指定列中的最大值。max()函数要指定列名。
select max(prod_price) as max_price
from products;
上述SQL语句是查询产品列表中价格最高的产品。
max()函数一般用来找出最大的数值或者日期,但是有许多DBMS允许它返回任意列中的最大值,包括返回文本列中的最大值。当max()函数用于返回文本最大值时,返回按该列排序的最后一行。
max()函数忽略值为NULL的行。
9.1.4 min()函数
与max()函数相反,min()函数返回指定列的最小值。min()函数要求指定列名。
select min(prod_price) as min_price
from products;
min()函数一般用来找出最小的数值或者日期,但是有许多DBMS允许它返回任意列中的最小值,包括返回文本列中的最小值。当min()函数用于返回文本最小值时,返回按该列排序的最前面的行。
min()函数忽略NULL值所在的行。
9.1.5 sum()函数
sum()函数用来返回指定列值的总和。
例如:orderitems表中包含订单中实际的物品,每个物品有相应的数量,由此计算所订购的物品的总数。
select sum(quantity) as items_ordered
from orderitems
where order_num = 20005;
上述SQL语句用于返回总的物品数量,一共是200个。
函数SUM(quantity)返回订单中所有物品数量之和,WHERE子句保证只统计某个物品订单中的物品。
sum()也可以用来合计计算值。
select sum(item_price*quantity) as total_price
from orderitems
where order_num = 20005;
上述SQL语句计算所有符合条件的价值的总和。
sum()函数忽略列值为NULL的行。
9.2-聚集不同值
上述五种聚集函数都可以按照下面的方式使用:
-
对所有行执行计算,指定all参数或不指定参数(因为all是默认行为)。
-
只包含不同的值,指定distinct
注意:all参数不需要指定,它是默认行为。如果不指定distinct,则假定为all。
下面举例说明指定distinct参数,而不使用默认参数。
select avg(distinct prod_price) as avg_price
from products
where vend_id = 'DLL01';
因为使用了distinct参数,所以计算平均值的时候自动忽略相同的价格去计算平均值。但是计算后高于上面我们计算的平均价格,这是因为数量虽然少了,但是价格低的物品数量也少了。
另外,distinct不能用于count(*),但是可以用于指定列名的count(),也就是说:如果想要使用distinct,就必须指定列名。
distinct可以用于min()和max(),但是毫无意义,因为只有一行。
9.3-组合聚集函数
select语句可以根据需要选择多个聚合函数。
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语句返回products表中物品数量,产品价格最高,产品价格最低以及平均值。
练习
-
编写SQL语句,确定已售出产品的总数(使用OrderItems中的quantity列)。
select sum(quantity) as selled from orderitems;
-
修改刚刚创建的语句,确定已售出产品项(prod_id)BR01的总数。
select sum(quantity) as selled from orderitems where prod_id = 'BR01';
-
编写SQL语句,确定Products表中价格不超过10美元的最贵产品的价格(prod_price)。将计算所得的字段命名为max_price。
select max(prod_price) as max_price from products where prod_price <= 10;