表连接

内连接 
        等值连接     员工和部门       部门和地区        
        非等值连接   员工的工资 和 对应的工资级别
        自连接          谁是领导?
 外连接
        等值连接     员工和部门 (找出没有部门的员工)      部门和地区 (没有地区编号的部门)        
        非等值连接   员工的工资 和 对应的工资级别  (超出统计范围的工资)
        自连接          谁是普通员工?

  外连接的结果集 等于 内连接的结果集  加上匹配不上的记录 
        如何实现的?
  (+)   (+)的意思所在字段的对面的表的数据全部被匹配出来
         本质上 底层是通过 NULL 记录进行的匹配

SQL99 内外连接

内连接标准 
 from  a表  join b表  on 连接条件  where 过滤条件;
 from  a表  inner join b表  on 连接条件  where 过滤条件;
       显示 每个部门的名字 和 对应的地区的名字 
   select  d.name,r.name
      from  s_dept d,s_region r
          where  d.region_id = r.id;
 select  d.name,r.name
      from  s_dept d  join s_region r
          on  d.region_id = r.id;
 select  d.name,r.name
      from  s_dept d  inner  join s_region r
          on  d.region_id = r.id;

 外连接的标准

 a表  left outer  join  b 表  on 表的连接条件   where  过滤条件;
 a表  right outer  join  b 表  on 表的连接条件   where  过滤条件;
 a表  full  outer  join  b 表  on 表的连接条件  where  过滤条件; 
 a表  left outer  join  b 表  就是a表发起连接  意思就是a表的数据全部被匹配出来。
 a表  right outer  join b 表  就是b表发起连接  意思就是 b表的数据全部被匹配出来。

       本质上也通过 NULL 记录进行的匹配
       显示每个部门的名字  和 对应的地区的名字  没有地区编号的部门也要显示  
  select d.id, d.name,r.name
      from  s_dept  d,s_region r 
          where  d.region_id = r.id(+);   

   select d.id, d.name,r.name
      from  s_dept  d left outer  join s_region r 
          on  d.region_id = r.id;

   select d.id, d.name,r.name
      from  s_region r  right outer  join  s_dept  d
          on  d.region_id = r.id;      
           使用左外连接  实现 s_emp 谁是普通员工的问题 显示  id  first_name 
           谁是领导?40   谁是普通员工 40   改成 left outer  join  20
    select distinct m.id,m.first_name
        from  s_emp  e,s_emp m 
            where  e.manager_id(+) = m.id and e.manager_id is null;        
   select distinct m.id,m.first_name
        from  s_emp  m  left outer join s_emp e 
            on  e.manager_id = m.id where e.manager_id is null;
  select distinct m.id,m.first_name
        from  s_emp  m  left  join s_emp e 
            on  e.manager_id = m.id where e.manager_id is null;

  full outer join  
        全外连接 只是一个逻辑概念,代表左外连接的结果集 加上 右外连接的结果集 然后 排除重复的记录。

  Oracle 中如何实现全外连接呢? 不是通过两端都加(+) 实现的。
         而是通过  union    来实现的 union 的意思是 合并两个结果集  然后排重。

  union  all  合并两个结果集  不排重。

  select  id from  s_emp  union  

  select id from s_emp;

  select  id from  s_emp  union  all 

  select id from s_emp;    


9月      数据库

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!