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

总是对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 =都可以使用(+)方式。

时间: 2024-12-27 19:06:48

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

深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.       2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEF

求教sql中,如何外连接2个需要内连接的表

问题描述 如题,假设有三个表A,B,C.A需要外连接B,而B要内连接C,sql语句应如何写.在mysql中我是这样写的:select A.* ,B.* ,C.* from A left outer join B on A.id = B.id inner join C on B.name = C.name where ....但是运行时不会得出预期的结果,恳请各位大大指点. 问题补充:hudingchen 写道 解决方案 你把你要的项目加上就可以阿SELECT A.*,M.* FROM A LEF

深入并行:从数据倾斜到布隆过滤深度理解Oracle的并行

陈焕生 Oracle Real-World Performance Group 成员,senior performance engineer,专注于 OLTP.OLAP 系统 在 Exadata 平台和 In-Memory 特性上的最佳实践.个人博客 http://dbsid.com . 编辑手记:感谢陈焕生授权我们发布他的精品文章,Sidney撰写这个系列的文章时间跨度也有两年,下篇刚刚出炉,我们先从他去年投稿的第一篇开始. 上一篇请阅读:深入并行:从生产者到消费者模型深度理解Oracle的并

深入并行:从并行加载到12c Adaptive特性深度理解Oracle并行

陈焕生 Oracle Real-World Performance Group 成员,senior performance engineer,专注于 OLTP.OLAP 系统 在 Exadata 平台和 In-Memory 特性上的最佳实践.个人博客 http://dbsid.com . 编辑手记:感谢陈焕生的精品文章,这篇文章首发在ACOUG,在此转载分享给大家,Sidney撰写这个系列的文章时间跨度也有两年,下篇刚刚出炉. 上篇分为两篇文章: 深入并行:从生产者到消费者模型深度理解Oracl

深入并行:从生产者到消费者模型深度理解Oracle的并行

陈焕生 Oracle Real-World Performance Group 成员,senior performance engineer,专注于 OLTP.OLAP 系统 在 Exadata 平台和 In-Memory 特性上的最佳实践.个人博客 http://dbsid.com . 编辑手记:感谢陈焕生授权我们发布他的精品文章,Sidney撰写这个系列的文章时间跨度也有两年,下篇刚刚出炉,我们先从他去年投稿的第一篇开始. Oracle 的并行执行 Oracle 的并行执行是一种分而治之的方

深刻理解Oracle数据库的启动和关闭_oracle

正在看的ORACLE教程是:深刻理解Oracle数据库的启动和关闭.Oracle数据库提供了几种不同的数据库启动和关闭方式,本文将详细介绍这些启动和关闭方式之间的区别以及它们各自不同的功能. 一.启动和关闭Oracle数据库 对于大多数Oracle DBA来说,启动和关闭Oracle数据库最常用的方式就是在命令行方式下的Server Manager.从Oracle 8i以后,系统将Server Manager的所有功能都集中到了SQL*Plus中,也就是说从8i以后对于数据库的启动和关闭可以直接

正则表达式字符类加深理解

正则表达式字符类加深理解: 一.基本概念: 字符类相对来说是比较简单的,但是也有可能由于理解不够深入或者大意造成一些误区,下面再来做一下介绍. 字符类[]能够匹配包含在中括号中的一系列字符中的任意一个,但是匹配的结果只能够是其中的一个而不是多个,例如: var str="abcd"; var reg=/[abcd]/; console.log(str.match(reg)); 以上正则表达式只能够匹配字符"a". 二.使用连字符"-": 字符类可

java中除了方法可以使用throws关键词抛出异常外,类可以吗

问题描述 java中除了方法可以使用throws关键词抛出异常外,类可以吗 java中除了方法可以使用throws关键词抛出异常外,类可以吗,可不可以抛来抛去而不处理它 解决方案 方法中如果需要抛出异常,就只能用throws异常的,那么调用这个方法的地方必须处理这个抛出的异常.如果调用了抛出异常的方法,要么使用try-catch处理该异常,要么直接抛给它的上层调用者.最后如果都没有处理,那么运行时就由JVM进行处理,那么程序就会出错了. 解决方案二: 类不可以抛出异常,方法抛出的异常交给调用者处

android新闻客户端 页面 翻滚 方法的理解

问题描述 android新闻客户端 页面 翻滚 方法的理解 scrollTo(1 1) 里面的 1 ,1表示什么意思呢? 右侧可以实现向下翻滚的效果 解决方案 这个要看它怎么定义的,不是系统类库.应该是表示位置的参数