设为首页 收藏本站
查看: 332|回复: 0

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

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-21 08:34:13 | 显示全部楼层 |阅读模式
总是对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 =都可以使用(+)方式。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-22369-1-1.html 上篇帖子: 查询oracle sql的执行计划时,一个很重要的视图--dba_hist_sql_plan 下篇帖子: Java 连接 Oracle 数据库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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