zoukankan      html  css  js  c++  java
  • Oracle左连接、右连接、全外连接以及(+)号用法(转)

    +:与附带的字段相连,和“+”相连的字段值,不管是否存在,都会展示

    也就是带上相连接的字段

    有数据了就显示,没数据就显示为null

    Oracle  外连接(OUTER JOIN)

    • 左外连接(左边的表不加限制)
    • 右外连接(右边的表不加限制)
    • 全外连接(左右两表都不加限制)

    对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常省略OUTER关键字, 写成:LEFT/RIGHT/FULL JOIN。

    在左连接和右连接时都会以一张A表为基础表,该表的内容会全部显示,然后加上A表和B表匹配的内容。 如果A表的数据在B表中没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。

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

    1. (+)操作符只能出现在WHERE子句中,并且不能与OUTER JOIN语法同时使用。
    2. 当使用(+)操作符执行外连接时,如果在WHERE子句中包含有多个条件,则必须在所有条件中都包含(+)操作符。
    3. (+)操作符只适用于列,而不能用在表达式上。
    4. (+)操作符不能与OR和IN操作符一起使用。
    5. (+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

    创建两张表,插入数据用于学习测试:

    复制代码
    CREATE TABLE t_A (
    id   number,
    name  VARCHAR2(10)
    );
    
    CREATE TABLE t_B (
    id   number,
    name  VARCHAR2(10)
    );
    
    INSERT INTO t_A VALUES(1,'A');
    INSERT INTO t_A VALUES(2,'B');
    INSERT INTO t_A VALUES(3,'C');
    INSERT INTO t_A VALUES(4,'D');
    INSERT INTO t_A VALUES(5,'E');
    
    INSERT INTO t_B VALUES(1,'AA');
    INSERT INTO t_B VALUES(1,'BB');
    INSERT INTO t_B VALUES(2,'CC');
    INSERT INTO t_B VALUES(1,'DD');
    复制代码

      

    左外连接(LEFT OUTER JOIN/ LEFT JOIN)

      LEFT JOIN是以左表的记录为基础的,示例中t_A可以看成左表,t_B可以看成右表,它的结果集是t_A表中的全部数据,再加上t_A表和t_B表匹配后的数据。换句话说,左表(t_A)的记录将会全部表示出来,而右表(t_B)只会显示符合搜索条件的记录。t_B表记录不足的地方均为NULL。

    select * from t_A a left join t_B b on a.id = b.id;
    或
    select * from t_A a left outer join t_B b on a.id = b.id;

      

      用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在右表,左表就是全部显示,所以是左连接。

    Select * from t_A a,t_B b where a.id=b.id(+);

      

    右外连接(RIGHT OUTER JOIN/RIGHT JOIN)

      和LEFT JOIN的结果刚好相反,是以右表(t_B)为基础的。它的结果集是t_B表所有记录,再加上t_A和t_B匹配后的数据。 t_A表记录不足的地方均为NULL。

    select * from t_A a right join t_B b on a.id = b.id;
    或
    select * from t_A a right outer join t_B b on a.id = b.id;

      

      用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在左表,右表就是全部显示,所以是右连接。

    Select * from t_A a,t_B b where a.id(+)=b.id;

      

    全外连接(FULL OUTER JOIN/FULL JOIN)

         左表和右表都不做限制,所有的记录都显示,两表不足的地方均为NULL。 全外连接不支持(+)写法。

    select * from t_A a full join t_B b on a.id = b.id;
    或
    select * from t_A a full outer join t_B b on a.id = b.id;    

      

    补充

    select * from t_A a,t_B b where a.id = b.id;
    select * from t_A a join t_B b on a.id = b.id;

      

    select * from t_A a where a.id in (select b.id from t_B b);
    select * from t_A a where exists (select 1 from t_B b where a.id = b.id);

      

    http://www.cnblogs.com/hehaiyang/p/4745897.html
     
  • 相关阅读:
    CQUOJ 10819 MUH and House of Cards
    CQUOJ 9920 Ladder
    CQUOJ 9906 Little Girl and Maximum XOR
    CQUOJ 10672 Kolya and Tandem Repeat
    CQUOJ 9711 Primes on Interval
    指针试水
    Another test
    Test
    二分图匹配的重要概念以及匈牙利算法
    二分图最大匹配
  • 原文地址:https://www.cnblogs.com/softidea/p/4746479.html
Copyright © 2011-2022 走看看