汇总和分组数据
2016-11-16 本文已影响0人
olivia_ong
汇总数据
利用聚集函数(aggregate function)对表中信息进行汇总。
聚集函数
- 运行在行组上,计算和返回单个值的函数。
- SQL聚集函数:
- AVG():返回某列的平均值
- COUNT():返回某列的行数
- MAX():返回某列的最大值
- MIN():返回某列的最小值
- SUM():返回某列之和
- 具体应用
avg()函数计算列的平均值,如果是多个列,必须使用多个avg()函数;avg()函数忽略列值为NULL的行。
select avg(prod_price) as avg_price from products;
count()函数进行计数。
select count(*) as num_cast from customers;//对表中所有行计数,不管各列有什么值
select count(cust_email) as num_cast from customers;//对特定列中具有值的行进行计数,忽略NULL值
max()函数和min()函数分别返回特性列的最大值和最小值,要求制定列名,忽略NULL值。
select max(prod_price) as max_price from products;
sum()函数返回指定列的和
select sum(quantity*item_price) as items_ordered
from orderitems
where order_num=20005;
利用算术操作符,所有的聚集函数都可以用来执行多个列上的计算。
- 聚集不同的值
对所有的行执行计算,指定ALL或者不给参数(ALL是默认行为);
只包含不同的值,指定DISTINCT参数
select avg(distinct prod_price) as avg_price from products;
分组数据
利用group by子句和having子句对不同类别的数据进行分组汇总。
创建分组
利用group by子句创建分组
select vend_id,count(*) as num_prods
from products
group by vend_id;//不同vend_id包含的产品数目
使用group by子句的规定:
- group by子句可以包含任意数目的列。
- 如果在group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总。
- group by子句中列出的每个列都必须是检索列或者有效的表达式,不能是聚集函数。
- 处聚集计算语句外,select语句中的每个列都必须在group by子句中给出。
- 如果分组中具有NULL值,则NULL值将作为一个分组返回。
- group by子句必须出现在where子句之后,order by子句之前。
- 加上with rollup,会将所有的分组数返回
select vend_id,count(*) as num_prods
from products
group by vend_id with rollup;
过滤分组
利用having子句替代where对分组进行过滤。
select cust_id,count(*) as orders
from orders
group by cust_id having count(*)>=2;
where与having相结合
select vend_id,count(*) as num_prods
from products
where prod_price>=10
group by vend_id having count(*)>=2;//具有两个及以上的价格为10及以上产品的供应商