MySQL Join 联接

时间:2019-02-04 12:52:25  来源:igfitidea点击:

MySQL JOIN 联接用于从多个表中检索数据。只要在SQL语句中将两个或多个表联接在一起,就会执行MySQL JOIN。

MySQL连接有几种类型:

  • MySQL INNER JOIN 内联接(有时称为简单联接)
  • MySQL LEFT OUTER JOIN 左外联接(有时称为LEFT JOIN 左联接)
  • MySQL RIGHT OUTER JOIN 右外联接(有时称为RIGHT JOIN 右联接)

Mysql Inner Join 内部联接(简单联接)

Inner Join 是最常见的联接类型。其从满足联接条件的多个表中返回所有行。

语法

MySQL中INNER JOIN的语法为:

SELECT columns
FROM table1 
INNER JOIN table2
ON table1.column = table2.column;

图形表示

在这个可视化的图表中,MySQL INNER JOIN将返回阴影部分:

mysql内联接

MySQL INNER JOIN将返回table1和table2相交的记录。

示例

这是一个MySQL INNER JOIN的示例:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers 
INNER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;

这个示例将返回供应商和订单表中的所有行,两个表通过Supplier_id值进行联接。


让我们看一些数据来解释INNER JOINS的工作原理:

假设我们有一个suppliers表,其中有两个字段(supplier_id和Supplier_name)。它包含以下数据:

Supplier_idsupplier_name
10000IBM
10001Hewlett Packard
10002Microsoft
10003NVIDIA

我们还有另一个orders表,其中包含三个字段(order_id,supplier_id和order_date)。它包含以下数据:

order_idsupplier_idorder_date
500125100002013/05/12
500126100012013/05/13
500127100042013/05/14

运行下面的MySQL INNER JOIN语句:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
INNER JOIN orders
ON suppliers.supplier_id = orders.supplier_id;

得到的结果集如下所示:

supplier_id nameorder_date
10000IBM 2013/05/12
10001Hewlett Packard 2013/05/13

供应商表suppliers中 的Microsoft 和 NVIDIA行将被省略,因为10002和10003在orders表中不存在。
订单表orders 中的的500127行将被省略,因为10004在suppliers 表中不存在。

旧语法

上面的INNER JOIN示例可以使用下面的旧语法进行重写:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers, orders
WHERE suppliers.supplier_id = orders.supplier_id;

直接在FROM后面列出所有的联接表,在WHERE指明他们之间的关系。

左外连接

另一种联接称为MySQL LEFT OUTER JOIN。
这种类型的联接返回在ON条件中指定的LEFT手表中的所有行,并且仅返回来自另一个表中与联接字段相等(满足联接条件)的那些行。

语法

MySQL中LEFT OUTER JOIN的语法为:

SELECT columns
FROM table1
LEFT [OUTER] JOIN table2
ON table1.column = table2.column;

在某些数据库中,将LEFT OUTER JOIN关键字替换为LEFT JOIN

图形表示

在图中,MySQL LEFT OUTER JOIN将返回阴影部分:

mysql 左外联接

MySQL LEFT OUTER JOIN将返回table1中的所有记录,并且仅返回table2中与table1相交的那些记录。

示例

这是一个MySQL LEFT OUTER JOIN的示例:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
LEFT JOIN orders
ON suppliers.supplier_id = orders.supplier_id;

此LEFT OUTER JOIN示例将返回供应商表中的所有行,并且仅返回订单表中联接字段相等的所有行。

如果订单表中不存在供应商表中的vendor_id值,则订单表中的所有字段在结果集中将显示为null


假设我们有一个供应商表suppliers ,其中有两个字段(supplier_id和Supplier_name)。它包含以下数据:

supplier_idsupplier_name
10000IBM
10001Hewlett Packard
10002Microsoft
10003NVIDIA

另外一个订单表orders ,具有三个字段(order_id,supplier_id和order_date)。它包含以下数据:

order_idsupplier_idorder_date
500125100002013/05/12
500126100012013/05/13

运行下面的SELECT语句:

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date
FROM suppliers
LEFT JOIN orders
ON suppliers.supplier_id = orders.supplier_id;

得到的结果集如下所示:

supplier_idsupplier_nameorder_date
10000IBM2013/05/12
10001Hewlett Packard2013/05/13
10002Microsoftnull
10003NVIDIAnull

先返回suppliers中的所有数据,然后根据supplier_id从orders表中获取相应的order_date, 如果没有对应的supplier_id ,则返回null。

右外连接

另一种联接称为MySQL RIGHT OUTER JOIN。这种类型的联接返回在右边表中的所有行,并且仅返回来自另一个表中联接字段相等(满足联接条件)的那些行。

把左外连接中的表名对调,其结果和右外连接的结果是一样的。

语法

MySQL中RIGHT OUTER JOIN的语法为:

SELECT columns
FROM table1
RIGHT [OUTER] JOIN table2
ON table1.column = table2.column;

在某些数据库中,将RIGHT OUTER JOIN关键字替换为RIGHT JOIN。

图形表示

在图中,MySQL RIGHT OUTER JOIN将返回阴影区域:

mysql 右连接

MySQL RIGHT OUTER JOIN将返回table2中的所有记录,并且仅返回table1中与table2相交的那些记录。

示例

这是一个MySQL RIGHT OUTER JOIN的示例:

SELECT orders.order_id, orders.order_date, suppliers.supplier_name
FROM suppliers
RIGHT JOIN orders
ON suppliers.supplier_id = orders.supplier_id;

该示例将返回orders表中的所有行,并且仅返回的suppliers表中supplier_id相等的行。
如果订单表中的Supplier_id值不存在于供应商表中,则供应商表中的所有字段在结果集中将显示为null


假设我们有一个供应商表,其中有两个字段(supplier_id和Supplier_name)。它包含以下数据:

supplier_idsupplier_name
10000Apple
10001Google

另外一个是订单表,具有三个字段(order_id,supplier_id和order_date)。它包含以下数据:

order_idsupplier_idorder_date
500125100002013/08/12
500126100012013/08/13
500127100022013/08/14

如果我们在下面运行SELECT语句(包含RIGHT OUTER JOIN):

SELECT orders.order_id, orders.order_date, suppliers.supplier_name
FROM suppliers
RIGHT JOIN orders
ON suppliers.supplier_id = orders.supplier_id;

我们的结果集如下所示:

order_idorder_datesupplier_name
5001252013/08/12Apple
5001262013/08/13Google
5001272013/08/14null

结果中包含了orders 表的所有行,同时通过supplier_id获取了suppliers 中的数据。
由于supplier_id等于10002的记录在suppliers中没有,所以值为null。