Oracle学习总结9--多表查询

多表查询

      • 内联查询
      • 外联查询
      • 内联和外联的区别

内联查询

--多表联合查询:在查询中如果所需的数据来自多张表,那么就需要多表联合查询
--多表联合的联合方式分为: 
   /*(1):内联(inner join ) :在结果集中仅仅显示那些符合连接条件的数据
          select ... from  表1  [inner] join 表2  on 表1和表2进行连接的依据  
          where   
          group by   
          order by
   */
--查询员工的编号,姓名,工资,所在部门名
     select empno,ename,sal ,dname 
     from emp  inner join dept on emp.deptno = dept.deptno 
  --因为emp表中JONES在DEPT中没有对应记录(即不满足连接条件所以不会被放入结果集)

--查询员工的编号,姓名,工资,和工资等级
    select empno,ename,sal,grade 
    from emp inner join salgrade on sal between losal and hisal
--查询从事 CLERK工作的员工的编号,姓名,工资,和工资等级
    select empno,ename,sal,grade 
    from emp inner join salgrade on sal between losal and hisal
    where job='CLERK'
    
--查询员工的编号,姓名,工资,工资等级和部门名称
select empno,ename,sal,grade,dname 
from  emp join salgrade on sal between losal and hisal
          join dept  on emp.deptno = dept.deptno
          
--子查询 :提供一个数值(一行一列)  提供一个集合(一列)
--子查询,可以将查询结果看成一张临时表(如果将查询结果看成一张表那么select后的计算列必须起别名)

  --查询部门信息以及该部门下的员工人数
  select dept.*,rs from dept  join
   (select deptno,count(*) as rs from emp group by deptno) t
  on dept.deptno = t.deptno
  
  --查询部门人数大于4人的部门信息以及部门人数
  --思路1:先联合,再过滤
  select dept.*,rs  from dept
                      join (select deptno,count(*) as rs from emp group by deptno) t
                      on dept.deptno = t.deptno
                    where rs >4
                    
   --思路2:先过滤,再联合
     select dept.*,rs  from dept
                      join (select deptno,count(*) as rs from emp group by deptno having count(*)>4) t
                      on dept.deptno = t.deptno
   /*子查询的作用
   在SQL中可以由另一个查询提供
   1、一个值(一行一列)
   2、一个集合(一列)
   3、一张临时表(计算列起别名)
   */

外联查询

 /*(2):外联(  left|right outer join ):
      在将符合连接条件的数据放入结果集的基础上,
      还要将(join 的左侧或右侧)的表中不满足连接条件的信息
      也要放入结果,对则表中的数据用null补齐
      (即外联就是确保将某一侧表中记录都放入结果集,原则是能符合连接条件就连接,不符合连接条件
      就将本侧表的数据放入结果集对侧表的数据用null补齐)
   */
   --显示所有员工的员工编号,员工姓名,工资,和所在部门名称(如果该员工没有分配部门则显示临时部门)
  
      select empno,ename,sal, dname from emp left outer join dept on emp.deptno = dept.deptno

    select empno,ename,sal, dname from dept right outer join emp on emp.deptno = dept.deptno
   
   --查询所有部门信息以及部门员工人数,如果该部门没有员工则人数显示0
   select  dept.*,nvl(rs,0) as 人数 from dept left outer join
           (select deptno,count(*) as rs from emp group by deptno) t
           on dept.deptno = t.deptno
           
           select * from dept

内联和外联的区别

内联查询仅将符合条件的数据放入结果集,外联查询是将符合条件的结果放入结果集,不符合的结果也放入结果集用null补齐,如果是left outer join 则将左表数据全放入结果集,right outer join则将右表数据全放入结果集

你可能感兴趣的:(Oracle)