MySQL Join 联接
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 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_id | supplier_name |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
我们还有另一个orders表,其中包含三个字段(order_id,supplier_id和order_date)。它包含以下数据:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 2013/05/12 |
500126 | 10001 | 2013/05/13 |
500127 | 10004 | 2013/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 name | order_date |
---|---|
10000 | IBM 2013/05/12 |
10001 | Hewlett 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 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_id | supplier_name |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
另外一个订单表orders ,具有三个字段(order_id,supplier_id和order_date)。它包含以下数据:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 2013/05/12 |
500126 | 10001 | 2013/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_id | supplier_name | order_date |
---|---|---|
10000 | IBM | 2013/05/12 |
10001 | Hewlett Packard | 2013/05/13 |
10002 | Microsoft | null |
10003 | NVIDIA | null |
先返回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 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_id | supplier_name |
---|---|
10000 | Apple |
10001 |
另外一个是订单表,具有三个字段(order_id,supplier_id和order_date)。它包含以下数据:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 2013/08/12 |
500126 | 10001 | 2013/08/13 |
500127 | 10002 | 2013/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_id | order_date | supplier_name |
---|---|---|
500125 | 2013/08/12 | Apple |
500126 | 2013/08/13 | |
500127 | 2013/08/14 | null |
结果中包含了orders 表的所有行,同时通过supplier_id获取了suppliers 中的数据。
由于supplier_id等于10002的记录在suppliers中没有,所以值为null。