ORACLE SQL 组函数【weber出品必属精品】

  1. 组函数:对一组数据进行加工,每组数据返回一个值
  2. 常用的组函数:count()  avg()  max()   min()  sum()  
  3. count()函数 

    1. count(*) :返回总共的行数,不去除NULL值

    2. count(column):返回非NULL行的数量

    SQL> select count(*) ,count(sal),count(comm) from emp;
    
      COUNT(*) COUNT(SAL) COUNT(COMM)
    ---------- ---------- -----------
        14        14          4

    3.除了count(*)意外,其他的组函数都要去除NULL

    SQL>select avg(sal),count(sal),sum(sal)/count(comm) average,count(sal)/count(nvl(comm,0)) average2,count(comm) countnotnull  from emp
    
    AVG(SAL) COUNT(SAL)  AVERAGE   AVERAGE2 COUNTNOTNULL
    ---------- ---------- ---------- ---------- ------------
    2073.21429     14    7256.25      1        4
    
    这里解释一下:avg()的除数是14,sum(sal)/count(comm)的除数则是4
  4. DISTINCT()函数

    SQL> select empno,ename,comm from emp;
    
         EMPNO ENAME      COMM
    ---------- -------- ----------
          7369 SMITH
          7499 ALLEN       300
          7521 WARD        500
          7566 JONES
          7654 MARTIN     1400
          7698 BLAKE
          7782 CLARK
          7788 SCOTT
          7839 KING
          7844 TURNER        0
          7876 ADAMS
          7900 JAMES
          7902 FORD
          7934 MILLER
    
    SQL> select count(distinct comm) from emp;--返回唯一的非空comm的数量
    
    COUNT(DISTINCTCOMM)
    -------------------
                      4
    
    这里有个小问题:
    SQL> update emp set comm=300 where empno=7521
    1 row updated.
    SQL> select count(distinct comm ) from emp;
    
    COUNT(DISTINCTCOMM)
    -------------------
              3
    说明:distinct只是将重复的字段给过滤掉了。并不能说明:返回唯一的非空comm的数量,这种说法只能是在comm非空且不重复的情况下才可以。 
  5. GROUP BY 子句:创建分组数据
    在SELECT语句中,没有使用分组函数的列必须在GROUP By子句中
  6. SQL> select deptno,avg(sal) from emp;
    select deptno,avg(sal) from emp
           *
    第 1 行出现错误:
    ?ORA-00937: 不是单组分组函数

    GROUP BY后面的列可以不出现在 SELECT语句中

    SQL> select avg(sal) from emp group by deptno;
    
      AVG(SAL)
    ----------
    1566.66667
          2375
    2916.66667

    多个列上使用 GROUP BY 子句

    SQL> select deptno,job,sum(sal) from emp group by deptno,job;
    
    DEPTNO JOB         SUM(SAL)
    ------ --------- ----------
        20 CLERK           1900
        30 SALESMAN        5600
        20 MANAGER         2975
        30 CLERK            950
        10 PRESIDENT       5000
        30 MANAGER         2850
        10 CLERK           1300
        10 MANAGER         2450
        20 ANALYST         7000
    
    先按照deptno进行分组,deptno相同的再按照job进行分组
  7.   分组函数的误用

    1. 在SELECT 语句中,任何不在聚组函数中出现的列,必须在 GROUP BY 子句中

    2. 不能在 WHERE子句中对组函数做出限定,使用 HAVING 子句来限定分组

    SQL> select deptno,avg(sal) from emp where avg(sal)>2000  group by deptno;
    select deptno,avg(sal) from emp where avg(sal)>2000  group by deptno
                                          *
    第 1 行出现错误:
    ORA-00934: 此处不允许使用分组函数
    正确用法:
    SQL> select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
        DEPTNO   AVG(SAL)
    ---------- ----------
        20   2175
        10 2916.66667
  8.  组函数的嵌套

    1. 组函数只能嵌套一层

    2. 使用组函数嵌套,必须跟group by子句

    错误的写法:
    SQL> select max(avg(sal)) from emp;
    select max(avg(sal)) from emp
               *
    ERROR at line 1:
    ORA-00978: nested group function without GROUP BY
    
    错误的写法:
    SQL> select deptno,max(avg(sal)) from emp group by deptno;
    select deptno, max(avg(sal)) from emp group by deptno
           *
    ERROR at line 1:
    ORA-00937: not a single-group group function
    因为select deptno查出来的是一列的内容,而组函数max()返回的只有一个值也错了、
    正确的写法:
    SQL> select max(avg(sal)) from emp group by deptno
    
    MAX(AVG(SAL))
    -------------
       2916.66667
  9.   子句执行的顺序

    SELECT子句
    FROM 子句
    WHERE 子句
    GROUP BY 子句
    HAVING 子句
    
    select deptno,job,sum(sal)
    from emp
    where comm is not null
    group by deptno,job
    having sum(sal)>2000
    以上SQL语句的执行顺序
    
    1. from子句
    2. select子句
    3. where子句
    ?4. group by 子句
    5. 聚合运算:sum
    6. having子句

