设为首页 收藏本站
查看: 892|回复: 0

[经验分享] Oracle 分组与分组函数

[复制链接]

尚未签到

发表于 2016-7-18 12:39:49 | 显示全部楼层 |阅读模式
一、分组:

    分组函数可以对行集进行操作,并且为每组给出一个结果。

   使用group by column1column2,..columm1,column2进行分组,即column1,column2组合相同的值为一个组

 

二、常用分组函数: */

    AVG([DISTINCT|ALL]n)        -- 求平均值,忽略空值

    COUNT({*|[DISTINCT|ALL]expr})  -- 统计个数,其中expr用来判定非空值(使用*计算所有选定行,包括重复行和带有空值的行)

    MAX([DISTINCT|ALL]expr)        -- 求最大值,忽略空值

    MIN([DISTINCT|ALL]expr)        -- 求最小值,忽略空值

    SUM([DISTINCT|ALL]n)        -- 求和,忽略空值

/*

三、分组函数语法:*/

    SELECT [column,] group_function(column), ...

    FROM table

    [WHERE condition]

    [GROUP BY column]

    [ORDER BY column];

/*

四、分组函数使用准则:

    DISTINCT 使函数只考虑非重复值,ALL则考虑包括重复值在内的所有值。默认为ALL

  带有expr参数的函数的数据类型可以为CHAR,VARCHAR2,NUMBER,DATE.

    所有分组函数都忽略空值。可以使用NVL,NVL2,COALESCE函数代替空值

    使用GROUP BY 时,Oralce服务器隐式地按照升序对结果集进行排序。可以使用ORDER BY 更改排序结果。 

 

     可以使用NVL 函数强制分组函数包含空值,如:*/

        select avg(nvl(comm,0)) from emp;  

/*    

五、GROUP BY 子句的语法:

    使用GROUP BY 子句可以将表中的行分成更小的组,然后使用分组函数返回每一组的汇总信息*/

    SELECT column, group_function(column)

    FROM table

    [WHERE condition]

    [GROUP BY group_by_expression]

    [ORDER BY column];

 

    GROUP BY  --group_by_expression 即为对哪些列进行分组

/* 

六、GROUP BY 使用准则:

    SELECT 中出现的列,如果未出现在分组函数中,则GROUP BY子句必须包含这些列

    WHERE 子句可以某些行在分组之前排除在外

    不能在GROUP BY 中使用列别名

    默认情况下GROUP BY列表中的列按升序排列

    GROUP BY 的列可以不出现在分组中 

   

七、分组过滤:

    使用having子句

   

    having使用的情况:

       行已经被分组

       使用了组函数

       满足having子句中条件的分组将被显示

 

八、演示:*/

--为数字数据使用AVGSUM方法

    SQL> select min(sal) as min_sal,max(sal) as max_sal,

      2    avg(sal) as avg_sal,sum(sal) as sum_sal

      3  from scott.emp;

 

       MIN_SAL    MAX_SAL    AVG_SAL    SUM_SAL

    ---------- ---------- ---------- ----------

          800       5000 2073.21429      29025

 

--对于数字,字符和日期数据类型,你能使用MINMAX方法     

    SQL> select min(hiredate) as min_hiredate,max(hiredate) as max_hiredate from scott.emp;

 

    MIN_HIRED MAX_HIRED

    --------- ---------

    17-DEC-80 23-MAY-87

 

--使用count(*),count(expr),count(distinct expr)

--注意coung(*)包含空值、重复值,count(expr)过滤空值,count(distinct expr)即过滤空值,也过滤重复值

    SQL> select count(*),count(mgr),count(distinct mgr) from emp;

 

      COUNT(*) COUNT(MGR) COUNT(DISTINCTMGR)

    ---------- ---------- ------------------

           14         13                  6

 

--使用NVL 函数强制分组函数包含空值

    SQL> select avg(comm) ,avg(nvl(comm,0)) from emp;

 

     AVG(COMM) AVG(NVL(COMM,0))

    ---------- ----------------

          550       157.142857   

 

--使用group by 子句来分组

    SQL> select job ,avg(sal) from emp group by job;

 

    JOB         AVG(SAL)

    --------- ----------

    CLERK         1037.5

    SALESMAN        1400

    PRESIDENT       5000

    MANAGER   2758.33333

    ANALYST         3000

 

--GROUP BY 的列可以不出现在分组中  

    SQL> select avg(sal) from emp group by job order by avg(sal) desc;

 

      AVG(SAL)

    ----------

         5000

         3000

    2758.33333

         1400

       1037.5

 

--错误的用法,SELECT 中的有些列没有在GROUP BY子句中出现

    SQL> select job,avg(sal) from emp;

    select job,avg(sal) from emp

          *

    ERROR at line 1:

    ORA-00937: not a single-group group function 

 

--使用having子句过滤分组结果

--查询平均工资高于的部门号,及其平均工资。

 

    select deptno,avg(sal) from emp group by deptno

    having avg(sal)>2000;

 

--查出平均工资在以上的工种(job)

    select job,avg(sal) from emp group by job having avg(sal)>2000;

   

--求人数在人以上的部门

    select deptno,count(*) from emp group by deptno having count(*)>5;

   

--使用分组函数的嵌套

    SQL> select max(avg(sal)) from emp group by deptno;

 

    MAX(AVG(SAL))

    -------------

       2916.66667

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-245934-1-1.html 上篇帖子: oracle转义符的删除 下篇帖子: Oracle生成表空间脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表