SQL基础--分组查询

SQL基础–分组查询


分组函数
函数名功能备注
SUM求和
AVG求平均值
COUNT统计数目COUNT(*)与COUNT(列名) / COUNT(DISTINCT(列名)),后者不包括列值为NULL的行
MAX分组内最大值任何数据类型
MIN分组内最小值任何数据类型
注意

字段为NULL,对分组函数计算结果的影响

函数名影响原因
AVG求取的平均值不同总和不变,个数减少
COUNT统计数目COUNT(*)与COUNT(列名) / COUNT(DISTINCT(列名)),后者不包括列值为NULL的行

分组函数具体到某个字段时,会跳过该字段为NULL的记录

SELECT AVG(NVL(commission_pct, 0)) FROM   employees;
SELECT AVG(commission_pct) FROM   employees;

SELECT中包含的非分组函数中的字段必须出现在GROUP BY 中

高级分组查询

ROLLUP、CUBE、GROUPING、GROUPING SETS

ROLLUP分组规则:

select group_id,job,name,avg(salary) from group_test group by rollup(group_id, job,name);



PL/SQL Developer Export









































   GROUP_IDJOBNAMEAVG(SALARY)
110CodingBruce1000
210Coding 1000
310DirectorHill1000
410Director 1000
510ArchitectGideon1000
610Architect 1000
710ProgrammerClair1000
810Programmer 1000
910  1000
1020CodingJason2000
1120Coding 2000
1220DirectorMichael2000
1320Director 2000
1420ArchitectMartin2000
1520Architect 2000
1620ProgrammerJoey2000
1720Programmer 2000
1820  2000
1930CodingRebecca3000
2030Coding 3000
2130DirectorSabrina3000
2230Director 3000
2330ArchitectRichard3000
2430Architect 3000
2530ProgrammerRex3000
2630Programmer 3000
2730  3000
2840CodingSamuel4000
2940Coding 4000
3040DirectorWendy4000
3140Director 4000
3240ArchitectTina4000
3340Architect 4000
3440ProgrammerSusy4000
3540Programmer 4000
3640  4000
37   2500


从右往左,先按group_id和job分组,再在组内按group_id分组,然后不分组;

对于GROUP BY ROLLUP(C1,c2, c3,…,cn):
从右往左,对c1…cn-1,cn, 依次减少一个进行分组,最后不分组统计;

CUBE分组规则:

select group_id,job,name,sum(salary) from group_test group by CUBE(group_id, job,name);



PL/SQL Developer Export





























































































   GROUP_IDJOBNAMESUM(SALARY)
1   40000
2  Rex3000
3  Hill1000
4  Joey2000
5  Susy4000
6  Tina4000
7  Bruce1000
8  Clair1000
9  Jason2000
10  Wendy4000
11  Gideon1000
12  Martin2000
13  Samuel4000
14  Michael2000
15  Rebecca3000
16  Richard3000
17  Sabrina3000
18 Coding 10000
19 CodingBruce1000
20 CodingJason2000
21 CodingSamuel4000
22 CodingRebecca3000
23 Director 10000
24 DirectorHill1000
25 DirectorWendy4000
26 DirectorMichael2000
27 DirectorSabrina3000
28 Architect 10000
29 ArchitectTina4000
30 ArchitectGideon1000
31 ArchitectMartin2000
32 ArchitectRichard3000
33 Programmer 10000
34 ProgrammerRex3000
35 ProgrammerJoey2000
36 ProgrammerSusy4000
37 ProgrammerClair1000
3810  4000
3910 Hill1000
4010 Bruce1000
4110 Clair1000
4210 Gideon1000
4310Coding 1000
4410CodingBruce1000
4510Director 1000
4610DirectorHill1000
4710Architect 1000
4810ArchitectGideon1000
4910Programmer 1000
5010ProgrammerClair1000
5120  8000
5220 Joey2000
5320 Jason2000
5420 Martin2000
5520 Michael2000
5620Coding 2000
5720CodingJason2000
5820Director 2000
5920DirectorMichael2000
6020Architect 2000
6120ArchitectMartin2000
6220Programmer 2000
6320ProgrammerJoey2000
6430  12000
6530 Rex3000
6630 Rebecca3000
6730 Richard3000
6830 Sabrina3000
6930Coding 3000
7030CodingRebecca3000
7130Director 3000
7230DirectorSabrina3000
7330Architect 3000
7430ArchitectRichard3000
7530Programmer 3000
7630ProgrammerRex3000
7740  16000
7840 Susy4000
7940 Tina4000
8040 Wendy4000
8140 Samuel4000
8240Coding 4000
8340CodingSamuel4000
8440Director 4000
8540DirectorWendy4000
8640Architect 4000
8740ArchitectTina4000
8840Programmer 4000
8940ProgrammerSusy4000


从右往左,先按name分组,再按job分组汇总,在按job分组内部在从右至左按name分组,最后按group分组时重复以上步骤

对于GROUP BY CUBE(C1,c2, c3,…,cn):
从右往左,现不分组统计,在对ci分组,完成后按ci-1分组,在组内对ci…cn重复之前步骤

GROUPING函数:

没有被GROUPING返回1, 被GROUPING返回0

GROUPING SETS:

按不同SET分组,再合并查询结果,如果SET之间有特殊包含关系,输出结果次序可能不同;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值