Oracle中join left,join right,inner join,(+) 等

建表create table TEST1
create table TEST1
(
  t_id       VARCHAR2(21),
  t_name     VARCHAR2(21),
  t_mangerid VARCHAR2(21)
)

create table TEST2
(
  t_id   VARCHAR2(21),
  salary NUMBER
)

test1 暂且叫员工表吧,test2薪水表

在oracle中 外链接为 a  left/right join b on a.xx = b.xx其中join后面也可以添加outer也可以省略,相当于a.xx = b.xx (+)(此时为左链接),写法的历史与优劣本文暂不讨论,只针对简单的左右链接,外链接,全链接等,对应的关键字如下:

  CROSS JOIN        笛卡尔乘积(所有可能的行对)
INNER JOIN        仅对满足连接条件的CROSS中的列
LEFT OUTER JOIN        一个表满足条件的行,和另一个表的所有行
RIGHT OUTER JOIN        与LEFT相同,但两个表的角色互换
FULL OUTER JOIN        LEFT OUTER 和 RIGHT OUTER中所有行的超集

链接定义如下:

 连接类型        定义
内连接        只连接匹配的行
左外连接        包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
  右外连接        包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
全外连接        包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
(H)(theta)连接        使用等值以外的条件来匹配左、右两个表中的行
交叉连接        生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行  都一一匹配

现对以上每种链接做一个查询,在数据库中插入如下数据:

TEST1中

        1 001 dyf 003 

        2 002 xwc 003 
        3 003 mm  
TEST2中

        1 001 7000
        2 002 5000
        3 009 10000

  1. inner join内链接

           select a.t_name, b.salary
               from test1 a
             full join test2 b
                  on a.t_id = b.t_id

          结果如下 1 dyf 7000
                       2 xwc 5000
                       3        10000
                       4 mm 
    5.     自身链接

         select a.t_id,a.t_name, b.t_name
            from test1 a
          join test1 b
             on a.t_mangerid = b.t_id

         查询员工管理者的姓名

         结果如下 1 002 xwc mm
                      2 001 dyf mm
    6.     交叉无限制链接

          交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中一的每个行都要与数据集合二中的每一个行分别组成一个新的行。例如,如果第一个数据源中有5个行,而第二个数据源中有4个行,那么在它们之间进行交叉连接就会产生20个行。人们将这种类型的结果集称为笛卡尔乘积。
    大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。
        select a.t_id,a.t_name,b.t_id,b.salary
           from test1 a
             cross join test2 b

         select a.t_name, b.salary
            from test1 a
          inner join test2 b
              on a.t_id = b.t_id

  

        此语句与下面语句相同

          select a.t_name, b.salary
            from test1 a, test2 b

          where a.t_id = b.t_id

        查询的是员工的薪水,只有两个表中匹配才会出现查询出结果,结果如下

     1 dyf 7000
     2 xwc 5000

   2.    left join on左外连接

        
         select a.t_name, b.salary
           from test1 a
         left join test2 b
              on a.t_id = b.t_id

       与

       select a.t_name, b.salary
            from test1 a, test2 b

          where a.t_id = b.t_id(+)相同

         查询员工的薪水,不管新水表中是否有此员工的记录都会把此员工显示出来,结果如下

        1 dyf 7000
        2 xwc 5000
        3 mm 

  3.   right join on右外连接 

        

       select a.t_name, b.salary
           from test1 a
         right join test2 b
              on a.t_id = b.t_id
       

         查询员工的薪水,不管员工表中是否存在薪水表中对应的员工都会把薪水表数据选出来,结果如下

         1 dyf 7000
         2 xwc 5000
         3  10000
4.     full join on 全链接

         

猜你喜欢

转载自dangyafeng.iteye.com/blog/1517342