zoukankan      html  css  js  c++  java
  • 深入理解SQL的四种连接

    SQL标准

     1 select table1.column,table2.column
     2 from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2;
     3 
     4         inner join 表示内连接;
     5 
     6         left join表示左外连接;
     7 
     8         right join表示右外连接;
     9 
    10         full join表示完全外连接;
    11 on子句 用于指定连接条件。

    注意:

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

    一、内连接

    (典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括相等联接和自然联接

    eg:

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

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

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

    二、外连接

    原理:在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记

    录。 那么在相关联的结果集行中列显示为空值(NULL)。

    对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:
    1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
    2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符
    3.(+)操作符只适用于列,而不能用在表达式上。
    4.(+)操作符不能与or和in操作符一起使用。
    5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

    左外连接:联接的结果集包括  LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。   

    LEFT  JOIN或LEFT OUTER JOIN   

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

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

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

    Select * from dave a,bl b where a.id=b.id(+);   -- 注意: 用(+) 就要用关键字where

        

    右外连接:右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

    RIGHT  JOIN 或 RIGHT  OUTER  JOIN    

    select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id 

    完整外部连接(全外连接):联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有

    匹配行,则整个结果集行包含基表的数据值。 全外连接不支持(+)这种写法

    FULL  JOIN 或 FULL OUTER JOIN

    select   a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id   

    三、交叉连接(笛卡尔积,几乎不用)

    联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

    四、联合连接(很少见

    Oracle、MySQL均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。

    五、应用

    1、 查两表关联列相等的数据用内连接。
    2、 Col_L是Col_R的子集时用右外连接。
    3、 Col_R是Col_L的子集时用左外连接。
    4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
    5、 求差操作的时候用联合查询。
    多个表查询的时候,这些不同的连接类型可以写到一块。例如:
    SELECT T1.C1,T2.CX,T3.CY
    FROM TAB1 T1
           INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)
           INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)
           LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);
    WHERE T1.X >T3.Y;

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

    1. 内连接(自然连接)

    2. 外连接

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

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

  • 相关阅读:
    FPGA-中值滤波
    FPGA-中值滤波
    FPGA-shift_ram代码
    FPGA实现-shift_ram_3x3矩阵实现
    图像处理-中值滤波
    python-str
    ignore-certificate-errors(chrome)
    selenium-python-Cookie跳过登录验证码
    Angular2
    Angular2
  • 原文地址:https://www.cnblogs.com/wangwanchao/p/5314964.html
Copyright © 2011-2022 走看看