ORACLE SQL 组函数【weber出品必属精品】

时间: 2024-10-08 06:50:42

ORACLE SQL 组函数【weber出品必属精品】的相关文章

ORACLE SQL单行函数(一)【weber出品必属精品】

1.SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数到最后 SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数到最后 2.LENGTH:求字符串的长度 SQL> select LENGTH('HELLOWO

ORACLE SQL单行函数(二)【weber出品必属精品】

11.dual:虚表,任何用户都可以使用,表结构如下: SQL> desc dual Name Null? Type ----------------------------------------- -------- ---------------------------- DUMMY VARCHAR2(1) 12.dual的作用: 1. 查询数据库系统日期 2. 进行四则运算 SQL> select sysdate from dual; ---这里查询数据库系统日期 SYSDATE ---

ORACLE SQL单行函数(三)【weber出品必属精品】

16.L:代表本地货币符,这个和区域有关.这个时候我们想来显示一下人民币的符号:¥ $ vi .bash_profile ---写入如下内容: export NLS_LANG='SIMPLIFIED CHINESE'_CHINA.AL32UTF8 ---修改成简体中文+地区+字符集 source .bash_profile ---让环境变量生效 [[email protected] ~]$ sqlplus scott/tiger SQL*Plus: Release 10.2.0.5.0 - Pr

全世界最详细的图形化VMware中linux环境下oracle安装(一)【weber出品必属精品】

安装流程:前期准备工作--->安装ORACLE软件--->安装升级补丁--->安装odbc创建数据库--->安装监听器--->安装EM <前期准备工作> 安装配置系统环境安装linux ,所有服务都不选择,只是选择安装开发工具,不要安装防火墙(当然也可以在后面关闭) 打开终端,执行如下命令,检查安装包,没有的都要安装 make, glibc, libaio compat-libstdc++, compat-gcc-34, compat-gcc-34-c++, gc

oracle数据库事务相关【weber出品必属精品】

事务的概念:事务:一个事务由一组构成一个逻辑操作的DML语句组成 事务有开始有结束,事务以DML语句开始,以Conmmit和Rollback结束.以下情况会使得事务结束: 1. 执行COMMIT 或者 ROLLBACK 语句 2. 执行DDL或者 DCL语句 3. 用户退出 4. 系统崩溃 一个事务可以包含下列语句: 1. 对数据做出一致性修改的DML语句 2. 一个 DDL 语句 3. 一个 DCL语句 DDL与和DCL语句执行的过程: 1. 首先发出COMMIT; 2. 执行对数据字典的DM

linux删除ORACLE【weber出品必属精品】

关闭数据库 sqlplus / as sysdba shutdown abort 清除oracle软件 su - oracle cd $ORACLE_BASE rm -rf * rm -rf /etc/ora* 删除之前的设置的配置文件的内容 如果之前改过版本,编辑文件 /etc/redhat-release 把Red Hat Enterprise Linux Server release 4 (Tikanga) 改成版本5 vi /etc/pam.d/login 行末删除以下内容 sessio

静默安装ORACLE【weber出品必属精品】

由于本次的实验我是将上次的虚拟机直接拷贝过来,然后将里面图形化界面安装好了的oracle给删除,再次重新安装,所以这里要修改一些配置. 首先修改的是我们的IP地址 # system-config-network 完成后我们修改一下hosts文件,将里面的ip地址给修改一下 # vi /etc/hosts 接着我们删除上次安装过的ORACLE文件 # cd $ORACLE_BASE # ls # rm -rf * 进入root:rm -rf /etc/ora* 还是在安装前进行配置. 接下来进行静

全世界最详细的图形化VMware中linux环境下oracle安装(二)【weber出品必属精品】

<ORACLE 10.2.05版本的升级补丁安装> 首先我们解压 $ unzip p8202632_10205_LINUX.zip 解压后我们会发现多出了个文件夹,他是:Disk1,进入Disk1.然后执行安装: $ ./runInstaller 执行脚本 # /u01/app/oracle/10.2.0/db_1/root.sh Running Oracle 10g root.sh script... The following environment variables are set a

创建和管理表【weber出品必属精品】

创建表 必须有 : 1. CREATE TABLE 的权限 SQL> conn /as sysdba 已连接. SQL> create user test default tablespace users identified by a; 用户已创建. SQL> conn test/a ERROR: ORA-01045: user TEST lacks CREATE SESSION privilege; logon denied 警告: 您不再连接到 ORACLE. SQL> co