`

Oracle 条件连接(join) 用法

阅读更多
条件连接(join)
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( join column list )
T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2

INNEROUTER 对所有连接(join) 类型都是可选的.INNER 是缺省; LEFTRIGHT,和 FULL 隐含外连接.

连接条件ONUSING子句里声明, 或者用关键字NATURAL隐含地声明.连接条件判断来自两个源表 中的那些行是"匹配"的,这些我们将在下面详细解释.

ON子句是最常见的连接条件的类型∶它接收一个和WHERE子句里用的一样的 布尔值表达式.如果两个分别来自T1T2的行在ON表达式上运算的 结果为真,那么它们就算是匹配的行.

USING是缩写的概念∶它接收一个用逗号分隔的字段名字列表, 这些字段必须是连接表共有的,最终形成一个连接条件,表示 这些字段对必须相同.最后,JOIN USING 的输出会为每一对相等 的输入字段输出一个字段,后面跟着来自各个表的所有其它字段. 因此,USING (a, b, c) 等效于 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) 只不过是如果使用了ON,那么在结果里 ab,和 c字段每个都会有两个, 而用USING的时候每个字段就只会有一个.

最后,NATURALUSING 的缩写形式∶它形成一个 USING 列表, 该列表由那些在两个表里都出现了的字段名字组成.和USING一样, 这些字段只在输出表里出现一次.

条件JOIN的可能类型是∶

 

INNER JOIN

对于 T1 的每一行 R1,生成的连接表都有一行对应 T2 中的 每一个满足和 R1 的连接条件的行.

LEFT OUTER JOIN

首先,执行一次内连接.然后,为 T1 里那些和 T2 里任何一行都不满足连接条件的行返回一个连接行, 同时该连接行里对应 T2 的列用空值补齐.因此, 生成的连接表里无条件地包含来自 T1 里的每一行至少 一个副本.

RIGHT OUTER JOIN

首先,执行一次内连接.然后,为 T2 里那些和 T1 里任何一行都不满足连接条件的行返回一个连接行, 同时该连接行里对应 T1 的列用空值补齐.因此, 生成的连接表里无条件地包含来自 T2 里的每一行.

FULL OUTER JOIN

首先,执行一次内连接.然后,为 T1 里那些和 T2 里任何一行都不满足连接条件的行返回一个连接行, 同时该连接行里对应 T2 的列用空值补齐. 同样,为 T2 里那些和 T1 里的任何行都不满足连接条件的 行返回一个连接行,该行里对应 T1 的列用空值补齐.

如果 T1T2 有一个或者都是可以连接(join)的表, 那么所有类型的连接都可以串在一起或嵌套在一起. 你可以在JOIN子句周围使用圆括弧来控制连接顺序, 如果没有圆括弧,那么JOIN子句是从左向右嵌套的.

为了解释这些问题,假设我们有一个表 t1

 num | name
-----+------
   1 | a
   2 | b
   3 | c

t2

 num | value
-----+-------
   1 | xxx
   3 | yyy
   5 | zzz

然后我们用不同的连接方式可以获得各种结果:

=> SELECT * FROM t1 CROSS JOIN t2;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   1 | a    |   3 | yyy
   1 | a    |   5 | zzz
   2 | b    |   1 | xxx
   2 | b    |   3 | yyy
   2 | b    |   5 | zzz
   3 | c    |   1 | xxx
   3 | c    |   3 | yyy
   3 | c    |   5 | zzz
(9 rows)

=> SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   3 | c    |   3 | yyy
(2 rows)

=> SELECT * FROM t1 INNER JOIN t2 USING (num);
 num | name | value
-----+------+-------
   1 | a    | xxx
   3 | c    | yyy
(2 rows)

=> SELECT * FROM t1 NATURAL INNER JOIN t2;
 num | name | value
-----+------+-------
   1 | a    | xxx
   3 | c    | yyy
(2 rows)

=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   2 | b    |     |
   3 | c    |   3 | yyy
(3 rows)

=> SELECT * FROM t1 LEFT JOIN t2 USING (num);
 num | name | value
-----+------+-------
   1 | a    | xxx
   2 | b    |
   3 | c    | yyy
(3 rows)

=> SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   3 | c    |   3 | yyy
     |      |   5 | zzz
(3 rows)

=> SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num;
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   2 | b    |     |
   3 | c    |   3 | yyy
     |      |   5 | zzz
(4 rows)

 

ON 声明的连接条件也可以包含与连接不直接相关 的条件。这种功能可能对某些查询很有用,但是需要我们仔细想想。 比如:

=> SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num AND t2.value = 'xxx';
 num | name | num | value
-----+------+-----+-------
   1 | a    |   1 | xxx
   2 | b    |     |
   3 | c    |     |
(3 rows)
评论

相关推荐

    oracle-join用法

    本文将深入探讨Oracle的JOIN用法,包括内连接(INNER JOIN)、外连接(LEFT JOIN, RIGHT JOIN, FULL JOIN)以及自然连接(NATURAL JOIN),并结合实例进行说明。 1. **内连接(INNER JOIN)**: 内连接返回两个表中满足特定...

    Oracle表连接方式

    Oracle表连接方式是指在数据库中连接多个表以获取所需数据的方法。根据不同的数据集和查询需求,Oracle提供了多种表连接方式,包括NESTED LOOP、HASH JOIN和SORT MERGE JOIN等。 NESTED LOOP NESTED LOOP是一种...

    ORACLE表连接方式分析及常见用法

    4. 笛卡尔连接 (CARTESIAN JOIN):如果没有提供连接条件,Oracle将生成所有可能的行组合,通常会导致巨大的结果集,应尽量避免。 5. 哈希连接(HASH JOIN):自Oracle 7.3引入,哈希连接在处理大数据量时表现优秀。...

    Oracle数据库3种主要表连接方式对比

    - 嵌套循环连接是一种基本的连接方法,其原理是通过将一个表中的每一行与另一个表中的所有行进行比较来找出符合条件的记录对。 - 在许多情况下,较小的表会被用作“驱动表”,即首先被处理的表。但是,实际上,即使...

    Oracle数据库表连接方式及常见用法

    本文将详细介绍这些连接方式的定义、使用方法和实例。 一、相等连接 相等连接是指两个表通过一个公共列连接起来的方式。只有在两个表中都存在且值相等的行才会出现在查询结果中。例如,查询员工信息以及对应的员工...

    Oracle连接查找

    根据给定的文件信息,“Oracle连接查找”这一主题涵盖了内连接(Inner Join)、外连接(Outer Join)以及相关的实例和对比。接下来,我们将深入探讨这些知识点。 ### 一、内连接(Inner Join) 内连接是连接类型中...

    Oracle中hash join研究.pdf

    哈希连接(Hash Join)是Oracle数据库中的一种高效连接方法,主要针对等值连接操作,其引入旨在解决嵌套循环连接(Nested Loop Join)中的大量随机读取问题以及排序合并连接(Sort-Merge Join)中的排序成本过高问题...

    Oracle中表的连接及其调整.

    Oracle 查询优化器会自动选择最适合的连接方法,但有时手动调整连接顺序或使用 hints 可以进一步优化性能。例如,在外连接查询中,驱动表通常选择那些需要返回所有记录的表,即使它们可能包含更多的数据。 总结来说...

    oracle表的连接方式

    Oracle提供了三种主要的表连接方式:NESTED LOOP JOIN、HASH JOIN和SORT MERGE JOIN。每种方法都有其独特的应用场景和性能特点。 #### NESTED LOOP JOIN NESTED LOOP JOIN是一种简单的连接方式,适用于连接的数据...

    Oracle连接多个表PPT教案.pptx

    在Oracle中,笛卡尔连接可以通过两种方式实现:传统方法和使用JOIN关键字。传统的笛卡尔连接查询是通过在FROM子句中同时列出两个表,并在WHERE子句中不设置任何连接条件来完成。而使用JOIN关键字,我们可以明确地...

    Oracle数据库表连接笔记.doc

    Oracle数据库提供了多种连接方法,包括嵌套循环连接、排序合并连接、集群连接、笛卡尔连接和散列连接,以及特定情况下的索引连接。每种连接方式都有其适用场景和性能特点。 1. 嵌套循环连接(Nested Loops Join)是...

    C#连接oracle数据库执行简单的增删改查操作

    本示例详细介绍了如何使用C#连接Oracle数据库并执行基本的增、删、改、查(CRUD)操作。这里我们将深入探讨相关知识点。 首先,确保你的项目引用了`System.Data.OracleClient`命名空间,这是.NET Framework提供的...

    oracle 基础教程 jdbc 以及样式demo 各种数据库的连接方法

    4. 多表查询:JOIN操作用于连接两个或更多表,如INNER JOIN(内连接)、LEFT JOIN(左连接)、RIGHT JOIN(右连接)和FULL JOIN(全连接),根据条件合并数据。 三、数据与事务控制 1. CRUD操作:CREATE(创建)、...

    oracle表连接和子查询实例

    - **表连接**:外部`JOIN`语句将`emp`表与子查询结果进行连接,条件是员工的薪资等于其所在部门的最大薪资,并且部门编号也匹配。 - **应用场景**:用于找出每个部门薪资最高的员工。 #### 二、部门平均薪资对应的...

    Oracle-SQL语句(连接查询).doc

    本文主要介绍Oracle SQL中的连接查询类型及其用法。 #### 一、连接查询概述 连接查询是一种在两个或多个表之间建立关联的方法。根据连接方式的不同,可以分为内连接(Inner Join)、左外连接(Left Outer Join)、...

    Oracle学习笔记

    - 新增了交叉连接 (`CROSS JOIN`)、自然连接 (`NATURAL JOIN`)、使用列名称指定连接 (`USING`) 和基于条件的连接 (`ON`) 等多种连接方式。 - 交叉连接会返回两个表的笛卡尔积;自然连接则基于两个表中相同的列进行...

    ORACLE数据库SQL优化---表连接类型.docx

    Oracle数据库的SQL优化是数据库管理员和开发人员关注的重要领域,特别是在处理复杂的表...通过调整连接顺序、选择合适的连接方法和单表访问策略,以及明智地使用内外连接,我们可以显著提升Oracle数据库的SQL执行性能。

    DBD-Oracle1.8

    7. 兼容性:除了标准的Perl DBI接口,DBD-Oracle还可能包含特定于Oracle的扩展方法,以利用Oracle特有的功能。 安装DBD-Oracle1.80时,你需要确保系统已安装了Perl、Oracle客户端库(如Instant Client)以及必要的...

Global site tag (gtag.js) - Google Analytics