Oracle表连接方式概述

Oracle 表之间的连接分为三种:

1. 内连接(自然连接)

2. 外连接

(1)左外连接 (左边的表不加限制)

(2)右外连接(右边的表不加限制)

(3)全外连接(左右两表都不加限制)

3. 自连接(同一张表内的连接)

SQL的标准语法:

select table1.column,table2.column from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2;

inner join 表示内连接;

left join表示左外连接;

right join表示右外连接;

full join表示完全外连接;

on子句 用于指定连接条件。

注意:

如果使用from子句指定内、外连接,则必须要使用on子句指定连接条件;

如果使用(+)操作符指定外连接,则必须使用where子句指定连接条件。

一、内连接(Inner Join/Join)

1、Inner Join

Inner join逻辑运算符返回满足第一个(顶端)输入与第二个(底端)输入联接的每一行。这个和用select查询多表是一样的效果,所以内连接用的很少。

还有一点要说明的就是Join 默认就是inner join。 所以我们在写内连接的时候可以省略inner 这个关键字。

2、下面举例来说明内连接:

(1)先创建2张测试表并插入数据:

SQL> select * from dave;

ID NAME

---------- ----------

1 dave

2 bl

1 bl

2 dave

SQL> select * from bl;

ID NAME

---------- ----------

1 dave

2 bl

(2)用内链接进行查询:

SQL> Select a.id,a.name,b.name from dave a inner join bl b on a.id=b.id;  -- 标准写法

   ID NAME    NAME

---------- ---------- ----------

    1 dave    dave

    2 bl     bl

    1 bl     dave

    2 dave    bl

SQL> Select a.id,a.name,b.name from dave a join bl b on a.id=b.id; -- 这里省略了inner 关键字

   ID NAME    NAME

---------- ---------- ----------

    1 dave    dave

    2 bl     bl

    1 bl     dave

    2 dave    bl

SQL> Select a.id,a.name,b.name from dave a,bl b where a.id=b.id; -- select 多表查询

   ID NAME    NAME

---------- ---------- ----------

    1 dave    dave

    2 bl     bl

    1 bl     dave

    2 dave    bl

 从这三个SQL 的结果我们也可以看出,他们的作用是一样的。

3、自然连接(Natural join)

自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。

先看一下自然连接的例子:

SQL> Select id,name from dave a natural join bl b;

   ID NAME

---------- ----------

    1 dave

    2 bl

这里我们并没有指定连接的条件,实际上oracle为我们自作主张的将,dave表中的id和name字段与bl表中的id和name字段进行了连接。也就是实际上相当于

SQL> Select dave.id,bl.name From dave join bl on dave.id = bl.id and dave.name=bl.name;

   ID NAME

---------- ----------

    1 dave

    2 bl

因此,我们也可以将自然连接理解为内连接的一种。

有关自然连接的一些注意事项:

(1)。如果做自然连接的两个表的有多个字段都满足有相同名称个类型,那么他们会被作为自然连接的条件。

(2)。如果自然连接的两个表仅是字段名称相同,但数据类型不同,那么将会返回一个错误。

二、外连接(Outer Join)

outer join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。外连接分为三种:

左外连接,右外连接,全外连接。 对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我们省略outer 这个关键字。 写成:LEFT/RIGHT/FULL JOIN。

在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记录。 那么在相关联的结果集行

中列显示为空值(NULL)。

对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:

1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。

2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符

3.(+)操作符只适用于列,而不能用在表达式上。

4.(+)操作符不能与or和in操作符一起使用。

5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

在做实验之前,我们先将dave表和bl里加一些不同的数据。 以方便测试。

SQL> select * from bl;

   ID NAME

---------- ----------

    1 dave

    2 bl

    3 big bird

    4 exc

    9 怀宁

SQL> select * from dave;

   ID NAME

---------- ----------

    8 安庆

    1 dave

    2 bl

    1 bl

    2 dave

    3 dba

    4 sf-express

    5 dmm

1、左外连接(Left outer join/ left join)

  left join是以左表的记录为基础的,示例中Dave可以看成左表,BL可以看成右表,它的结果集是Dave表中的数据,在加上Dave表和BL表匹配的数据。换句话说,左

表(Dave)的记录将会全部表示出来,而右表(BL)只会显示符合搜索条件的记录。BL表记录不足的地方均为NULL.

示例:

SQL> select * from dave a left join bl b on a.id = b.id;

   ID NAME        ID NAME

--------- ---------- ---------- ----------

   1 bl         1 dave

   1 dave        1 dave

   2 dave        2 bl

   2 bl         2 bl

   3 dba         3 big bird

   4 sf-express      4 exc

   5 dmm               -- 此处B表为null,因为没有匹配到

时间: 2024-10-01 01:30:08

Oracle表连接方式概述的相关文章

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

