group by和having

2019-03-20  本文已影响0人  一片冰心一生平安

既然group by分组了,oracle处理数据就是以分组的方式组织。分组中可能包含零条、一条或多条记录,我们不用关心这些,把它当作一个容器。
好像是这样的结构:容器中是按相同分组归类的记录,然后给容器贴上一个标签,标签名就是这个分组,然后这个'分组'一行(黄颜色标出的)就形成了一张新的虚表,只不过这张虚表指向了容器。

group by后的结构

用了group by后,select、having、order by子句中都是在分组的基础上以的思维处理。
having是对容器进行处理,把结果值加入虚表,然后筛选;
select显示的结果是新数据(针对分组对应的容器处理后的结果值),而不是表中原始记录(行);

分组函数有,max, min, avg, sum, count

总结:

  1. 分组函数只能出现在select, having, order by子句中
  2. 如果在select语句中同时包含有group by, having, order by,那么他们的执行顺序是group by, having, order by
  3. select中如果有列和分组函数,那么这些列必须出现在group by子句中,否则报错。或者说,select后面要么全是分组函数,要么全是字段
    例如
    select max(sal), avg(sal), deptno from emp group by deptno,job having avg(sal)<2000 order by deptno;

应用案例

  1. 查询表里的重复数据:
      select bmcode from ksl_xh group by bmcode having count(*) > 1
      按照bmcode分组并计数,那一组的数量超过1条则认为重复。
上一篇下一篇

猜你喜欢

热点阅读