zoukankan      html  css  js  c++  java
  • Oracle查询总结

    -------------------------------多表查询--------------------------------------
    
    
    --笛卡尔积查询.
    select * from emp,dept;--结果为64条,emp表有14条,dept表有4条
    --别名查询
    --改变查询后的结果显示的列名,在字段后面写要显示的列名(注意一定要用双引号括起来,oracle查询中之后这里用到双引号!)
    select ename "name" ,loc "地点" from emp e ,dept d where e.deptno = d.deptno; 
    
    --查询出雇员的编号,姓名,部门的编号和名称,地址
    select * from emp;
    select * from dept;
    select e.empno  "雇员编号",
           e.ename  "姓名",
           e.deptno "部门的编号",
           d.dname  "部门名称",
           d.loc    "部门地址"from emp e,
           dept   d where e.deptno = d.deptno;--当字段名唯一时,字段前的别名可以省略
    select empno  "雇员编号",
          ename  "姓名",
          e.deptno "部门的编号",--当两张表中都有该字段时,字段前的别名一定不能省略
          dname  "部门名称",
          loc    "部门地址"from emp e,
          dept     d where e.deptno = d.deptno;
    
    --查询出每个员工的上级领导
    select e1.mgr,e1.ename , e2.empno, e2.ename
      from emp e1, emp e2
     where e1.mgr = e2.empno ;
    
    --在上面的查询基础上查询该员工的部门名称
    select e1.mgr,e1.ename , e2.empno, e2.ename,d.dname
      from emp e1, emp e2,dept d
     where e1.mgr = e2.empno and e1.deptno = d.deptno;
    
    --查出每个员工编号,姓名,部门名称,工资等级和他的上级领导的姓名,工资等级
    select * from salgrade;
    select * from emp;
    
    select e1.mgr,
           e1.sal,
           e1.ename,
           decode(g1.grade,
                  1,
                  '一等',
                  2,
                  '二等',
                  3,
                  '三等',
                  4,
                  '四等',
                  5,
                  '五等') "员工工资等级",
           e2.empno,
           e2.sal,
           e2.ename,
           decode(g2.grade,
                  1,
                  '一等',
                  2,
                  '二等',
                  3,
                  '三等',
                  4,
                  '四等',
                  5,
                  '五等') "领导工资等级"
      from emp      e1, --员工表
           emp      e2, --领导表
           salgrade g1, --员工工资等级
           salgrade g2 --领导工资等级
     where e1.mgr = e2.empno
       and e1.sal between g1.losal and g1.hisal
       and e2.sal between g2.losal and g2.hisal;
    
    ----------------------------外连接(左右连接)---------------------------
    --查询所有部门下的员工
    
    select * from emp;
    select * from dept;
    select e.ename, e.deptno, d.dname
      from emp e,--非全量表,因为在emp表中没有40对应的部门编号
      dept d--全量表 dept表中有所有的部门编号
     where e.deptno(+) = d.deptno;--(+)是oracle特有的表示左连接或者有链接的符号,
                                   --(+)添加在非全量表中(那个表中少,就添加到那个表中)
    select e.ename, e.deptno, d.dname
      from emp e
     right join dept d
        on e.deptno = d.deptno; --右连接实现
    select e.ename, e.deptno, d.dname
      from dept d
      left join emp e
        on e.deptno = d.deptno; --左连接实现
    --查询出比雇员7654的工资高,同时从事和7788的工作一样的员工
    select *
      from emp e
     where sal > (select sal from emp where empno = 7654)
       and job = (select job from emp where empno = 7788);
    
    --------------------------子查询--------------------------
    --查询出每个部门的最低工资和最低工资的雇员和部门名称 select ename, sal, e.deptno,d.dname from emp e, (select deptno, min(sal) minsal from emp group by deptno) a, dept d where e.sal = a.minsal and e.deptno = d.deptno;
    ---------------------分页功能--------------------
    rowid:--是每行数据指向磁盘的物理地址
    rownum:--查询时每行数据上贴的序号
    select e.*, rownum,rowid from emp e ;
    --查询员工表中工资最高的前三名
    select t.*, rownum
      from (select e.* from emp e order by sal desc) t
     where rownum < 4;
    --查询4,5,6的工资排名的员工
    select t2.*
      from (select t.*, rownum r
              from (select e.* from emp e order by sal desc) t
             where rownum < 7) t2
     where r > 3;
     
     select t2.*
      from (select t.*, rownum r
              from (select e.* from emp e order by sal desc) t
             ) t2
     where r > 3 and r < 7;
     
     --------------------------行转列------------------------------
     --统计每年入职的员工个数
     select to_char(hiredate,'yyyy'), count(*) from emp group by to_char(hiredate,'yyyy');
     
     decode(列名,值,显示数据) -- 
     别名
     
     select sum(counts) "Total",
             sum(decode(years,'1980',counts)) "1980",
             sum(decode(years,'1982',counts)) "1982",
             sum(decode(years,'1981',counts)) "1981",
             sum(decode(years,'1987',counts)) "1987"
       from 
       (select to_char(hiredate,'yyyy') years, count(*) counts from emp group by to_char(hiredate, 'yyyy'));
    ---子查询的总结
       --子查询可以返回单行单列值
       --子查询可以返回多行多列值
       --子查询可以返回多行多列值(当成子表使用)
       --子查询可以提高查询效率
     
     ------------------exists的用法------------
     select * from 表名 where exists (子查询)
     exists(子查询) 如果子查询没有结果,exists(子查询)返回false
     exists(子查询) 如果子查询有结果,exists(子查询)返回true
     --查询没有员工的部门
     select * from dept d where not exists(select * from emp e where e.deptno = d.deptno )
     
     -----------------------------集合运算---------------------------------
     并集
     交集
     补集
     --查询工资大于1500或者是20号部门下的员工
     select * from emp where sal > 1500
     union -- 并集
     select * from emp where deptno = 20 ;
     select * from emp where sal > 1500 or deptno = 20;
     --查询工资大于1500并且是20号部门下的员工
     select * from emp where sal > 1500
     intersect -- 交集
     select * from emp where deptno = 20 ;
     select * from emp where sal > 1500 and deptno = 20;
     --查询1981年入职的员工,不包括经理和总裁
     select * from emp where to_char(hiredate,'yyyy')='1981'
     minus -- 补集
     select * from emp where job='MANAGER' or job = 'PRESIDENT'
     --如果两个查询结果对应的列数和数据类型都一样,就可以用集合运算
     
     ----------------递归查询(oracle独有)---------------------
     select * from 表名
     start with 条件1
     connect by prior 条件2
     --查询7566号员工的所有下属
     select * from emp 
     start with empno=7566
     connect by prior empno=mgr
     
    

      

      

  • 相关阅读:
    Typora 使用 Markdown 嵌入 LaTeX 数学公式符号语法
    爬虫常用的 urllib 库知识点
    执行Go程序的三种方式及Go语言关键字
    Win10 安装 MongoDB 3.6.5 失败的问题
    笨办法理解动态规划算法
    EclipseEE的Web开发环境配置(使用Tomcat作为Web服务器)
    二分类神经网络公式推导过程
    B+树在磁盘存储中的应用
    JAVA NIO工作原理及代码示例
    B树和B+树的插入、删除图文详解
  • 原文地址:https://www.cnblogs.com/cocosili/p/6947556.html
Copyright © 2011-2022 走看看