摘要: 针对在数据仓库环境下,由于超大数据量的处理而产生的效率问题,本文深入分析了ORACLE表的几种连接方式.特点.适用范围,以及对于如何使用和优化做了详细的探讨. 关键字: 数据仓库 ORACLE 表连接 一 引言 数据仓库技术是目前已知的比较成熟和被广泛采用的解决方案,用于整和电信运营企业内部所有分散的原始业务数据,并通过便捷有效的数据访问手段,可以支持企业内部不同部门,不同需求,不同层次的用户随时获得自己所需的信息.数据仓库系统需要能够及时地追踪和分析大量的历史数据,并能够及时做出分析和

Oracle之3种表连接方式(排序合并连接、嵌套循环、哈希连接)

Oracle之3种表连接方式(排序合并连接.嵌套循环.哈希连接) 排序合并连接 1.2.4.2.1  排序合并连接 排序合并连接(Sort Merge Join)是一种两个表在做表连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的表连接方法. 如果两个表(这里将它们分别命名为表T1和表T2)在做表连接时使用的是排序合并连接,则Oracle会依次顺序执行如下步骤. (1)首先以目标SQL中指定的谓词条件(如果有的话)去访问表T1,然后对访问结果按照表T1中的连接列来排序,排好序

Oracle表连接的奇怪问题

 今天在做计费报表的时候,由于粗心,拿数据的的脚本给写错了,却让我发现了一个很奇怪的问题,下面来让我介绍我发现的这个问题:数据库有表  CHARGE_REF , CLIENT_INVOICE ,CLIENT_INVHDR.其中CHARGE_REF表是保存的收费类型的数据:CLIENT_INVHDR表保存的是发票头部信息,CLIENT_INVOICE表保存的是发票的详细信息,大体如下图所示  我当时拿数据的时候的脚本大体是这样的(这里做了简化处理) SELECT C.CDESCPT, I.CNTR

Oracle数据库入门之多表连接与子查询

Oracle表连接 概述:SQL/Oracle使用表连接从多个表中查询数据 格式:select 字段列表 from table1,table2 where table1.column1=table2.column2; 说明:当被连接的多个表中存在同名字段时,必须在该字段前加上"table."作为前缀 如果没有限定where连接条件,否则就会出现笛卡尔集的不现实或没有实用意义的结果 举例:select empno, ename, sal, emp.deptno, dname, loc f

SQL为王:oracle标量子查询和表连接改写

小鱼(邓秋爽) 云和恩墨专家,有超过5年超大型数据库专业服务经验,擅长oracle 数据库优化.SQL优化和troubleshooting 编辑手记:如何提高数据的查询效率是每个人都关注的问题,今天让我们来学习如何合理使用标量子查询和表连接方式来提高查询速度吧~ 之前小鱼就听过了标量子查询,不过对于其中的细节理解还是远远不够,借助一部分资料和自己测试对标量子查询做一点简单的分析和介绍. Oracle允许在select子句中包含单行子查询,这个也就是oracle的标量子查询,标量子查询有点类似于外

Sql Server中的表访问方式Table Scan, Index Scan, Index Seek

  Sql Server中的表访问方式Table Scan, Index Scan, Index Seek 0.参考文献 oracle表访问方式 Index Seek和Index Scan的区别以及适用情况 1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找满足条件的数据 通过rowid扫描(table access by rowid),如果知道数据的rowid,那么直接通

Oracle的三种表连接技术

Oracle有三种表连接技术,分别是嵌套连接.合并连接和哈希连接. 1. 嵌套循环连接 (NESTED LOOP Join) 嵌套连接把要处理的数据集分为外循环(驱动数据源)和内循 环(被驱动数据源),外循环只执行一次(先执行),内循环执行的次数等于外循环执行的 数据集个数. 这种连接的好处是内存使用非常少. 如果驱动数据源有限,且 被驱动表在连接列上有相应的索引,则这种连接方式才是高效的. 在OLTP系统上常见 到这种连接方式. 2. 排序合并连接 (Sort Merge Join)顾名思义,

Oracle三种表连接技术

  Oracle有三种表连接技术,分别是嵌套连接.合并连接和哈希连接. 1. 嵌套循环连接 (NESTED LOOP Join) 嵌套连接把要处理的数据集分为外循环(驱动数据源)和内循环(被驱动数据源),外循环只执行一次(先执行),内循环执行的次数等于外循环执行的数据集个数. 这种连接的好处是内存使用非常少. 如果驱动数据源有限,且被驱动表在连接列上有相应的索引,则这种连接方式才是高效的. 在OLTP系统上常见到这种连接方式. 2. 排序合并连接 (Sort Merge Join)顾名思义,排序

Oracle中三种表连接算法的总结

Oracle有三种表连接技术,分别是嵌套连接.合并连接和哈希连接.以下就是对这三种表连接算法进行了详细的分析介绍,需要的朋友可以参考下   1. 嵌套循环连接 (NESTED LOOP Join)嵌套连接把要处理的数据集分为外循环(驱动数据源)和内循环(被驱动数据源),外循环只执行一次(先执行),内循环执行的次数等于外循环执行的数据集个数. 这种连接的好处是内存使用非常少. 如果驱动数据源有限,且被驱动表在连接列上有相应的索引,则这种连接方式才是高效的. 在OLTP系统上常见到这种连接方式. 2