Oracle_SQL_group_by Oracle SQL group by 分组函数的用法总结
需要在Oracle中用group by语句,发现有些理解并不是太到位。
翻看自己总结的Informix数据库关于group by的使用注意事项,发现跟Oracle是一样的。
同时google一下网上其他人的总结,发现有些总结并不到位。
例如1:http://hi.baidu.com/ws528/blog/item/ded717d9236c412b11df9baa.html 中写到:” 只要字段不带有聚合函数的都要加入到group by 的字段中“。
这个原则是对的,但是没有说到实质内容,仅仅形式上对了。
例如2:http://blog.csdn.net/zhaozhongju/archive/2009/05/13/4177047.aspx 中写到:”Group By子句与Where子句是不兼容的“。
这本身是个错误。不过如果永远不在group by中写where是不会出错的哦~
group by 总结
例子:
select order_num, sum(total_price)
from items
where order_num > 1018 and quantity > 2
group by order_num
having order_num > 1012 and sum(total_price) > 1000.0
;
形式:
select clm_a, clm_b, … , FUNK_A(clm_x)
from tbl_x
where clm_y… clm_z…
group by clm_a, clm_b, …
having clm_a… or FUNK_A(xxx)=…
order by group_column
总结:
过程: select * where -->> group + function -->> having
( 1 ) select + where 选出要进行处理的行;where中的列不受group中的列限制;
( 2 ) group by 条件确定可以 group 的行,这些行之后将要用统计函数 FUNK_A 统计这些行
( 3 ) group 操作使得可 group 的行仅仅显示一行,并用统计函数分组统计
( 4 ) having 条件对group结果进行条件过滤
如同 where 对select的结果过滤一样; 不可用别名
( 5 ) order by 条件必须是group中存在的;如果有having则order by必须放在having之后 ;
注意:
( 1 ) select 中的列 是 group 中的列 的子集( select 后写的列必须在 group 中出现),但不包括分组函数
( 2 )因为初选时用 * ,所以 where 中可以出现任何列,统计函数中也可以出现任何列
( 3 ) having 是在 group 之后进行的,所以 having 出现时必须有 group ,同时 having 中的列必须在 select 中出现 ; 同时不能用列的别名