详解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 美国