当我们刚开始学Oracle时,见到group by,常常会来个三连问:为什么要用group by?group by应该怎么用?为什么写了group by运行时会提示“不是单组分组函数;不符合group by语法”?面对这些问题,我都胆战心惊了(怎么可能)。接下来我将把group by的心经要诀传授给你们,是不是很激动鸭,那就拿起你们的小本本记下来吧
何为group by
group by即分组
如何用group by
group by语法:
在select语句的一般格式中就有group by语句,group
by语句一般放在where语句的后面,若有having子句,则放在having子句之前。group
by后面加要分组的字段名或者表达式(视情境而定)。
如果仅仅只有group by子句,相信大家都懂,但是,那多没意思,以下介绍聚合函数与group by的结合。
聚合函数,又称组函数。常见的聚合函数有:
1.count——返回找到的记录数;
2.min——返回一个数字列或计算列的最小值;
3.max——返回一个数字列或计算列的最大值;
4.sum——返回一个数字列或计算列的综合;
5.avg——对一个数字列或计算列求平均值;
当group by和聚合函数同时出现在一条语句中,若使用不当,常常会提示“不是单组分组函数”,这时候我们就需要深入的理解group by与聚合函数的关系了。
当我们同时使用group by和聚合函数时,应该牢记一点:分组group by一般与聚合函数连用,即先分组再聚合(如先分组再求和、先分组再求平均等等)。
下面我举一个例子让大家更好的理解分组与聚合函数。
在result(供货)表中有以下数据:
求1:每个供应商供货的产品总数量
select supplier_name,sum(product_number)
from result
group by supplier_name;
结果为:
其过程为:
先分组:
对supplier_name分组,得
再求和:
对supplier_number求和,得
最后得出结果。
再看一个较难的
求2:每个供应商每种货物的产品总数量。
这道题比第一道只是多了一个条件,在相同的供应商条件下,产品编号也要一样,所以我们只需要对供应商和产品编号同时分组即可
select supplier_name,product_id,sum(product_number)
from result
group by supplier_name,product_id;
由于分析过程与上一题类似,故不做重复。
结果为:
相信经过修炼,你已经领悟了。