内链接和外链接

简介

等值链接  非等值链接 特殊的自链接都属于内链接sql

  • 内链接:符合链接的条件的数据被选中,不符合条件的数据被滤去
  • 外链接:外链接的结果集等于内链接的结果集加上匹配不上的记录(一个也不能少)

如何实现外链接

(+)  把(+)字段对面的表的数据所有被匹配出来数据库

select  distinactt m.id,m.first_name from s_emp e,s_emp m where  e.manager_id(+)=m.id;

(+)把领导表里的普通员工用NULL匹配(这是链接条件)oracle

找普通员工也要从领导表中找,由于领导表中有绝对条件证实谁是领导,可是员工表里没有这个绝对条件。因此要把领导表中的数据所有匹配出来,因此(+)要加到员工表的字段上,这样领导表里的全部数据就都被匹配了(普通员工匹配的是NULL),要找普通员工时,只要找员工表里匹配的manager_id是NULL的就能找到普通员工(这是过滤条件)spa

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  *  from s_dept;
select  *  from s_region;

(1)内链接:要求显示每一个部门的id  和部门对应的名字  以及对应的地区名3d

select d.id, d.name, r.name from s_dept d, s_region r where d.region_id=r.id;

 

  显示了12条数据。blog

 

(2)业务扩展,成立新部门  id为100,name为test  region_id为NULLio

 insert into  s_dept  values(100 ,‘test’,NULL);(表中的增长)

  

再用上面的方法查找就只找获得原来的,新增长的找不到,由于region_id为NULL。class

 

(3因此外链接使没有地区编号的部门也要显示出来,由于要把部门表里的全部部门匹配显示出来,那么就要把(+)加在地区表上test

select d.id, d.name, r.name from s_dept d, s_region r where d.region_id=r.id(+)

。。。。。。扩展

 

演示二:

(1)内链接:统计每一个员工的id  salary,并显示工资的工资级别(用到s_emp和salgrade表)

select e.id, e.salary, s.grade from s_emp e, salgrade s where e.salary between s.losal and s.hisal;

  。。。。。。

 

(2)有一天把老板的工资改成12500,超出了salgrade的统计范围。

update s_emp set salary=12500;

再用上面的方法找,老板的就丢失了!

select e.id, e.salary, s.grade from s_emp e, salgrade s where e.salary between s.losal and s.hisal order by id;

  。。。。。。

  

  从结果能够看出,没有了“id=1”的老板的项目。

  

(3因此要用外链接把超出统计范围的员工信息也要显示出来。由于要把员工信息表的全部信息匹配显示出来,因此要在salgrade对应的的字段上加(+),这里要加两个。

select e.id, e.salary, s.grade from s_emp e, salgrade s where e.salary between s.losal(+) and s.hisal(+) order by id;

总结

每次写外链接时,能够先写号内链接(写好内链接要搞清楚表和表之间关系以及业务逻辑),再加上(+),就是用NULL匹配。由于外链接的结果集等于内链接的结果集加上匹配不上的记录。

(+)字段对面的表的数据所有被匹配出来

(+)只针对oracle数据库

可是全部数据库的语法机制是差很少的,只是表现形式有变化 

  • 表链接:
    • 内链接:
      • 等值
      • 非等值
      • 自链接
    • 外链接:
      • 等值
      • 非等值
      • 自链接

 额外补充

sql99中规定的内外链接

  • 内链接:
from  a表,b表   where 链接条件变为99标准:
from  a表  join  b表  on  链接条件(过滤条件不能写在一块儿)
或者from  a表  inner join  b表  on  链接条件

演示:列出每一个部门的名字和对应的地区名

一般使用的:

select d.name, r.name from s_dept d, s_resgion r where d.region_id=r.id;

 

  99标准的:(通常不怎么用)

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

  

  • 外链接
    • 左外链接:a表发起链接,a表的数据所有被匹配出来(经过NULL记录来所有匹配)
from  a表  left outer  join  b表  on  链接条件;

   oracle使用的(+):

select d.name, r.name from s_dept d, s_region r where d.region_id=r.id(+);

  

 

99标准的:

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

       

    • 右外链接:b表发起链接,b表的数据所有被匹配出来
from  a表  right outer  join  b表  on  链接条件;
    • 全外链接:实际上只是一个逻辑概念,实际用途中没什么用。全外链接的结果集等于左外链接的结果集加上右外链接的结果集,而且排除重复部分(就是左右两张表都所有匹配,a表b表书写顺序随便)

     oracle没法使用(+)实现全外链接

from  a表  full outer  join  b表  on  链接条件;

 

oracle的全外链接

引用两个关键字union和union  all

  • union:能够合并两个结果集,而后排重
  • union  all:能够合并两个结果集(不排重)

好比:

select  id from  s_emp  unoin ; 输出25条数据
select  id  from s_emp  unoin  all ; 输出50条数据
相关文章
相关标签/搜索