• Oracle SQL外连接


    SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。
    连接类型        定义
    内连接           只连接匹配的行
    左外连接        包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
    右外连接        包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
    全外连接        包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。

    表TESTA,TESTB,TESTC,各有A, B两列

    A

    B

    001

    10A

    002

    20A

    A

    B

    001

    10B

    003

    30B

    A

    B

    001

    10C

    004

    40C

    连接分为两种:内连接与外连接。

    A.内连接

    内连接,即最常见的等值连接,例:

    SELECT * 
    FROM TESTA,TESTB
    WHERE TESTA.A=TESTB.A


    结果

    A

    B

    A

    B

    001

    10A

    001

    10B

    B.外连接

    外连接分为左外连接,右外连接和全外连接。

    1.  左外连接 left outer join 或者 left join

    左外连接就是在等值连接的基础上加上主表中的未匹配数据,例:

    SELECT *
    FROM TESTA 
    LEFT OUTER JOIN TESTB 
    ON TESTA.A=TESTB.A

    Oracle 支持另一种写法

    SELECT * 
    FROM TESTA,TESTB
    WHERE TESTA.A=TESTB.A(+)

    结果:

    A

    B

    A

    B

    001

    10A

    001

    10B

    002

    20A

       

    三个表做左外连接

    SELECT *
    FROM TESTA 
    LEFT OUTER JOIN TESTB 
    ON TESTA.A=TESTB.A
    LEFT OUTER JOIN TESTC
    ON TESTA.A=TESTC.A

    Oracle 支持的另外一种写法

    SELECT *
    FROM TESTA,TESTB,TESTC
    WHERE TESTA.A=TESTB.A(+)
    AND TESTA.A=TESTC.A(+)

    结果:

    A

    B

    A

    B

    A

    B

    001

    10A

    001

    10B

    001

    10C

    002

    20A

           

    2. 右外连接 right outer join 或者 right join

    右外连接是在等值连接的基础上加上被连接表的不匹配数据

    SELECT *
    FROM TESTA 
    RIGHT OUTER JOIN TESTB 
    ON TESTA.A=TESTB.A

    Oracle支持的另一种写法

    SELECT *
    FROM TESTA,TESTB
    WHERE TESTA.A(+)=TESTB.A

    结果:

    A

    B

    A

    B

    001

    10A

    001

    10B

       

    003

    30B

    3.全外连接 full outer join 或者 full join

    全外连接是在等值连接的基础上将左表和右表的未匹配数据都加上

    SELECT * 
    FROM TESTA 
    FULL OUTER JOIN TESTB
    ON TESTA.A=TESTB.A

    全外连接的等价写法,对同一表先做左连接,然后右连接

    SELECT  TESTA.*,TESTB.*
    FROM TESTA
    LEFT OUTER JOIN TESTB
    ON TESTA.A=TESTB.A
    UNION
    SELECT TESTA.*,TESTB.*
    FROM TESTB
    LEFT OUTER JOIN TESTA
    ON TESTA.A=TESTB.A

    结果:

    A

    B

    A

    B

    001

    10A

    001

    10B

    002

    20A

       
       

    003

    30B

    觉得这篇文章写的真好,简洁、明了、清晰:

    https://www.cnblogs.com/steel-chen/p/6781347.html

    含义理解:

    Oracle中可以使用“(+) ”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN 
    
    LEFT OUTER JOIN:左外关联 
    SELECT e.last_name, e.department_id, d.department_name 
    FROM employees e 
    LEFT OUTER JOIN departments d 
    ON (e.department_id = d.department_id); 
    等价于 
    SELECT e.last_name, e.department_id, d.department_name 
    FROM employees e, departments d 
    WHERE e.department_id=d.department_id(+) 
    结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录RIGHT OUTER JOIN:右外关联 
    SELECT e.last_name, e.department_id, d.department_name 
    FROM employees e 
    RIGHT OUTER JOIN departments d 
    ON (e.department_id = d.department_id); 
    等价于 
    SELECT e.last_name, e.department_id, d.department_name 
    FROM employees e, departments d 
    WHERE e.department_id(+)=d.department_id 
    结果为:所有员工及对应部门的记录,包括没有任何员工的部门记录FULL OUTER JOIN:全外关联 
    SELECT e.last_name, e.department_id, d.department_name 
    FROM employees e 
    FULL OUTER JOIN departments d 
    ON (e.department_id = d.department_id); 
    结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录和没有任何员工的部门记录。 

    参考:https://www.cnblogs.com/likeju/p/4951974.html

     

    扫个红包吧!

    Donate捐赠

    如果我的文章帮助了你,可以赞赏我 1 元,让我继续写出更好的内容)

       

      (微信)                                        (支付宝)

    微信/支付宝 扫一扫

  • 相关阅读:
    tasker支持的shell 命令大全
    crx 文件安装 如何安装 Chrome插件
    python mac地址计算
    Java线程池
    springMVC请求过程
    java中特殊的String类型
    单例模式和多例模式
    hash算法学习
    arraylist和linkedlist的简单比较
    乐观锁和悲观锁
  • 原文地址:https://www.cnblogs.com/moonsoft/p/11712091.html
Copyright © 2020-2023  润新知