Oracle:左毗连、右毗连、全外毗连、(+)号详解

打印 上一主题 下一主题

主题 523|帖子 523|积分 1573

目录
Oracle 左毗连、右毗连、全外毗连、(+)号详解
1、左外毗连(LEFT OUTER JOIN/ LEFT JOIN)
2、右外毗连(RIGHT OUTER JOIN/RIGHT JOIN)
3、全外毗连(FULL OUTER JOIN/FULL JOIN)
4、补充
5、Oracle中 (+)与left join 的用法区别

Oracle 左毗连、右毗连、全外毗连、(+)号详解

Oracle 外毗连 (OUTER JOIN) 分为三种: 左外毗连,右外毗连,全外毗连。left join、right join 和 join 的区别如下:


  • 左外毗连(左边的表不加限制)
  • 右外毗连(右边的表不加限制)
  • 全外毗连(左右两表都不加限制)
  • 毗连(左右两表交集)
对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常省略OUTER关键字, 写成:LEFT/RIGHT/FULL JOIN。


在左毗连和右毗连时都会以一张表为基础表,另一张表为补充表,基础表的内容会全部体现,然后再加上两张表匹配的内容。 如果基础表的数据在补充表中没有记载, 那么在相关联的结果集行中补充表列体现为空值(NULL)。
对于外毗连, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:

  • (+)操作符只能出如今 WHERE 子句中,并且不能与 OUTER JOIN 语法同时使用。
  • 当使用(+)操作符执行外毗连时,如果在WHERE子句中包罗有多个条件,则必须在所有条件中都包罗(+)操作符。
  • (+)操作符只适用于列,而不能用在表达式上。
  • (+)操作符不能与 OR 和 IN 操作符一起使用。
  • (+)操作符只能用于实现左外毗连和右外毗连,而不能用于实现完全外毗连。
开始前,先创建两张表,插入数据便于理解测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE A (
id   number,
name  VARCHAR2(10)
);

CREATE TABLE B (
id   number,
name  VARCHAR2(10)
);

INSERT INTO A VALUES(1,’A1’);
INSERT INTO A VALUES(1,’A2’);
INSERT INTO A VALUES(2,’B1’);
INSERT INTO A VALUES(3,’C1’);
INSERT INTO A VALUES(4,’D1’);

INSERT INTO B VALUES(1,’AA’);
INSERT INTO B VALUES(1,’BB’);
INSERT INTO B VALUES(2,’CC’);
INSERT INTO B VALUES(6,’DD’);
1、左外毗连(LEFT OUTER JOIN/ LEFT JOIN)

LEFT JOIN 是以左表的记载为基础表,右表的记载为补充表,示例中A表可以当作左表,B表可以当作右表,它的结果集是A表中的全部数据,再加上A表和B表匹配后的数据。换句话说,左表(A)的记载将会全部表示出来,而右表(B)只会体现符合搜索条件的记载。A表有B表没有的记载对应的B表列体现为NULL。
1
2
3
4
5
6
7
8
9
10
11
SQL> select * from A a left join B b on a.id = b.id;

        ID NAME               ID NAME
————— ————— ————— —————
         1 A2                  1 AA
         1 A1                  1 AA
         1 A2                  1 BB
         1 A1                  1 BB
         2 B1                  2 CC
         4 D1
         3 C1
用(+)来实现, 这个 + 号可以如许来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在右表,左表就是全部体现,所以是左毗连。
1
select * from A a,B b where a.id=b.id(+);
2、右外毗连(RIGHT OUTER JOIN/RIGHT JOIN)

和LEFT JOIN的结果刚好相反,是以右表(B)为基础的。它的结果集是B表所有记载,再加上A和B匹配后的数据。 A表记载不敷的地方均为NULL。
1
2
3
4
5
6
7
8
9
10
SQL> select * from A a right join B b on a.id = b.id;

        ID NAME               ID NAME
————— ————— ————— —————
         1 A1                  1 BB
         1 A1                  1 AA
         1 A2                  1 BB
         1 A2                  1 AA
         2 B1                  2 CC
                               6 DD
用(+)来实现, 这个+号可以如许来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在左表,右表就是全部体现,所以是右毗连。
1
select * from A a,B b where a.id(+)=b.id;
3、全外毗连(FULL OUTER JOIN/FULL JOIN)

左表和右表都不做限制,所有的记载都体现,两表不敷的地方均为NULL。 全外毗连不支持(+)写法。
1
2
3
4
5
6
7
8
9
10
11
12
SQL> select * from A a full join B b on a.id = b.id;

        ID NAME               ID NAME
————— ————— ————— —————
         1 A1                  1 BB
         1 A1                  1 AA
         1 A2                  1 BB
         1 A2                  1 AA
         2 B1                  2 CC
         3 C1
         4 D1
                               6 DD
4、补充

1
2
3
4
5
6
7
8
9
SQL> select * from A a,B b where a.id = b.id;

        ID NAME               ID NAME
————— ————— ————— —————
         1 A1                  1 BB
         1 A1                  1 AA
         1 A2                  1 BB
         1 A2                  1 AA
         2 B1                  2 CC
1
2
3
4
5
6
7
8
9
SQL> select * from A a join B b on a.id = b.id;

        ID NAME               ID NAME
————— ————— ————— —————
         1 A1                  1 BB
         1 A1                  1 AA
         1 A2                  1 BB
         1 A2                  1 AA
         2 B1                  2 CC
1
2
3
4
5
6
7
SQL> select * from A a where a.id in (select b.id from B b);

        ID NAME
————— —————
         1 A2
         1 A1
         2 B1
1
2
3
4
5
6
7
SQL> select * from A a where exists (select 1 from B b where a.id = b.id);

        ID NAME
————— —————
         1 A2
         1 A1
         2 B1
5、Oracle中 (+)与left join 的用法区别

1. (+) 写在 where 背面,不能与 or/in 连用, a表是主表,b表是附属表。
select * from a,b where a.id=b.id(+);
2. 左毗连写在 from 与where之间,a left join b on a.id=b.id :主表a left join 附表b on 毗连条件。
select * from a left join b on a.id=b.id;
3.效率上没区别,left join 可读性高、功能更全面、通用性强、而且是新标准,发起使用left join。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表