详解SQL中的各种连接(JOIN)方法

版权声明:个人水平有限,表述不当或疏漏之处欢迎读者提问交流,共同进步! 作者:J__Max 非商业转载请注明出处,商业转载请联系作者获得授权。 https://blog.csdn.net/J__Max/article/details/87453024

详解SQL中的各种连接(JOIN)方法

简介

  • 有时候为了得到完整的结果,我们需要从两个或更多的表中获取结果,而 SQL 就提供了 JOIN 子句,用来把来自两个或者多个表的行结合起来(基于这些表之间的共同字段)

  • 数据库中的表可以通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。下面就通过一个应用 JOIN 的简单场景来初步了解 JOIN:

    • 如下为 “Persons” 表
    Id_P LastName FirstName Address City
    1 Adams John Oxford Street London
    2 Bush George Fifth Avenue New York
    3 Carter Thomas Changan Street Beijing
    • 如下为 “Orders” 表
    Id_O OrderNo Id_P
    1 77895 3
    2 44678 3
    3 22456 1
    4 24562 1
    5 34764 65
    • 其中的 “Id_P” 是 Persons 表的主键, “Id_O” 是 Orders 表的主键。同时,Orders 表中的 “Id_P” 引用于 Persons 表中的 “Id_P” ,也就是说,”Id_P” 列将上面的表联系了起来

    • 现在我们要知道谁订购了产品,并且他们订购了什么产品。这时候 JOIN 就能很好地完成这个任务,SQL 语句如下:

      SELECT Persons.LastName, Persons.FirsName, Orders.OrderNo
      FROM Persons
      INNER JOIN Orders
      ON Persons.Id_P = Orders.Id_P
      ORDER BY Persons.LastName
      
    • 执行上述 SQL 语句得到的的结果集如下:

    Id_O OrderNo Id_P
    Adams Jhon 22456
    Adams Jhon 24562
    Carter Thomas 77895
    Carter Thomas 44678

详解不同的 SQL JOIN

  • 通过上面的例子可以看到,SQL JOIN 子句用于把来自两个或者多个表的行结合起来,它所基于的是这些表之间的共同字段。除了在上面的例子中使用的 INNER JOIN (内连接),我们还可以使用其他几种连接方法。下面先简要列出这些 JOIN 类型以及它们之间的差异:

    • JOIN:如果表中有至少一个匹配,则返回行

    • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行

    • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行

    • FULL OUTER JOIN:即 LEFT JOIN 和 RIGHT JOIN 的结合

  • 下面通过实例操作的方式来详细介绍这几种 JOIN 方法,假设有两张表:

    • Table A
    id name
    1 Google
    2 淘宝
    3 微博
    4 Facebook
    • Table B
    id address
    1 美国
    5 中国
    3 中国
    6 美国
INNER JONIN(JOIN)
  • 内连接是最常使用的连接方法,它的语法以及效果图如下:

    SELECT column_name
    FROM A
    INNER JOIN B
    ON A.column_name = B.column_name
    

    在这里插入图片描述

  • 针对上述两张表,执行以下 SQL 语句:

    SELECT *
    FROM A
    INNER JOIN B
    ON A.id = B.id
    
  • 执行后的输出结果如下:

    id name address
    1 Google 美国
    3 微博 中国
LEFT JOIN
  • LEFT JOIN 返回左表的全部行以及右表中满足 ON 条件的行,如果左表的行在右表中没有匹配,那么这一行在右表中的对应数据用 null 代替。其语法以及效果图如下:

    SELECT column_name
    FROM A
    LEFT JOIN B
    ON A.column_name = B.column_name
    

    在这里插入图片描述

  • 针对上述两张表,执行以下 SQL 语句:

    SELECT *
    FROM A
    LEFT JOIN B
    ON A.id = B.id
    
  • 执行后的输出结果如下:

    id name address
    1 Google 美国
    2 淘宝 null
    3 微博 中国
    4 Facebook null
RIGHT JOIN
  • RIGHT JOIN 则和 LEFT JOIN 的效果相反,它返回右表的全部行以及左表中满足 ON 条件的行,如果右表的行在左表中没有匹配,那么这一行在左表中的对应数据用 null 代替。其语法以及效果图如下:

    SELECT column_name
    FROM A
    RIGHT JOIN B
    ON A.column_name = B.column_name
    

    在这里插入图片描述

  • 针对上述两张表,执行以下 SQL 语句:

    SELECT *
    FROM A
    RIGHT JOIN B
    ON A.id = B.id
    
  • 执行后的输出结果如下:

    id name address
    1 Google 美国
    5 null 中国
    3 微博 中国
    6 null 美国
FULL OUTER JOIN
  • FULL JOIN 会从左表和右表那里返回所有的行,如果其中一个表的数据行在另一个表中没有匹配的行,那么对应的数据用 null 代替。其语法以及效果图如下:

    SELECT column_name
    FROM A
    FULL OUTER JOIN B
    ON A.column_name = B.column_name
    

  • 针对上述两张表,执行以下 SQL 语句:

    SELECT *
    FROM A
    FULL OUTER JOIN B
    ON A.id = B.id
    
  • 执行后的输出结果如下:

    id name address
    1 Google 美国
    2 淘宝 null
    3 微博 中国
    4 Facebook null
    5 null 中国
    6 null 美国

猜你喜欢

转载自blog.csdn.net/J__Max/article/details/87453024