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