<b>详解Oracle多种表衔接方法</b>[Oracle防范]
本文“<b>详解Oracle多种表衔接方法</b>[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
1. 内衔接(自然衔接)
2. 外衔接
(1)左外衔接 (左边的表不加限制)
(2)右外衔接(右边的表不加限制)
(3)全外衔接(左右两表都不加限制)
3. 自衔接(同一张表内的衔接)
SQL的尺度语法:
- select table1.column,table2.column
- 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张测试表并插入数据:
- SQL> select * from dave;
- ID NAME
- ---------- ----------
- 1 dave
- 2 bl
- 1 bl
- 2 dave
- SQL> select * from bl;
- ID NAME
- ---------- ----------
- 1 dave
- 2 bl
1.2.3 用内链接举行查询:
- SQL> Select a.id,a.name,b.name from dave a inner join bl b on a.id=b.id; -- 尺度写法
- ID NAME NAME
- ---------- ---------- ----------
- 1 dave dave
- 2 bl bl
- 1 bl dave
- 2 dave bl
- SQL> Select a.id,a.name,b.name from dave a join bl b on a.id=b.id; -- 这里省略了inner 关键字
- ID NAME NAME
- ---------- ---------- ----------
- 1 dave dave
- 2 bl bl
- 1 bl dave
- 2 dave bl
- SQL> Select a.id,a.name,b.name from dave a,bl b where a.id=b.id; -- select 多表查询
- ID NAME NAME
- ---------- ---------- ----------
- 1 dave dave
- 2 bl bl
- 1 bl dave
- 2 dave bl
从这三个SQL 的后果我们也可以看出,他们的作用是一样的.
1.3 自然衔接(Natural join)
自然衔接是在两张表中探求那些数据范例和列名都相同的字段,然后自动地将他们衔接起来,并返回全部符合条件按的后果.
先看一下自然衔接的例子:
- SQL> Select id,name from dave a natural join bl b;
- ID NAME
- ---------- ----------
- 1 dave
- 2 bl
这里我们并没有指定衔接的条件,实际上oracle为我们自作主张的将,dave表中的id和name字段与bl表中的id和name字段举行了衔接.也就是实际上相当于
- SQL> Select dave.id,bl.name
- From dave join bl on dave.id = bl.id and dave.name=bl.name;
- ID NAME
- ---------- ----------
- 1 dave
- 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里加一些差别的数据. 以便利测试.
- SQL> select * from bl;
- ID NAME
- ---------- ----------
- 1 dave
- 2 bl
- 3 big bird
- 4 exc
- 9 怀宁
- SQL> select * from dave;
- ID NAME
- ---------- ----------
- 8 安庆
- 1 dave
- 2 bl
- 1 bl
- 2 dave
- 3 dba
- 4 sf-express
- 5 dmm
2.1 左外衔接(Left outer join/ left join)
left join是以左表的记录为底子的,示例中Dave可以当作左表,BL可以当作右表,它的后果集是Dave表中的数据,在加上Dave表和BL表匹配的数据.换句话说,左表(Dave)的记录将会全部表示出来,而右表(BL)只会显示符合搜索条件的记录.BL表记录不足的地方均为NULL.
示例:
- SQL> select * from dave a left join bl b on a.id = b.id;
- ID NAME ID NAME
- --------- ---------- ---------- ----------
- 1 bl 1 dave
- 1 dave 1 dave
- 2 dave 2 bl
- 2 bl 2 bl
- 3 dba 3 big bird
- 4 sf-express 4 exc
- 5 dmm -- 此处B表为null,因为没有匹配到
- 8 安庆 -- 此处B表为null,因为没有匹配到
- SQL> select * from dave a left outer join bl b on a.id = b.id;
- ID NAME ID NAME
- ---------- ---------- ---------- ----------
- 1 bl 1 dave
- 1 dave 1 dave
- 2 dave 2 bl
- 2 bl 2 bl
- 3 dba 3 big bird
- 4 sf-express 4 exc
- 5 dmm
- 8 安庆
用(+)来实现, 这个+号可以这样来理解: + 表示增补,即哪个表有加号,这个表就是匹配表.所以加号写在右表,左表就是全部显示,故是左衔接.
- SQL> Select * from dave a,bl b where a.id=b.id(+); -- 注意: 用(+) 就要用关键字where
- ID NAME ID NAME
- ---------- ---------- ---------- ----------
- 1 bl 1 dave
- 1 dave 1 dave
- 2 dave 2 bl
- 2 bl 2 bl
- 3 dba 3 big bird
- 4 sf-express 4 exc
- 5 dmm
- 8 安庆
2.2 右外衔接(right outer join/ right join)
和left join的后果刚好相反,是以右表(BL)为底子的, 显示BL表的所以记录,在加上Dave和BL 匹配的后果. Dave表不足的地方用NULL填充.
示例:
- SQL> select * from dave a right join bl b on a.id = b.id;
- ID NAME ID NAME
- ---------- ---------- ---------- ----------
- 1 dave 1 dave
- 2 bl 2 bl
- 1 bl 1 dave
- 2 dave 2 bl
- 3 dba 3 big bird
- 4 sf-express 4 exc
- 9 怀宁 --此处左表不足用Null 填充
已挑选7行.
- SQL> select * from dave a right outer join bl b on a.id = b.id;
- ID NAME ID NAME
- ---------- ---------- ---------- ----------
- 1 dave 1 dave
- 2 bl 2 bl
- 1 bl 1 dave
- 2 dave 2 bl
- 3 dba 3 big bird
- 4 sf-express 4 exc
- 9 怀宁 --此处左表不足用Null 填充
已挑选7行.
用(+)来实现, 这个+号可以这样来理解: + 表示增补,即哪个表有加号,这个表就是匹配表.所以加号写在左表,右表就是全部显示,故是右衔接.
- SQL> Select * from dave a,bl b where a.id(+)=b.id;
- ID NAME ID NAME
- ---------- ---------- ---------- ----------
- 1 dave 1 dave
- 2 bl 2 bl
- 1 bl 1 dave
- 2 dave 2 bl
- 3 dba 3 big bird
- 4 sf-express 4 exc
- 9 怀宁
2.3 全外衔接(full outer join/ full join)
左表和右表都不做限制,全部的记录都显示,两表不足的地方用null 填充. 全外衔接不支持(+)这种写法.
示例:
- SQL> select * from dave a full join bl b on a.id = b.id;
- ID NAME ID NAME
- ---------- ---------- ---------- ----------
- 8 安庆
- 1 dave 1 dave
- 2 bl 2 bl
- 1 bl 1 dave
- 2 dave 2 bl
- 3 dba 3 big bird
- 4 sf-express 4 exc
- 5 dmm
- 9 怀宁
已挑选9行.
- SQL> select * from dave a full outer join bl b on a.id = b.id;
- ID NAME ID NAME
- ---------- ---------- ---------- ----------
- 8 安庆
- 1 dave 1 dave
- 2 bl 2 bl
- 1 bl 1 dave
- 2 dave 2 bl
- 3 dba 3 big bird
- 4 sf-express 4 exc
- 5 dmm
- 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语句:
- SQL> select work.ename worker,mgr.ename manager from scott.emp work, scott.emp mgr
- 2 where work.mgr = mgr.empno(+)
- 3 order by work.ename;
- WORKER MANAGER
- ---------- ----------
- ADAMS SCOTT
- ALLEN BLAKE
- BLAKE KING
- CLARK KING
- FORD JONES
- JAMES BLAKE
- JONES KING
- KING --此处右表不足用Null 填充
- MARTIN BLAKE
- MILLER CLARK
- SCOTT JONES
- SMITH FORD
- TURNER BLAKE
- WARD BLAKE
已挑选14行.
以上是“<b>详解Oracle多种表衔接方法</b>[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |