zoukankan      html  css  js  c++  java
  • oracle组函数、多表查询、分页、

    平均工资:

    SQL> select sum(sal)/count(*) 一, avg(sal) 二 from emp;
    
            一         二
    ---------- ----------
    2073.21429 2073.21429

    空值  组函数会自动滤空

    SQL> select  comm from emp;
    
          COMM
    ----------
    
           300
           500
    
          1400
    
    
    
    
             0
    
    
          COMM
    ----------
    
    
    
    
    已选择14行。

    作为参照:

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

    可以在组函数中嵌套滤空函数,来屏蔽组函数的滤空功能:

    SQL> select count(*),count(nvl(comm,0)) from emp;
    
      COUNT(*) COUNT(NVL(COMM,0))
    ---------- ------------------
            14                 14

    查询平均工资大于2000的部门:

    SQL> ed
    已写入 file afiedt.buf
    
      1  select deptno,avg(sal)
      2      from emp
      3      group by deptno
      4*    having avg(sal)>2000
    SQL> /
    
        DEPTNO   AVG(SAL)
    ---------- ----------
            20       2175
            10 2916.66667

    求10号部门的平均工资:

    SQL> ed
    已写入 file afiedt.buf
    
      1  select deptno,avg(sal)
      2      from emp
      3      group by deptno
      4*     having deptno=10
    SQL> /
    
        DEPTNO   AVG(SAL)
    ---------- ----------
            10 2916.66667

    此时改用 where:

    SQL> ed
    已写入 file afiedt.buf
    
      1  select deptno,avg(sal)
      2      from emp
      3      group by deptno
      4*     where deptno=10
    SQL> /
        where deptno=10
        *4 行出现错误:
    ORA-00933: SQL 命令未正确结束

    内连接:

    语法一:

    select *  from 表1 [inner] join 表2 on 表1.字段1=表2.字段1;

    语法二:

    select *   from 表1,表2  where 表1.字段1=表2.字段1;

    外连接:
    1、左连接:

    select * from 表1 left outer join 表2 on 表1.字段1=表2.字段1;
    select * from 表1 left outer join 表2 where 表1.字段1=表2.字段1;

    2、右连接:

    select *  from 表1 right outer join 表2  on 表1.字段1=表2.字段1;
    select *  from 表1 left outer join 表2  where 表1.字段1(+)=表2.字段1;

    3、全外连接:

    select *   from 表1 full outer join 表2  on 表1.字段1=表2.字段1;

    自连接:
    举个例子:

    自连接(selfjoin)是SQL语句中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。
    示例:
      在oracle的scott的schema中有一个表是emp。在emp中的每一个员工都有自己的mgr(经理),并且每一个经理自身也是公司的员工,自身也有自己的经理。
    但现在我们只有一张emp表。所以我们可以采用自连接。自连接的本意就是将一张表看成多张表来做连接。我们可以这样来写SQL语句:

    SQL> select a.ename as 员工,b.ename as 上级 from emp a,emp b where a.mgr=b.empno;
    
    员工                 上级
    -------------------- --------------------
    FORD                 JONES
    SCOTT                JONES
    JAMES                BLAKE
    TURNER               BLAKE
    MARTIN               BLAKE
    WARD                 BLAKE
    ALLEN                BLAKE
    MILLER               CLARK
    ADAMS                SCOTT
    CLARK                KING
    BLAKE                KING
    
    员工                 上级
    -------------------- --------------------
    JONES                KING
    SMITH                FORD
    
    已选择13行。

    交叉连接: 表与表之间做笛卡尔积查询!:

    select * from 表1 cross join 表2;
            
    select * from 表1, 表2;

     分页查询:

    1、提取员工表前三行:

    SQL> select rownum, emp.* from emp where rownum <4;
    
        ROWNUM      EMPNO ENAME                JOB                       MGR HIREDATE              SAL    COMM        DEPTNO
    ---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
             1       7369 SMITH                CLERK                    7902 17-12月-80            800                20
             2       7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300         30
             3       7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         30

    2、提取员工表四行之后的:

    错误!:

    SQL> select rownum,emp.* from emp where rownum >3;
    
    未选定行

    正确:

    SQL> select * from (select rownum r,emp.* from emp) re where re.r >3;
    
             R      EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
             4       7566 JONES                MANAGER                  7839 02-4月 -81           2975                20
             5       7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400         30
             6       7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                30
             7       7782 CLARK                MANAGER                  7839 09-6月 -81           2450                10
             8       7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                20
             9       7839 KING                 PRESIDENT                     17-11月-81           5000                10
            10       7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         30
            11       7876 ADAMS                CLERK                    7788 23-5月 -87           1100                20
            12       7900 JAMES                CLERK                    7698 03-12月-81            950                30
            13       7902 FORD                 ANALYST                  7566 03-12月-81           3000                20
            14       7934 MILLER               CLERK                    7782 23-1月 -82           1300                10
    
    已选择11行。

    提取工资排行前三的员工:

    SQL> select rownum ,e.* from (select * from emp order by sal desc) e where rownum <4;
    
        ROWNUM      EMPNO ENAME                JOB                       MGR HIREDATE              SAL    COMM        DEPTNO
    ---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
             1       7839 KING                 PRESIDENT                     17-11月-81           5000                10
             2       7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                20
             3       7902 FORD                 ANALYST                  7566 03-12月-81           3000                20

    提取6----10的记录:
    1、扫描全表生成伪表,再进行提取分页(表数据多时效率极低):

    SQL> select * from (select rownum r, e.* from emp e ) er where er.r > 5 and er.r <11;
    
             R      EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
             6       7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                30
             7       7782 CLARK                MANAGER                  7839 09-6月 -81           2450                10
             8       7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                20
             9       7839 KING                 PRESIDENT                     17-11月-81           5000                10
            10       7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         30

    2、提高效率后的写法,只扫描10行提取分页生成伪表:

    SQL> select * from (select rownum r, e.* from emp e where rownum < 11) er where er.r > 5;
    
             R      EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
             6       7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                30
             7       7782 CLARK                MANAGER                  7839 09-6月 -81           2450                10
             8       7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                20
             9       7839 KING                 PRESIDENT                     17-11月-81           5000                10
            10       7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         30

    排序加分页:

    --a排序
    select * from emp order by sal desc
    --b生成前10条伪表
    select rownum , t1.* 
    from (select * from emp order by sal desc ) t1
    where rownum <11
    --提取6到10
    select * from
    (select rownum r , t1.* from (select * from emp order by sal desc ) t1
    where rownum <11) t2 where t2.r >4
    SQL> ed
    已写入 file afiedt.buf
    
      1  select * from
      2  (select rownum r , t1.* from (select * from emp order by sal desc ) t1
      3* where rownum <11) t2 where t2.r >5
      4  ;
    
             R      EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
             6       7782 CLARK                MANAGER                  7839 09-6月 -81           2450                10
             7       7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300         30
             8       7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0         30
             9       7934 MILLER               CLERK                    7782 23-1月 -82           1300                10
            10       7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500         30

    集合使用

    1、并集:union

    工资大于1500,或者是20部门下的员工:

    SQL> select * from emp where sal > 1500
      2  union
      3  select * from emp where deptno =20
      4  ;
    
         EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
          7369 SMITH                CLERK                    7902 17-12月-80            800                 20
          7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
          7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
          7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
          7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
          7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
          7839 KING                 PRESIDENT                     17-11月-81           5000                 10
          7876 ADAMS                CLERK                    7788 23-5月 -87           1100                 20
          7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20
    
    已选择9行。

    2、交集:intersect

    工资大于1500,并且是20部门下的员工

    SQL> select * from emp where sal > 1500
      2  intersect
      3  select * from emp where deptno =20;
    
         EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
          7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
          7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
          7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20

    3、差集:minus

    1981年入职的普通员工(不包括经理,总裁):

    SQL> select * from emp where to_char(hiredate,'yyyy')='1981'
      2  minus
      3  select * from emp where job in ('MANAGER','PRESIDENT')
      4  ;
    
         EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
          7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
          7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
          7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
          7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
          7900 JAMES                CLERK                    7698 03-12月-81            950                 30
          7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20
    
    已选择6行。

     

  • 相关阅读:
    ASP.NET State Service
    C# winform 打印当前窗体
    js计算时间之差
    转 Javascript中event.keyCode键码值表收藏
    从客户端中检测到有潜在危险的 Request.Form
    从VS2005项目转换为VS2008项目 转载
    C# Windows DataGridView 判断CheckBox 选取的方法
    在Visual Studio 2005中调试SQL Server 2005的存储过程
    ASP.NET Ajax 中出现的 sys 未定义(sys undefined)解决方法总结
    KubeMeet 直播 | 现场直击大规模集群、混合环境下的云原生应用交付难题
  • 原文地址:https://www.cnblogs.com/scw123/p/9614831.html
Copyright © 2011-2022 走看看