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

mysql对于两个主键的表 sql 两个主键怎么两表连接_SQL

  • 针对上述两张表,执行以下 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

mysql对于两个主键的表 sql 两个主键怎么两表连接_mysql对于两个主键的表_02

  • 针对上述两张表,执行以下 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

mysql对于两个主键的表 sql 两个主键怎么两表连接_Google_03

  • 针对上述两张表,执行以下 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

mysql对于两个主键的表 sql 两个主键怎么两表连接_mysql对于两个主键的表_04

  • 针对上述两张表,执行以下 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

美国