`
cenyf
  • 浏览: 44128 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

oracle join用法

阅读更多
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
INNER 和 OUTER 对所有连接(join) 类型都是可选的.INNER 是缺省; LEFT,RIGHT,和 FULL 隐含外连接.

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

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

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

最后,NATURAL 是USING 的缩写形式∶它形成一个 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 的列用空值补齐.

如果 T1 和 T2 有一个或者都是可以连接(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的left join中on和where的区别详解

    在Oracle数据库中,LEFT JOIN是一种联接操作,用于合并两个或更多表的记录,返回所有左表(第一个提及的表)的记录,即使在右表中没有匹配的记录。LEFT JOIN的关键在于它会保留左表的所有行,并尝试与右表匹配。当...

    oracle的update的五种方式

    Merge 更新法是 Oracle 特有的语句,语法为:`MERGE INTO table_name alias1 USING (table|view|sub_query) alias2 ON (join condition) WHEN MATCHED THEN UPDATE table_name SET ... WHEN NOT MATCHED THEN INSERT...

    oracle HINTS用法

    ### Oracle Hints用法详解 Oracle Hints是Oracle数据库中一种非常实用的功能,它允许用户在SQL语句中提供优化器提示,以便更好地控制查询执行计划。这些提示可以帮助数据库优化器选择更有效的路径来执行查询,从而...

    Oracle常见用法

    以下是对Oracle中一些常见用法的详细说明: **SQL查询语句**: SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言。在Oracle中,`SELECT`语句是最基本的查询命令,用于从数据库中检索数据。 ...

    oracle高级用法

    Oracle数据库是全球广泛使用的大型企业级关系型数据库管理系统,它提供了丰富的功能和高效的性能,尤其在数据管理和复杂查询方面表现出色。"Oracle高级用法"主要涵盖了数据库的优化、安全管理、备份恢复、性能监控和...

    oracle查询效率调优实例

    `/*+ USE_NL(TABLE) */` 提示强制 Oracle 使用嵌套循环连接算法来处理特定表,而非默认的连接方法(如哈希连接或合并连接)。这在处理小表或已排序的数据时非常有效,可以显著减少 CPU 时间。 例如,在上述示例中...

    Oracle 子查询

    ### Oracle 子查询详解 #### 引言 在数据库查询语言SQL中,子查询是一...然而,正如所有强大的工具一样,正确的使用方法和充分的性能考量是必不可少的。希望本文能为你在日常的数据库操作中提供有价值的指导和启发。

    oracle_hint教程汇总

    7. **USE_NL, USE_MJ, USE_HASH**:这些Hint强制优化器使用特定的连接方法,如嵌套循环、合并连接或哈希连接。 8. ** Materialized View Hint**:在查询中使用此Hint可以强制优化器使用物化视图,从而提升查询性能...

    Oracle中hash join研究.pdf

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

    Oracle教程

    3. 查询基础:涵盖了Oracle SQL语言的基本知识,包括数据查询语言DQL(Data Query Language),重点讲解SELECT语句的基本结构及其子句的使用方法。 4. 单行函数和分组函数:详细介绍了单行函数,如字符、数字和日期...

    Oracle表连接方式

    使用hash join时,HASH_AREA_SIZE初始化参数必须足够大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY为AUTO,然后调整PGA_AGGREGATE_TARGET即可。以下条件下hash join可能有优势:两个...

    Oracle笔试题及答案

    3. 连接操作:Oracle数据库支持多种连接操作,如INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN等。了解连接操作的使用场景和用法是非常重要的。 4. 子查询:子查询是SQL语句中的一种重要特性,允许在SELECT...

    DBD-Oracle1.8

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

    Statement Tracer for Oracle

    《Oracle语句追踪器——Statement Tracer for Oracle详解》 在Oracle数据库的管理和优化工作中,Statement...虽然网络资源有限,但只要掌握了其主要功能和使用方法,就能充分发挥它的价值,让数据库管理工作更加高效。

    SQL转Oracle的方法

    ### SQL Server 转换至 Oracle 的方法及注意事项 在 IT 领域,数据库迁移是一项常见的任务,尤其是在从 SQL Server 迁移到 Oracle 的场景下。这种迁移涉及到多个层面的技术挑战,包括但不限于语法差异、数据类型...

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

    2. 群集连接 (CLUSTER JOIN):在早期版本的Oracle中,群集连接主要用于处理具有相同物理分布的表,但在现代版本中已被其他更高效的连接方式取代。 3. 排序合并连接(SORT MERGE JOIN):此连接要求参与连接的表都已...

    介绍Oracle应用开发方法和技巧

    本文将深入探讨Oracle应用开发的方法和技巧,帮助开发者更好地理解和掌握Oracle技术。 1. SQL语言基础:Oracle应用开发的核心是SQL,它是用于查询、操作和管理关系数据库的语言。熟练掌握SELECT语句、DML(INSERT, ...

Global site tag (gtag.js) - Google Analytics