您的位置:首页 > 数据库 > Oracle

Oracle86和92语法的连接,子查询,集合的操作

2016-07-01 23:13 435 查看
一  比较86和92语法中多表连接区别 

 

   1笛卡尔积 

 

   --oracle连接的基础 笛卡尔积 

   --92语法 更加清晰明了的区别了 每一种连接  

    --解决了多表关联时  条件不清晰的问题 

 

   select * from emp; 

    select * from dept; 

    --86语法 

 

   select * from emp e,dept d; 

 

    --92语法 

 

   select * from emp cross join dept 

    2内连接 

   select * from emp; 

    select * from dept; 

    --86语法 

   select * from emp e,dept d where e.deptno=d.deptno; 

    --92语法 

   select * from emp inner join dept on emp.deptno=dept.deptno 

    3左外连(左外连接和右外联的区别在于 谁为主 谁为从  意义相同) 

   --86语法 

   select * from emp e,dept d where e.deptno=d.deptno(+) 

    --92语法 

   select * from emp e left join dept d on e.deptno=d.deptno 

-- oracle中子查询 

                表子查询  只要输出的结果是个表结构 就可以放在from后查询 也可以设置别名 

      select abc.ename,abc.loc from ( 

       select * from emp e inner join dept d on e.deptno=d.deptno 

       ) abc; 

       select * from emp; 

       select * from dept; 

 

       /** 

 

          列的子查询  子查询 永远只能返回一行一列数据 

         列子查询的原理 

 

         for(emp e: list<emp>){ 

 

             syso(e.ename); 

 

             for(dept d: list<dept>){ 

 

                if(e.deptno==d.deptno){ 

 

                    syso(d.dname) 

 

                     break; 

 

                } 

 

             } 

 

          } 

 

       **/ 

 

       select ename,(select dname from dept  where deptno=e.deptno) from emp e;  

        --条件子查询 

       select * from tab; 

        select * from salgrade  

        --薪水等级是2的人 

       select losal,hisal from salgrade where grade=2 

        select * from emp where sal>=(select losal from salgrade where grade=2) 

 

              and sal<=(select hisal from salgrade where grade=2) 

        select * from emp  e inner join salgrade s on e.sal>=s.losal and e.sal<=s.hisal 

        where s.grade=2 

         /** 

 

        /** 

        --多行子查询 

 

        for(emp e: list<emp>){ 

 

             syso(e.ename); 

 

             for(dept d: list<dept>){ 

 

                if(d.dname.indexOf('A')>=0){ 

 

                 if(e.deptno==d.deptno ){ 

 

                      syso(d.dname) 

 

                      break; 

                 } 

 

                } 

 

             } 

 

          } 

 

        **/ 

        select * from emp where deptno =any( 

               select deptno from dept where dname like '%A%' 

        ) 

 

        select * from emp where deptno in( 

 

               select deptno from dept where dname like '%A%' 

 

        )  

 

        --效率最高的子查询语句 

 

       select * from emp e where exists( 

 

               select deptno from dept d where d.deptno=e.deptno and dname like '%A%' 

 

        )  

       

 2 集合操作符 

 

     并集 

 

     union all 集合中的元素 全部叠加 不会去重复 

 

     union  集合中的元素 全部叠加 会去重复 

 

     intersect 交集 

 

     {1,2},{2,3} 结果为 {2} 

 

     minus 取差集 

 
     {1,2},{2,3} 结果为{1}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: