当前位置:七道奇文章资讯数据防范Oracle防范
日期:2011-01-25 22:55:00  来源:本站整理

<b>详解Oracle多种表衔接方法</b>[Oracle防范]

赞助商链接



  本文“<b>详解Oracle多种表衔接方法</b>[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

1. 内衔接(自然衔接)

2. 外衔接

(1)左外衔接 (左边的表不加限制)

(2)右外衔接(右边的表不加限制)

(3)全外衔接(左右两表都不加限制)

3. 自衔接(同一张表内的衔接)

SQL的尺度语法:

  1. select table1.column,table2.column 
  2. from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2; 

inner join 表示内衔接;
left join表示左外衔接;
right join表示右外衔接;
full join表示完好外衔接;
on子句 用于指定衔接条件.

注意:

假如利用from子句指定内、外衔接,则必必要利用on子句指定衔接条件;

假如利用(+)操作符指定外衔接,则必须利用where子句指定衔接条件.

一. 内衔接(Inner Join/Join)

1.1  Inner Join

Inner join逻辑运算符返回满意第一个(顶端)输入与第二个(底端)输入联接的每一行.这个和用select查询多表是一样的效果,所以内衔接用的很少.
还有一点要阐明的就是Join 默许就是inner join. 所以我们在写内衔接的时刻可以省略inner 这个关键字.

1.2 下面举例来阐明内衔接:

1.2.1 先成立2张测试表并插入数据:

  1. SQL> select * from dave;  
  2. ID  NAME 
  3. ---------- ----------  
  4. 1  dave  
  5. 2  bl  
  6. 1  bl  
  7. 2  dave  
  8.  
  9.  
  10. SQL> select * from bl;  
  11. ID  NAME 
  12. ---------- ----------  
  13. 1  dave  
  14. 2  bl 

1.2.3 用内链接举行查询:

  1. SQL> Select a.id,a.name,b.name from dave a inner join bl b on a.id=b.id;   -- 尺度写法  
  2. ID NAME       NAME 
  3. ---------- ---------- ----------  
  4. 1 dave       dave  
  5. 2 bl         bl  
  6. 1 bl         dave  
  7. 2 dave       bl  
  8.  
  9.  
  10. SQL> Select a.id,a.name,b.name from dave a join bl b on a.id=b.id;  -- 这里省略了inner 关键字  
  11. ID NAME       NAME 
  12. ---------- ---------- ----------  
  13. 1 dave       dave  
  14. 2 bl         bl  
  15. 1 bl         dave  
  16. 2 dave       bl  
  17.  
  18.  
  19. SQL> Select a.id,a.name,b.name from dave a,bl b where a.id=b.id;  -- select 多表查询  
  20. ID NAME       NAME 
  21. ---------- ---------- ----------  
  22. 1 dave       dave  
  23. 2 bl         bl  
  24. 1 bl         dave  
  25. 2 dave       bl 

从这三个SQL 的后果我们也可以看出,他们的作用是一样的.

1.3 自然衔接(Natural join)

自然衔接是在两张表中探求那些数据范例和列名都相同的字段,然后自动地将他们衔接起来,并返回全部符合条件按的后果.

先看一下自然衔接的例子:

  1. SQL> Select id,name from dave a natural join bl b;  
  2. ID NAME 
  3. ---------- ----------  
  4. 1 dave  
  5. 2 bl 

这里我们并没有指定衔接的条件,实际上oracle为我们自作主张的将,dave表中的id和name字段与bl表中的id和name字段举行了衔接.也就是实际上相当于

  1. SQL> Select dave.id,bl.name 
  2. From dave join bl on dave.id = bl.id and dave.name=bl.name;  
  3. ID NAME 
  4. ---------- ----------  
  5. 1 dave  
  6. 2 bl 

因此,我们也可以将自然衔接理解为内衔接的一种.

有关自然衔接的一些注意事项:

(1).假如做自然衔接的两个表的有多个字段都满意有相同名称和范例,那么他们会被作为自然衔接的条件.

(2).假如自然衔接的两个表仅是字段名称相同,但数据范例差别,那么将会返回一个错误.

二. 外衔接(Outer Join)

outer join则会返回每个满意第一个(顶端)输入与第二个(底端)输入的联接的行.它还返回任安在第二个输入中没有匹配行的第一个输入中的行.外衔接分为三种: 左外衔接,右外衔接,全外衔接. 对应SQL:LEFT/RIGHT/FULL OUTER JOIN. 普通我们省略outer 这个关键字. 写成:LEFT/RIGHT/FULL JOIN.

在左外衔接和右外衔接时城市以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容. 假如基表的数据在另一张表没有记录. 那么在相关联的后果集行中列显示为空值(NULL).

关于外衔接, 也可以利用“(+) ”来表示. 关于利用(+)的一些注意事项:

1.(+)操作符只能呈目前where子句中,并且不能与outer join语法同时利用.

2. 当利用(+)操作符履行外衔接时,假如在where子句中包含有多个条件,则必须在全部条件中都包含(+)操作符

3.(+)操作符只实用于列,而不能用在表达式上.

4.(+)操作符不能与or和in操作符一同利用.

5.(+)操作符只能用于实现左外衔接和右外衔接,而不能用于实现完好外衔接. 

在做实行之前,我们先将dave表和bl里加一些差别的数据. 以便利测试.

  1. SQL> select * from bl;  
  2.         ID NAME 
  3. ---------- ----------  
  4.          1 dave  
  5.          2 bl  
  6.          3 big bird  
  7.          4 exc  
  8.          9 怀宁  
  9. SQL> select * from dave;  
  10.         ID NAME 
  11. ---------- ----------  
  12.          8 安庆  
  13.          1 dave  
  14.          2 bl  
  15.          1 bl  
  16.          2 dave  
  17.          3 dba  
  18.          4 sf-express  
  19.          5 dmm 

2.1 左外衔接(Left outer join/ left join)

left join是以左表的记录为底子的,示例中Dave可以当作左表,BL可以当作右表,它的后果集是Dave表中的数据,在加上Dave表和BL表匹配的数据.换句话说,左表(Dave)的记录将会全部表示出来,而右表(BL)只会显示符合搜索条件的记录.BL表记录不足的地方均为NULL.

示例:

  1. SQL> select * from dave a left join bl b on a.id = b.id;  
  2.        ID NAME               ID NAME 
  3. --------- ---------- ---------- ----------  
  4.         1 bl                  1 dave  
  5.         1 dave                1 dave  
  6.         2 dave                2 bl  
  7.         2 bl                  2 bl  
  8.         3 dba                 3 big bird  
  9.         4 sf-express          4 exc  
  10.         5 dmm                             -- 此处B表为null,因为没有匹配到  
  11.         8 安庆                             -- 此处B表为null,因为没有匹配到  
  12.  
  13. SQL> select * from dave a left outer join bl b on a.id = b.id;  
  14.         ID NAME               ID NAME 
  15. ---------- ---------- ---------- ----------  
  16.          1 bl                  1 dave  
  17.          1 dave                1 dave  
  18.          2 dave                2 bl  
  19.          2 bl                  2 bl  
  20.          3 dba                 3 big bird  
  21.          4 sf-express          4 exc  
  22.          5 dmm  
  23.          8 安庆  

用(+)来实现, 这个+号可以这样来理解: + 表示增补,即哪个表有加号,这个表就是匹配表.所以加号写在右表,左表就是全部显示,故是左衔接.

  1. SQL> Select * from dave a,bl b where a.id=b.id(+);    -- 注意: 用(+) 就要用关键字where  
  2.        ID NAME               ID NAME 
  3. ---------- ---------- ---------- ----------  
  4.          1 bl                  1 dave  
  5.          1 dave                1 dave  
  6.          2 dave                2 bl  
  7.          2 bl                  2 bl  
  8.          3 dba                 3 big bird  
  9.          4 sf-express          4 exc  
  10.          5 dmm  
  11.          8 安庆  

2.2 右外衔接(right outer join/ right join)

和left join的后果刚好相反,是以右表(BL)为底子的, 显示BL表的所以记录,在加上Dave和BL 匹配的后果. Dave表不足的地方用NULL填充.

示例:

  1. SQL> select * from dave a right join bl b on a.id = b.id;  
  2.         ID NAME               ID NAME 
  3. ---------- ---------- ---------- ----------  
  4.          1 dave                1 dave  
  5.          2 bl                  2 bl  
  6.          1 bl                  1 dave  
  7.          2 dave                2 bl  
  8.          3 dba                 3 big bird  
  9.          4 sf-express          4 exc  
  10.                                9 怀宁    --此处左表不足用Null 填充 

已挑选7行.

  1. SQL> select * from dave a right outer join bl b on a.id = b.id;  
  2.         ID NAME               ID NAME 
  3. ---------- ---------- ---------- ----------  
  4.          1 dave                1 dave  
  5.          2 bl                  2 bl  
  6.          1 bl                  1 dave  
  7.          2 dave                2 bl  
  8.          3 dba                 3 big bird  
  9.          4 sf-express          4 exc  
  10.                                9 怀宁  --此处左表不足用Null 填充 

已挑选7行.  

用(+)来实现, 这个+号可以这样来理解: + 表示增补,即哪个表有加号,这个表就是匹配表.所以加号写在左表,右表就是全部显示,故是右衔接.

  1. SQL> Select * from dave a,bl b where a.id(+)=b.id;  
  2.         ID NAME               ID NAME 
  3. ---------- ---------- ---------- ----------  
  4.          1 dave                1 dave  
  5.          2 bl                  2 bl  
  6.          1 bl                  1 dave  
  7.          2 dave                2 bl  
  8.          3 dba                 3 big bird  
  9.          4 sf-express          4 exc  
  10.                               9 怀宁  

2.3 全外衔接(full outer join/ full join)

左表和右表都不做限制,全部的记录都显示,两表不足的地方用null 填充. 全外衔接不支持(+)这种写法.

示例:

  1. SQL> select * from dave a full join bl b on a.id = b.id;  
  2.         ID NAME               ID NAME 
  3. ---------- ---------- ---------- ----------  
  4.          8 安庆  
  5.          1 dave                1 dave  
  6.          2 bl                  2 bl  
  7.          1 bl                  1 dave  
  8.          2 dave                2 bl  
  9.          3 dba                 3 big bird  
  10.          4 sf-express          4 exc  
  11.          5 dmm  
  12.                                9 怀宁 

已挑选9行.

  1. SQL> select * from dave a full outer join bl b on a.id = b.id;  
  2.         ID NAME               ID NAME 
  3. ---------- ---------- ---------- ----------  
  4.          8 安庆  
  5.          1 dave                1 dave  
  6.          2 bl                  2 bl  
  7.          1 bl                  1 dave  
  8.          2 dave                2 bl  
  9.          3 dba                 3 big bird  
  10.          4 sf-express          4 exc  
  11.          5 dmm  
  12.                                9 怀宁 

已挑选9行.

三. 自衔接

自衔接(self join)是SQL语句中常常要用的衔接方法,利用自衔接可以将自身表的一个镜像当作另一个表来对待,从而可以得到一些特别的数据.

示例:

在oracle的scott的schema中有一个表是emp.在emp中的每一个员工都有自己的mgr(经理),并且每一个经理自身也是公司的员工,自身也有自己的经理.

下面我们需求将每一个员工自己的名字和经理的名字都找出来.这时刻我们该怎么做呢?

假如我们有两张这样的表辨别教worker和mgr,那么我们就很好写SQL语句.

Select worker.name,

Mgr.name

From worker,mgr

Where worker.id = mgr.id;

但目前我们只有一张emp表.所以我们可以采取自衔接.自衔接的本意就是将一张表当作多张表来做衔接.我们可以这样来写SQL语句:

  1. SQL> select work.ename worker,mgr.ename  manager from scott.emp work, scott.emp mgr  
  2.   2  where work.mgr = mgr.empno(+)  
  3.   3  order by work.ename;  
  4. WORKER     MANAGER  
  5. ---------- ----------  
  6. ADAMS      SCOTT  
  7. ALLEN      BLAKE  
  8. BLAKE      KING  
  9. CLARK      KING  
  10. FORD       JONES  
  11. JAMES      BLAKE  
  12. JONES      KING  
  13. KING                                  --此处右表不足用Null 填充  
  14. MARTIN     BLAKE  
  15. MILLER     CLARK  
  16. SCOTT      JONES  
  17. SMITH      FORD  
  18. TURNER     BLAKE  
  19. WARD       BLAKE 

已挑选14行.   以上是“<b>详解Oracle多种表衔接方法</b>[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .