order by group by having的用法区别文档格式.docx
- 文档编号:15813143
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:9
- 大小:20.38KB
order by group by having的用法区别文档格式.docx
《order by group by having的用法区别文档格式.docx》由会员分享,可在线阅读,更多相关《order by group by having的用法区别文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
什么是“聚合函数”?
像sum()、count()、avg()等都是“聚合函数”
使用groupby的目的就是要将数据分类汇总。
一般如:
select单位名称,count(职工id),sum(职工工资)form[某表]
groupby单位名称
这样的运行结果就是以“单位名称”为分类标志统计各单位的职工人数和工资总额。
在sql命令格式使用的先后顺序上,groupby先于orderby。
select命令的标准格式如下:
SELECTselect_list
[INTOnew_table]
FROMtable_source
[WHEREsearch_condition]
[GROUPBYgroup_by_expression]
[HAVINGsearch_condition]
1.GROUPBY是分组查询,一般GROUPBY是和聚合函数配合使用
groupby有一个原则,就是select后面的所有列中,没有使用聚合函数的列,必须出现在groupby后面(重要)
例如,有如下数据库表:
A
B
1
abc
bcd
asdfg
如果有如下查询语句(该语句是错误的,原因见前面的原则)
selectA,BfromtablegroupbyA
该查询语句的意图是想得到如下结果(当然只是一相情愿)
右边3条如何变成一条,所以需要用到聚合函数,如下(下面是正确的写法):
selectA,count(B)as数量fromtablegroupbyA
这样的结果就是
A数量
3
2.Having
where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
having子句被限制子已经在SELECT语句中定义的列和聚合表达式上。
通常,你需要通过在HAVING子句中重复聚合函数表达式来引用聚合值,就如你在SELECT语句中做的那样。
例如:
SELECTACOUNT(B)FROMTABLEGROUPBYAHAVINGCOUNT(B)>
2
Grouping的用法:
指示是否聚合groupby列表中的指定表达式。
在结果集中,如果Grouping返回1,表示聚合;
如果Grouping返回0,表示非聚合。
如果指定了Groupby,那么只能用在Select,Having,Orderby中。
注释:
GROUPING用于区分标准空值和由ROLLUP、CUBE或GROUPINGSETS返回的空值。
作为ROLLUP、CUBE或GROUPINGSETS操作结果返回的NULL是NULL的特殊应用。
它在结果集内作为列的占位符,表示全体。
举例:
CREATETABLEtt(产地CHAR(8),水果CHAR(8),重量INT)
INSERTttVALUES('
北方'
'
香蕉'
3)
水蜜桃'
2)
南方'
桔子'
5)
6)
8)
select
CASEWHEN(GROUPING(产地)=1)THEN'
总计'
ELSEISNULL(产地,'
UNKNOWN'
)
ENDAS产地,
CASEWHEN(GROUPING(水果)=1)THEN'
小计'
ELSEISNULL(水果,'
SUM(重量)总重量
FROMTT
GROUPBY产地,水果
WITHROLLUP
结果:
/************************
北方桔子8
北方水蜜桃7
北方香蕉3
北方小计18
南方桔子3
南方水蜜桃6
南方香蕉3
南方小计12
总计小计30
*************************/
GROUPING(字段)=1的是对应字段汇总的
GROUPING(字段)=0的是对应字段原来的明细的信息
oracleRollup和Cube用法
Oracle的GROUPBY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。
如果是ROLLUP(A,B,C)的话,首先会对(A、B、C)进行GROUPBY,然后对(A、B)进行GROUPBY,然后是(A)进行GROUPBY,最后对全表进行GROUPBY操作。
如果是GROUPBYCUBE(A,B,C),则首先会对(A、B、C)进行GROUPBY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUPBY操作。
grouping_id()可以美化效果:
除本文内容外,你还可参考:
分析函数参考手册:
/419/33028
分析函数使用例子介绍:
/419/44634
SQL>
createtabletasselect*fromdba_indexes;
表已创建。
selectindex_type,status,count(*)fromtgroupbyindex_type,status;
INDEX_TYPESTATUSCOUNT(*)
---------------------------------------------
LOBVALID51
NORMALN/A25
NORMALVALID479
CLUSTERVALID11
下面来看看ROLLUP和CUBE语句的执行结果。
selectindex_type,status,count(*)fromtgroupbyrollup(index_type,status);
LOB51
NORMAL504
CLUSTER11
566
已选择8行。
selectindex_type,status,count(*)fromtgroupbycube(index_type,status);
N/A25
VALID541
已选择10行。
查询结果不是很一目了然,下面通过Oracle提供的函数GROUPING来整理一下查询结果。
selectgrouping(index_type)g_ind,grouping(status)g_st,index_type,status,count(*)
2fromtgroupbyrollup(index_type,status)orderby1,2;
G_INDG_STINDEX_TYPESTATUSCOUNT(*)
-----------------------------------------------------------------
00LOBVALID51
00NORMALN/A25
00NORMALVALID479
00CLUSTERVALID11
01LOB51
01NORMAL504
01CLUSTER11
11566
这个查询结果就直观多了,和不带ROLLUP语句的GROUPBY相比,ROLLUP增加了对INDEX_TYPE的GROUPBY统计和对所有记录的GROUPBY统计。
就是说,如果是ROLLUP(A,B,C)的话,首先会对(A、B、C)进行GROUPBY,然后对(A、B)进行GROUPBY,然后是(A)进行GROUPBY,最后对全表进行GROUPBY操作。
下面看看CUBE语句。
2fromtgroupbycube(index_type,status)orderby1,2;
00CLU
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- order by group having的用法区别 having 用法 区别