- 自我理解:
未分组前,是 行 为单位
group by分组后,是 组 为单位
既然group by分组了,oracle处理数据就是以分组的方式组织。分组中可能包含零条、一条或多条记录,我们不用关心这些,把它当作一个容器。
group by后的结构
好像是这样的结构:容器中是按相同分组归类的记录,然后给容器贴上一个标签,标签名就是这个分组,然后这个'分组'一行(黄颜色标出的)就形成了一张新的虚表,只不过这张虚表指向了容器。
用了group by后,select、having、order by子句中都是在分组的基础上以组的思维处理。
having是对容器进行处理,把结果值加入虚表,然后筛选;
select显示的结果是新数据(针对分组对应的容器处理后的结果值),而不是表中原始记录(行);
分组函数有,max, min, avg, sum, count
总结:
- 分组函数只能出现在select, having, order by子句中
- 如果在select语句中同时包含有group by, having, order by,那么他们的执行顺序是group by, having, order by
- select中如果有列和分组函数,那么这些列必须出现在group by子句中,否则报错。或者说,select后面要么全是分组函数,要么全是字段
例如
select max(sal), avg(sal), deptno from emp group by deptno,job having avg(sal)<2000 order by deptno;
应用案例
- 查询表里的重复数据:
select bmcode from ksl_xh group by bmcode having count(*) > 1
按照bmcode分组并计数,那一组的数量超过1条则认为重复。
网友评论