广告
返回顶部
首页 > 资讯 > 数据库 >表连接之连接的类型
  • 238
分享到

表连接之连接的类型

2024-04-02 19:04:59 238人浏览 薄情痞子
摘要

    顾明思义,表连接就是指多个表之间用连接条件连接在一起,使用连接的目标sql的目的就是从多个表获取存储在这些表中的不同维度的数据。体现在sql语句上,含表连接的

    顾明思义,表连接就是指多个表之间用连接条件连接在一起,使用连接的目标sql的目的就是从多个表获取存储在这些表中的不同维度的数据。体现在sql语句上,含表连接的目标sql的from部分会出现多个表,而这些sql的where条件部分则会定义具体的表连接条件。

    当优化器解析含表连接的目标sql时,它除了会根据目标sql的sql文本的写法来决定表连接的类型之外,还必须决定如下三件事情才能得到最终的执行计划。

    (1)表连接顺序

    不管目标sql中有多少个表做连接,oracle在实际执行该sql时都是只能先两两表连接,再依次执行这样的两两表连接过程,直到目标sql中所有表都已连接完毕。所以从严格意义上来说,这里的表连接顺序包含两层含义:一层含义当两个表做表连接时,优化器需要决定两个表中谁是驱动表,谁是被驱动表;另外一层含义是当多表(超过两个以上的表)做表连接时,优化器需要决定这些中谁和谁先做表连接,然后决定这个表连接结果所在的结果集合剩余的表的哪一个再做表连接,这个两两做表连接的过程会一直持续下去去,直到目标sql中所有的表都已经连接完为止。

    (2)表连接的方法

    在oracle数据库中,两表之间的表连接方法有合并联结,嵌套循环联结,哈希连接和笛卡儿联结这四种,所以优化器在解析含表连接的目标sql时,都需要从上述四种方法中选择一种,作为每一对表两两做表连接时所以需要采用的方法。

    (3)访问单表的方法

    对于优化器而言,仅决定表连接顺序和连接方法是不够的,这还不足以得到目标sql的最终执行计划,因为优化器对目标sql中个各个表两两做表连接时,还必须决定如何去获取存储在这些表里的不同维度的数据,即优化器还要决定访问单表的方法。比如访问某个单表时,是采用全表扫描还是走索引,如果是索引,应该采用什么样的索引访问方法等。

    表连接的类型

    通常情况下,我们可以认为oralce数据库中的表连接分为内连接和外连接两种类型,表连接的类型会直接决定表连接的结果,而目标sql的sql文本的写法又直接决定了表连接的类型。

    (1)内连接

    内连接是指表连接的连接结果只包含那些完全满足条件的记录吗。对于包含表连接的目标sql而言,只要其where条件中没有写那些标准sql中定义或oracle中自定义的表示外连接的关键字(比如标准sql中的left outer join,right outer join,full outer join,或者oracle中自定义用来表示外连接的关键(+),则该sql的连接类型就是内连接

    

SQL> create table t1(col1 number,col2 varchar2(1));

Table created.

SQL> SQL> create table t2(col2 varchar2(1),col3 varchar2(2));

Table created.

SQL> insert into t1 values(1,'A');

1 row created.

SQL> insert into t1 values(2,'B');

1 row created.

SQL> insert into t1 values(3,'C');

1 row created.

SQL> insert into t2 values('A','A2');

1 row created.

SQL> insert into t2 values('B','B2');

1 row created.

SQL> insert into t2 values('D','D2');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t1;


      COL1 C

---------- -

1 A

2 B

3 C


SQL> select * from t2;


C CO

- --

A A2

B B2

D D2

SQL> select t1.col1,t1.col2,t2.col3 from t1,t2 where t1.col2=t2.col2;

      COL1 C CO

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

1 A A2

2 B B2

    从以上执行结果中我们可以看出,内连接的连接结果只包含了那些玩去满足条件的记录。

    标准sql的写法如下:   

SQL> select t1.col1,t1.col2,t2.col3 from t1 join t2 on(t1.col2=t2.col2);

      COL1 C CO

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

1 A A2

2 B B2

SQL> select t1.col1,t1.col2,t2.col3 from t1 join t2 using(col2);

select t1.col1,t1.col2,t2.col3 from t1 join t2 using(col2)

               *

ERROR at line 1:

ORA-25154: column part of USING clause cannot have qualifier

    这里需要注意的是,对于使用join using的标准sql而言,如果连接连接列同时又出现在查询列中,则该连接列前不能带上表名或表名的别名,否则oralce会抛出ORA-25154,以下是正确写法:

SQL> select t1.col1,col2,t2.col3 from t1 join t2 using(col2);

      COL1 C CO

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

1 A A2

2 B B2

    使用标准sql来表示表连接,那么有一种特殊的jion using,我们称之为NATURAL JOIN,NATURAL JOIN是一种特殊的JOIN USING,其含义是使用NATURAL JOIN的表连接的连接列是表连接的两个表所有的同名列。

SQL> select t1.col1,col2,t2.col3 from t1 natural join t2;


      COL1 C CO

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

1 A A2

2 B B2

    使用NATURAL JOIN的好处是无须在JOIN USING中写连接集合,但其坏处是增加了表连接的执行结果出错的风险,因为两个表之间的同名列不一定在含义上完全相同(也许它们只是恰好同名而已,其含义是完全不同的,所以不应该将它们作为连接列)而且即使含义相同,也不一定就需要他们做连接

    (2)外连接

    外连接是对内连接的一种扩展,它是指表连接的连接结果除了包含那些完全满足连接条件的记录之外还会包含驱动表中所有不满足该条件的连接的记录。

    标准sql的外连接分为左连接,右连接和全连接这三种,它们在标准sql中所对应的关键字分别是left outer join,right outer join和full outer join,都可以和join on或者join using连用。

    左连接语法:

    目标表1 left outer join 目标表2 on(连接条件)或

    目标表1 left outer join 目标表2 using(连接集合)

    “目标表1 left outer join 目标表2 on(连接条件)”的含义为目标表1和目标表2按括号中连接条件来做表连接,位于关键left outer join左边的目标表1会作为该表连接的驱动表(关键字“left outer”即表明位置处于left就是outer table,outer table指驱动表)。此时的连接除了包含目标表1和目标表2中所有满足该条件的记录外,还会包含驱动表(目标表1)中索引不满足该连接条件的记录,同时,驱动表中所有不满足该连接条件的记录所对应的被驱动表(即目标表2)中查询列均以NULL值来填充。

    右连接语法:

    目标表1 right outer join 目标表2 on(连接条件)或

    目标表1 right outer join 目标表2 using(连接集合)

    全连接语法:

    目标表1 full outer join 目标表2 on(连接条件)或

    目标表1 full outer join 目标表2 using(连接集合)

    可以把全连接理解成先做左连接,再右连接,最后对左右连接的连接结果做一个uNIOn操作。

    左连接实例:

SQL> select t1.col1,t1.col2,t2.col3 from t1 left outer join t2 on(t1.col2=t2.col2);

      COL1 C CO

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

1 A A2

2 B B2

3 C

    oracle自定义写法:

SQL> select t1.col1,t1.col2,t2.col3 from t1,t2 where t1.col2=t2.col2(+);

      COL1 C CO

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

1 A A2

2 B B2

3 C

关键字(+)出现在表T2的连接列col2后面,这就表示T2会以NULL值来填充那些不满足连接条件的t1.col2=t2.col2 并位于T2中的查询列(col3)。

    右连接实例:

SQL> select t1.col1,t1.col2,t2.col3 from t1 right outer join t2 on(t1.col2=t2.col2);

      COL1 C CO

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

1 A A2

2 B B2

    D2

    oracle自定义写法:

    

SQL> select t1.col1,t1.col2,t2.col3 from t1,t2 where t1.col2(+)=t2.col2;


      COL1 C CO

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

1 A A2

2 B B2

    D2

    全连接实例:  

SQL> select t1.col1,t1.col2,t2.col3 from t1 full outer join t2 on(t1.col2=t2.col2);

      COL1 C CO

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

1 A A2

2 B B2

    D2

3 C

    上述实例sql中除了带了连接条件外,并没有带其他的额外连接条件,如果目标sql中除了表连接条件之外还带了其他额外的限制条件,则目标sql中表连接的类型和该额外条件在目标sql的sql文本中出现位置都可能会对最终执行计划产生影响。    

SQL> select t1.col1,t1.col2,t2.col3 from t1 join t2 on(t1.col2=t2.col2 and t1.col1=1);

      COL1 C CO

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

1 A A2

SQL> select t1.col1,t1.col2,t2.col3 from t1 join t2 on(t1.col2=t2.col2) where t1.col1=1;


      COL1 C CO

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

1 A A2

    上述结果说明对于内连接而言,除了表连接条件之外的额外限制条件在目标sql的sql文本中所处的位置并不会影响该sql的实际执行结果。

SQL> select t1.col1,t1.col2,t2.col3 from t1 right outer join t2 on(t1.col2=t2.col2 and t1.col1=1);


      COL1 C CO

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

1 A A2

    D2

    B2

SQL> select t1.col1,t1.col2,t2.col3 from t1 right outer join t2 on(t1.col2=t2.col2) where t1.col1=1;


      COL1 C CO

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

1 A A2

    对于例1,它的限制条件在sql文本中位于right outer join所对应的括号内,这表示该限制条件会在表T1和T2做右连接之前就被应用在表T1上,参与右连接的T1的数据是那些满足条件t1.col1=1的记录, 而例2的限制条件位于right outer join括号外,这表示该限制条件在T1和T2做完右连接之后,才会被应用在表T1和T2的连接结果集上,参与右连接的是表T1中所有数据。

    

您可能感兴趣的文档:

--结束END--

本文标题: 表连接之连接的类型

本文链接: https://www.lsjlt.com/news/44020.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 表连接之连接的类型
        顾明思义,表连接就是指多个表之间用连接条件连接在一起,使用连接的目标sql的目的就是从多个表获取存储在这些表中的不同维度的数据。体现在sql语句上,含表连接的...
    99+
    2022-10-18
  • SQL连接表(内连接、左连接、右连接、交叉连接、全外连接)
    分享一些自己的连表总结 什么是连接表? 多表查询原理:将多个表通过笛卡尔积形成一个虚表,再根据查询条件筛选符合条件的数据。 在关系数据库中,数据分布在多个逻辑表中。 要获得完整有意义的数据集,需要使...
    99+
    2023-09-21
    数据库 sql mysql sqlserver
  • SQL Server中有哪些表连接类型
    这篇文章将为大家详细讲解有关SQL Server中有哪些表连接类型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、内联接(典型的联接运算,使用像 = &n...
    99+
    2022-10-18
  • oracle表连接的方法和类型有哪些
    这篇文章主要讲解了“oracle表连接的方法和类型有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“oracle表连接的方法和类型有哪些”吧!一、表连接就...
    99+
    2022-10-18
  • 数据库中常见的连接和连接类型有哪些
    这期内容当中小编将会给大家带来有关数据库中常见的连接和连接类型有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。数据库中常见的连接和连接类型有哪些根据连接中使用的操作符...
    99+
    2022-10-19
  • mysql 连接查询(俗称连表查询)内连接、外连接、自然连接
    连接查询的分类 本文讨论中用到的测试数据``create table student(id int primary key auto_increment,name varchar(10));ins...
    99+
    2022-10-18
  • mysql表与表之间如何连接
    在MySQL中,表与表之间可以通过JOIN操作进行连接。JOIN操作是通过列值之间的匹配将两个或多个表中的数据关联起来。在JOIN操...
    99+
    2023-08-11
    mysql
  • mysql外连接类型有哪些
    本篇内容主要讲解“mysql外连接类型有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql外连接类型有哪些”吧!1、左外连接将左表中要丢弃的记录保留在结果集中,右表中对应的部分用nul...
    99+
    2023-06-20
  • sql语句之内连接与外连接
    内连接: 查询效率:速度较快 内存占用:先笛卡尔积,再进行where晒减,内存占用在初期笛卡尔积的时候会很大。 内连接占用内存空间大 显示内连接和隐式内连接除了写法不一样,其他没有什么不同 外连接: 查询效率:一般...
    99+
    2021-08-12
    sql语句之内连接与外连接
  • SQL连接的理解和使用(内连接:自然连接&等值连接,外连接:左连接&右连接&全外连接)
    目录 一、连接的介绍连接是什么?连接分几种?条件连接等值连接自然连接 二、连接的使用内连接 INNER JOIN内连接与等值连接区别内连接与自然连接区别 外连接 OUTE...
    99+
    2023-09-17
    sql 数据库 mysql
  • sql的四种连接——左外连接、右外连接、内连接、全连接
    一、内连接   满足条件的记录才会出现在结果集中。 二、 左外连接(left outer join,outer可省略) 左表全部出现在结果集中,若右表无对应记录,则相应字段为NULL   举例说明: 客户表: 订单表: 左外连接(...
    99+
    2023-09-10
    sql mysql 数据库
  • MySQL的左连接、右连接、内连接
    一. 写法: 1.左连接:   SELECT student.Sno,Sname,Ssex,Sbirth,Sclass,Cno,Grade FROM student LEFT OUTER JOIN sc ON student.Sno...
    99+
    2023-10-18
    mysql sql
  • python之ssh连接
    paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。跟常用软件xshell 、xftp功能一样,但是可以连接多台服务器,进行复杂的操作。paramiko是一个第三方模块,使用之...
    99+
    2023-01-31
    python ssh
  • Python 之 连接VCENTER
    代码 #Author Kang import ssl import pysphere from pysphere import VIServer ssl._create_default_https_context = ssl._crea...
    99+
    2023-01-31
    Python VCENTER
  • mysql连接查询左连接,右连接,内连接的示例
    小编给大家分享一下mysql连接查询左连接,右连接,内连接的示例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、mysql常用连接INNER JOIN(内连接,或等值连接):获取两个表中...
    99+
    2022-10-18
  • sql server 表连接
    数据库操作中,我们需要的结果可能在两张表甚至多张表中,这时候就需要表连接操作,多表查询中的各个表之间的字段会存在连接,比如主外键关联,可以使用主外键来关联每张表。表连接方式有以下几种: JOIN: 如果表中有至少一个匹配,则返回行 LEF...
    99+
    2022-03-03
    sql server 表连接
  • 【MySQL系列】表的内连接和外连接学习
    「前言」文章内容大致是对MySQL表的内连接和外连接。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、内连接二、外连接2.1 左外连接2.2 右外连接 一、内连接 内连接实际...
    99+
    2023-08-30
    mysql android 数据库
  • mysql内连接查询的类型有哪些
    这篇文章主要讲解了“mysql内连接查询的类型有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql内连接查询的类型有哪些”吧!1、显式内连接,使用inner join ... .....
    99+
    2023-06-20
  • mysql外连接与内连接查询的不同之处
    外连接的语法如下: SELECT 字段名称 FROM 表名1 LEFT|RIGHT|FULL| [OUTER] JOIN 表名2   ON 表名1.字段名1=表面...
    99+
    2022-11-12
  • 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
    内联接(典型的联接运算,使用像 =  或 之类的比较运算符)。包括相等联接和自然联接。      内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。    ...
    99+
    2019-01-06
    深入理解SQL的四种连接-左外连接 右外连接 内连接 全连接
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作