Oracle数据库知识梳理---续(单行函数,多行函数,分组数据,分组过滤)

5.单行函数,多行函数,分组数据,分组过滤

多行函数

显示员工表行数
select count(*) from emp;

              COUNT(*)
            ----------
                    14

字符函数

select Lower('Hello') 转小写, upper('hello') 转大写, initcap('hello woRld')  首字母大写 from dual;


            转小  转大  首字母大写
            ----- ----- -----------
            hello HELLO Hello World

组函数

select avg(sal),sum(sal),max(sal),min(sal),count(sal) from emp;

AVG(SAL)   SUM(SAL)   MAX(SAL)   MIN(SAL) COUNT(SAL)
--------- ---------- ---------- ---------- ----------
2073.21429     29025     5000       800       14

组函数和null在一起

求员工的平均工资
selectavg(comm),sum(comm)/count(comm),sum(somm)/sount(*) from emp;                  
上述输出结果都不同

解析如下:可见空值没有被计算在内,组函数自动滤空,组函数忽略空值.
select count(comm),count(*) from emp;
                    COUNT(COMM)   COUNT(*)
                    ----------- ----------
                              4         14
修正组函数的滤空.
select count(nvl(comm,0)),count(*) from emp;

                    COUNT(NVL(COMM,0))   COUNT(*)
                    ------------------ ----------
                                    14         14

分组数据

求各个部门的平均工资
需要将各个部门划分开
select deptno,avg(sal) from emp
group by deptno;
            DEPTNO   AVG(SAL)
            ---------- ----------
                    30 1566.66667
                    20       2175
                    10 2916.66667   

解析:
select检索的列,必须要位于group by后面的集合列中
组函数设计的本意:必须要在分组数据之上,进行结果集的检索
注意:group by 字句要求:所有在select中出现的列,都必须在group by分组子句中
          1  select  deptno,  avg(sal), ename
          2     from emp
          3     group by deptno;

        select  deptno,  avg(sal), ename
                                   *
        第 1 行出现错误:
        ORA-00979: 不是 GROUP BY 表达式

在group by子句中包含多个列
按部门 不同的职位 统计平均工资
先按照部门分组,再按照job分组,如果deptno和job一样,就在同一组,然后求平均工资

每一个部门,每一个工种的平均工资
select deptno,job,avg(sal) from emp group by deptno,job order by 1;

DEPTNO JOB         AVG(SAL) COUNT(DEPTNO)
---------- --------- ---------- -------------
   10 CLERK           1300             1
   10 MANAGER         2450             1
   10 PRESIDENT       5000             1
   20 ANALYST         3000             2
   20 CLERK            950             2
   20 MANAGER         2975             1
   30 CLERK            950             1
   30 MANAGER         2850             1
   30 SALESMAN        1400             4

分组过滤

查询平均工资大于2000的部门
select deptno,avg(sal) from emp 
group by deptno
having avg(sal) > 2000;

            DEPTNO   AVG(SAL)
        ---------- ----------
                20       2175
                10 2916.66667
求10号部门的平均工资

---方法1  ---先分组 再过滤
    select deptno, avg(sal)
    from emp
    group by deptno 
    having   deptno=10

---方法2 ---先过滤在分组.....
    select deptno, avg(sal)
    from emp
    where deptno =10
    group by deptno
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值