Oracle专题6之Oracle的分组函数与数组分组
admin
2023-04-24 18:42:25
0
  • 在关系数据库中,使用数据分组可以取得表数据的汇总信息。数据分组是通过分组函数、Group by以及having等子句共同实现的。

    1、分组函数

  • SQL函数包含单行函数和多行函数。分组函数属于多行函数。作用于一组数据,并对一组数据返回一个值。
  • 分组函数:SELECT [column,] group function(column) ... FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column];。
  • 常用的分组函数:AVG、SUM、MIN、MAX、COUNT、WM_CONCAT.。

    a、AVG()

  • 求平均值。举例:SELECT avg(sal) FROM emp;
    SQL> SELECT avg(sal) FROM emp;
        AVG(SAL)
                2135

    b、SUM()

  • 求和。举例:SELECT SUM(sal) FROM emp;
    SQL> SELECT MIN(sal) FROM emp;
        MIN(SAL)
                 800

    c、MIN

  • 求最小值。举例:SELECT MIN(sal) FROM emp;
    SQL> SELECT MIN(sal) FROM emp;
    MIN(SAL)
       800

d、COUNT()

  • 计数(统计)。举例:求员工的总人数,SELECT COUNT(*) FROM emp;
    SQL> SELECT COUNT(*) FROM emp;
    COUNT(*)-
        15
  • 在使用分组时可以使用DISTINCT关键字来去重。
    SQL> select count(distinct deptno) from emp;
    COUNT(DISTINCTDEPTNO)
                    3

    e、WM_CONCAT行转列(让查询结果行转列)

  • 该函数可以把列值以‘,’号分隔起来,并显示成一行。
    SQL> select wm_concat(ename) from emp;
    WM_CONCAT(ENAME)
    EASON,G_EASON,ALLEN,WARD,JONES,MARTIN,BLAKE,CLARK,SCOTT,KING,TURNER,ADAMS,JAMES,
    FORD,MILLER

    2、Group by子句

  • 作用:可以将表中的数据分成若干组。
  • Group by子句的语法:SELECT [column,] group function(column), ... FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column];
  • 例如:求出每个部分的平均工资,要求显示:部门号,部分的平均工资。
  • SELECT deptno, avg(sal) from emp group by deptno;
    SQL> SELECT deptno, avg(sal) from emp group by deptno;
    DEPTNO   AVG(SAL)
        30 1566.66667
        20     2312.5
        10 2916.66667
  • 在SELECT列表中所有未包含在组函数中的列都应包含在GROUP BY子句中。如按照部门和职位进行分组:
    SQL> SELECT deptno, job, avg(sal) from emp group by deptno, job;
            DEPTNO JOB         AVG(SAL)
                    20 CLERK            950
                    30 SALESMAN        1400
                    20 MANAGER         2975
                    30 CLERK            950
                    10 PRESIDENT       5000
                    30 MANAGER         2850
                    10 CLERK           1300
                    20 ANALYST         3000
                    10 MANAGER         2450
    已选择9行。
  • 包含在group by 子句中的列不必包含在SELECT列表当中:
    SQL> select avg(sal) from emp group by deptno;
        AVG(SAL)
    1566.66667
            2312.5
    2916.66667
  • 再如示例:求出每个部分的员工姓名,要求显示:部分标号、员工姓名。
    SQL> select deptno, WM_concat(ename) from emp group by deptno;
    DEPTNO      WM_CONCAT(ENAME)
        10            CLARK,MILLER,KING
        20            EASON,FORD,ADAMS,SCOTT,JONES,G_EASON
        30            ALLEN,JAMES,TURNER,BLAKE,MARTIN,WARD

    3、Having子句

  • 作用:用于对分组后的结果进行过滤。
  • 例子:请平均工资大于2500的部分,要求显示:部门号,平均工资]
  • 不能再WHERE子句中使用组函数,可以在having子句中使用组函数。
    SQL> select deptno,avg(sal) from emp group by deptno having avg(sal) >2500;
    DEPTNO   AVG(SAL)
        10 2916.66667
  • having子句和group by子句通常一起使用。

  • 如果条件中没有组函数,正常使用where语句就可以。比如说:select deptno, avg(sal) from emp where deptno=10 group by deptno;
    SQL> select deptno, avg(sal) from emp where deptno=10 group by deptno;
    DEPTNO   AVG(SAL)
        10 2916.66667
  • where使得分组记录数大大降低,从而提高效率。从SQL优化角度来看,尽量使用where子句。先过滤然后分组。

  • 分组函数的嵌套:求部分平均工资的最大值。
  • select max(avg(sal)) from emp group by deptno;
    SQL> select max(avg(sal)) from emp group by deptno;
    MAX(AVG(SAL))
         2916.66667

相关内容

热门资讯

烈焰熊熊,堪比“原子弹”,欧洲... 据美国有线电视新闻网(CNN)7月29日报道,席卷法国西南部的大片野火燃烧得如此猛烈,以至于形成了一...
外交部:对日本熊本县地震遇难者... 据凤凰卫视报道,针对日本熊本县发生强震造成人员伤亡,中国外交部发言人毛宁7月29日在例行记者会上表示...
高铁喧哗被劝阻后叫嚣全家体制内... “女子高铁喧哗被劝阻后叫嚣全家体制内”一事迎来官方通报。据新京报报道,7月29日,辽宁北票市公安局发...
广东专业蓝牙耳机定制厂家推荐,... 在珠三角腹地,广东早已成为全球蓝牙耳机产业链的“心脏地带”。从深圳华强北的声学元件批发,到东莞、惠州...
格雷厄姆葬礼变地缘竞价场!两大... 有些葬礼,送别的是逝者;有些葬礼,演的却是活人最现实的政治博弈。当地时间7月28日,美国老牌鹰派参议...
一道小学数学题难住3名医学博士... 3名不同学校的博士同做一道数学题,谁最厉害?近日,一陕西网友发布的视频引发热议。29日,视频发布者“...
华为全新“小艺任务”亮相:整合... 7月29日,在华为鸿蒙电脑新品技术沟通会上,终端云服务小艺业务部总裁贾永利宣布,小艺将迎来“从对话到...
广西日报特稿《王的猜想》火了,... 澎湃新闻记者 蒋子文 实习生 汤煜炜为应对外界购买纸质版特稿《王的猜想》的热情,《广西日报》宣布紧急...
月租20元内!2026年平价云... 不少手游玩家、账号运营从业者挑选云手机时,首要诉求就是低价够用,想要控制每月支出在20元以内,同时兼...
诺奖得主如何看待王虹境遇?“我... 中村修二(2014年诺贝尔物理学奖得主)【导读】近日王虹与邓煜双双获得2026年菲尔兹奖,成为了首批...