zoukankan      html  css  js  c++  java
  • Oracle学习笔记(7)——高级查询(1)

    在学习高级查询之前,我们先了解一下怎样查看Oracle数据库中的全部表。由于我们要使用到Oracle数据库中SCOTT用户下的几张表(这些表是Oracle数据库自带的表)。


    • 分组查询
      • 分组函数的概念:分组函数作用于一组数据,并对一组数据返回一个值。

        • 经常使用的分组函数:AVG、SUM、MIN、MAX、COUNT、WM_CONCAT(行转列)
      • 语法:

      • 分组函数的使用
        • AVG(平均值)和SUM(合计)函数
                                    1、求出员工的平均工资和工资的总额
                                    select avg(sal),sum(sal) from emp;
    • MIN(最小值)和MAX(最大值)函数
                                    2、求出员工工资的最大值和最小值
                                    select max(sal),min(sal) from emp;
    • COUNT(计数)函数
                                    3、求出员工的总人数
                                    select count(*) from emp;
                                    select count(empno) from emp;

    • DISTINCE(distinct)keyword(DISTINCT用于去掉反复的记录)
                                    4、求出部门数
                                      select count(deptno) from emp;
                                      select deptno from emp;
                                      select count(distinct deptno) from emp;

    • WM_CONCAT:行转列
                                    演示样例:select deptno,wm_concat(ename) from emp group by deptno;

    上面显示的样式非常不好看。我们首先用host cls命令清屏,然后运行以下命令。格式化显示的格式
                                    set linesize 200
                                    col 部门中员工的姓名 for a60
                                    select deptno 部门号,wm_concat(ename) 部门中员工的姓名 from emp group by deptno;

    • 分组函数与空值
                                    1、统计员工的平均工资
                                    select sum(sal)/count(*) 一,sum(sal)/count(sal) 二,avg(sal) 三 from emp;

                                    2、统计员工的平均奖金
                                    select sum(comm)/count(*)  一,sum(comm)/count(comm) 二,avg(comm) 三 from emp;
                                    select count(*),count(comm) from emp;

                                   总结:分组函数会自己主动忽略空值,仅仅会统计非空的个数
    • 在分组函数中使用NVL函数
                                    注意:NVL函数使用分组函数无法忽略空值
                                    select count(*),count(nvl(comm,0)) from emp;

    • 使用GROUP BY子句数据分组(GROUP BY能够作用在一个列上,也能够作用在多个列上)
      • group by子句的使用
        • 使用单个列分组
                                    演示样例:求每一个部门的平均工资,要求显示:部门号,部门的平均工资
                                    select deptno,avg(sal) from emp group by deptno;


                                    抽象:Oracle中语法的规定
                                    select a,组函数(x) from table group by a;
                                    select a,b,c,组函数(x) from table group by a,b,c;
                                    注意:在SELECT列表中全部未包括在组函数中的列都应该包括在GROUP BY子句中。包括在GROUP BY子句中的列不必包括在SELECT列表中
                                    演示样例:求每一个部门的平均工资,要求显示:部门的平均工资
                                    select avg(sal) from emp group by deptno;

    • 使用多个列分组
                                        演示样例:按部门、不同的职位,统计员工的工资总额
                                        select deptno,job,sum(sal) from emp group by deptno,job;
                                        select deptno,job,sum(sal) from emp group by deptno,job order by deptno;
    非法使用组函数:
    改动:

    • 使用HAVING子句过滤分组结果集

      • 求平均工资大于2000的部门,要求显示:部门号,平均工资
                            select deptno,avg(sal) from emp group by deptno having avg(sal)>2000


    • where与having的差别
      • 同样点:都是过滤结果集
      • 不同点:
                                                        不能再WHERE子句中使用组函数(注意)
                                                        能够在HAVING子句中使用组函数。

    • where与having通用的情况
                                    select deptno,avg(sal) from emp group by deptno having deptno=10;
                                    select deptno,avg(sal) from emp where deptno=10 group by deptno;
                                    having 先分组 后过滤
                                    where  先过滤 后分组
                                    where使得分组记录数大大减少,从而提高效率
                                    注意:where子句中不能使用组函数
    • 在分组查询中使用order by字句
      • 演示样例:求每一个部门的平均工资,要求显示:部门号,部门的平均工资而且依照工资升序排列
                                      select deptno,avg(sal) from emp group by deptno order by avg(sal);
                                      select deptno,avg(sal) 平均工资 from emp group by deptno order by 平均工资;
                                      select deptno,avg(sal) 平均工资 from emp group by deptno order by 2;
      • 能够依照:列,别名,表达式,序号进行排序



    错误演示:


    • 分组函数的嵌套
      • 演示样例:求部门平均工资的最大值
                                1、通过AVG函数求出每一个部门的平均工资
                                2、嵌套MAX函数求出部门平均工资的最大值
                                   select max(avg(sal)) from emp group by deptno;

    • group by语句的增强
                                break on deptno   2 同样部门号的值仅仅显示一次,不同的部门号之间跳过两行
                                set pagesize 30   每页显示30条记录






    • SQL*Plus的报表功能
                                报表包含:标题,页码,别名等





  • 相关阅读:
    转【程序员七问】
    【转】又一次线上 OOM 排查经过
    【转】java:多网卡环境下获取MAC地址
    eclipse 国际化 $NON-NLS-1$ 含义
    eclipse 重构代码自动抽取函数
    转:GEF 英文全称Graphical Editor Framework
    转:Eclipse使用Git图解教程
    转:Java通过百度地图API获取地址经纬度
    转:Lucene学习——IKAnalyzer中文分词(一)
    转:Maven项目中获取classpath和资源文件的路径
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7191820.html
Copyright © 2011-2022 走看看