Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >用实验方法加深理解Oracle的外连接(left/right/full)和内连接(inner)

用实验方法加深理解Oracle的外连接(left/right/full)和内连接(inner)

作者头像
bisal
发布于 2019-01-29 07:03:52
发布于 2019-01-29 07:03:52
9570
举报

总是对Oracle的左连接、右连接以及(+)对应的外连接类型糊涂,通过实验加深对连接类型语法的理解。外连接分为三种:

1. 左外连接,对应SQL关键字:LEFT (OUTER) JOIN

2. 右外连接,对应SQL关键字:RIGHT (OUTER) JOIN

3. 全外连接,对应SQL关键字:FULL (OUTER) JOIN

左右外连接都是以一张表为基表,在显示基表所有记录外,加上另外一张表中匹配的记录。如果基表的数据在另一张表中没有记录,那么相关联的结果集行中显示为空值。

精确点说,引用MOS:

对于左连接,将会返回join连接条件中第一次提到的表(或者”左边“的表)。

对于右连接,将会返回join连接条件中第二次提到的表(或者”右边“的表)。

实验:

1. 准备:

SQL> create table left_tbl(id number); Table created. SQL> create table right_tbl(id number); Table created.

insert into left_tbl values(1); 

insert into left_tbl values(2);

insert into left_tbl values(3);

insert into right_tbl values(2);

insert into right_tbl values(3);

insert into right_tbl values(6);

SQL> select * from left_tbl;         ID ----------          1          2          3 SQL> select * from right_tbl;         ID ----------          2          3          6

2. 左连接

SQL> select * from left_tbl l left join right_tbl r on l.id = r.id;         ID         ID ---------- ----------          2          2          3          3          1

从排序看,左右表匹配的记录排在前面,并且是升序。

也可以这样写:select * from left_tbl l left join right_tbl r on l.id = r.id(+);

SQL> select * from left_tbl l, right_tbl r where l.id = r.id(+);         ID         ID ---------- ----------          2          2          3          3          1

使用(+),放右表表示左表所有记录,再加上右表的记录。

SQL> select * from left_tbl l, right_tbl r where r.id(+) = l.id;         ID         ID ---------- ----------          2          2          3          3          1

将where条件中左右表互换,结果还是左连接,因为(+)在左边,表示加上right表的记录。

SQL> select * from left_tbl left join right_tbl using (id);         ID ----------          2          3          1

此处使用using,只显示了左表的记录。

3. 右连接

SQL> select * from left_tbl l right join right_tbl r on l.id = r.id;         ID         ID ---------- ----------          2          2          3          3                     6

和左右连接相同,左右表匹配的记录排在前面,并且是升序。

也可以这样写:select * from left_tbl l right join right_tbl r on l.id(+) = r.id;

SQL> select * from left_tbl l, right_tbl r where l.id(+) = r.id;         ID         ID ---------- ----------          2          2          3          3                     6

使用(+),放左表表示右表所有记录,再加上左表的记录。

SQL> select * from left_tbl l, right_tbl r where r.id = l.id(+);         ID         ID ---------- ----------          2          2          3          3                     6

将where条件中左右表互换,结果还是右连接,因为(+)在右边,表示加上left表的记录。

4. 全外连接

SQL> select * from left_tbl l full join right_tbl r on l.id = r.id;或select * from left_tbl l full outer join right_tbl r on l.id = r.id;         ID         ID ---------- ----------          2          2          3          3          1                     6 会显示左右表的记录,不匹配的用NULL。

5. 内连接

说了外连接,再看下内连接,innser join或join。

SQL> select * from left_tbl l inner join right_tbl r on l.id = r.id;         ID         ID ---------- ----------          2          2          3          3 用inner join只显示左右表都匹配的记录。

SQL> select * from left_tbl l join right_tbl r on l.id = r.id;         ID         ID ---------- ----------          2          2          3          3

直接用join和inner join相同。

SQL> select * from left_tbl l, right_tbl r where l.id = r.id;         ID         ID ---------- ----------          2          2          3          3

用=代替on是内连接另外一种用法。

总结: 1. (+)在哪个表的旁边,就表示基表是另外一张表,结果集还需要加上(+)表中不匹配的数据。 2. 内连接inner关键字可省,外连接outer关键字可省。 3. 用on和where =都可以使用(+)方式。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014年07月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档