SQL中连接(JOIN)的用法

本文主要介绍SQL语句中连接(JOIN)的用法。

说明:本文中使用的数据库是 MySQL 数据库。

1 概述

在实际的数据库应用中,我们经常需要从多个数据表中读取数据,这时我们就可以使用SQL语句中的连接(JOIN),在两个或多个数据表中查询数据。

JOIN 按照功能可分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录;
  • LEFT JOIN(左连接):获取左表中的所有记录,即使在右表没有对应匹配的记录;
  • RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表中的所有记录,即使左表没有对应匹配的记录。

2 用法

现有两个表,本节后续的用法示例,均是对这两个表进行操作的,表的信息如下:

mysql> select * from roles;
+---------+------------+----------+
| role_id | occupation | camp     |
+---------+------------+----------+
|       1 | warrior    | alliance |
|       2 | paladin    | alliance |
|       3 | rogue      | Horde    |
+---------+------------+----------+
3 rows in set (0.01 sec)

mysql> 
mysql> select * from mount_info;
+----------+------------+---------+
| mount_id | mount_name | role_id |
+----------+------------+---------+
|        1 | horse      |       1 |
|        2 | sheep      |       1 |
|        3 | sheep      |       4 |
+----------+------------+---------+
3 rows in set (0.01 sec)

mysql> 

2.1 INNER JOIN

下面通过一个示例,介绍 INNER JOIN 的用法。

我们使用 INNER JOIN(也可以省略 INNER 、直接使用 JOIN )来连接上面两张表,匹配 mount_info 和role_id 中字段 role_id 相同的内容,命令如下:

mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a INNER JOIN mount_info b ON a.role_id = b.role_id;
+---------+------------+----------+------------+
| role_id | occupation | camp     | mount_name |
+---------+------------+----------+------------+
|       1 | warrior    | alliance | horse      |
|       1 | warrior    | alliance | sheep      |
+---------+------------+----------+------------+
2 rows in set (0.01 sec)

mysql> 

上述SQL语句等价于:

mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a, mount_info b WHERE a.role_id = b.role_id;
+---------+------------+----------+------------+
| role_id | occupation | camp     | mount_name |
+---------+------------+----------+------------+
|       1 | warrior    | alliance | horse      |
|       1 | warrior    | alliance | sheep      |
+---------+------------+----------+------------+
2 rows in set (0.01 sec)

mysql> 

INNER JOIN 的表关联模型如下:


上图中绿色的部分,为两表的内关联结果。

2.2 LEFT JOIN

下面通过一个示例,介绍 LEFT JOIN 的用法。

LEFT JOIN 与 INNER JOIN 有所不同,LEFT JOIN 会读取左侧数据表的全部数据,即使右侧表中无对应数据。

我们使用 LEFT JOIN来连接上面两张表,以 roles 为左侧表、mount_info 为右侧表,命令如下:

mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a LEFT JOIN mount_info b ON a.role_id = b.role_id;
+---------+------------+----------+------------+
| role_id | occupation | camp     | mount_name |
+---------+------------+----------+------------+
|       1 | warrior    | alliance | horse      |
|       1 | warrior    | alliance | sheep      |
|       2 | paladin    | alliance | NULL       |
|       3 | rogue      | Horde    | NULL       |
+---------+------------+----------+------------+
4 rows in set (0.01 sec)

mysql> 

在上述结果中能够看到,上面执行的SQL语句读取左边的数据表 roles 的所有的(SELECT)字段数据,即使在右侧表 mount_info 中没有对应的 role_id 字段值。

LEFT JOIN 的表关联模型如下:


上图中绿色的部分,为两表的左关联结果。

2.3 RIGHT JOIN

下面通过一个示例,介绍 RIGHT JOIN 的用法。

RIGHT JOIN 会读取右侧数据表的全部数据,即便左侧表无对应数据。

我们使用 LEFT JOIN来连接上面两张表,以 roles 为左侧表、mount_info 为右侧表,命令如下:

mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a RIGHT JOIN mount_info b ON a.role_id = b.role_id;
+---------+------------+----------+------------+
| role_id | occupation | camp     | mount_name |
+---------+------------+----------+------------+
|       1 | warrior    | alliance | horse      |
|       1 | warrior    | alliance | sheep      |
|    NULL | NULL       | NULL     | sheep      |
+---------+------------+----------+------------+
3 rows in set (0.01 sec)

mysql> 

在上述结果中能够看到,上面执行的SQL语句读取右侧的数据表 mount_info 的所有的(SELECT)字段数据,即使在左侧表 roles 中没有对应的 role_id 字段值。

RIGHT JOIN 的表关联模型如下:

上图中绿色的部分,为两表的右关联结果。


猜你喜欢

转载自blog.csdn.net/liitdar/article/details/80817087