|
从业以来主要在做客户端,用到的数据库都是表结构比较简单的 SQLite,以我那还给老师一大半的 SQL 水平倒也能对付。现在偶尔需要到后台的 SQL Server 里追查一些数据问题,就显得有点捉襟见肘了,特别是各种 JOIN,有时候傻傻分不清楚,于是索性弄明白并做个记录。

前言
在各种问答社区里谈及 SQL 里的各种 JOIN 之间的区别时,最被广为引用的是 CodeProject 上 C.L. Moffatt 的文章 Visual Representation of SQL Joins,他确实讲得简单明了,使用文氏图来帮助理解,效果明显。本文将沿用他的讲解方式,稍有演绎,可以视为该文较为粗糙的中译版。
约定
下文将使用两个数据库表 Table_A 和 Table_B 来进行示例讲解,其结构与数据分别如下:
- mysql> SELECT * FROM Table_A ORDER BY PK ASC;
- +----+---------+
- | PK | Value |
- +----+---------+
- | 1 | both ab |
- | 2 | only a |
- +----+---------+
- 2 rows in set (0.00 sec)
-
- mysql> SELECT * from Table_B ORDER BY PK ASC;
- +----+---------+
- | PK | Value |
- +----+---------+
- | 1 | both ab |
- | 3 | only b |
- +----+---------+
- 2 rows in set (0.00 sec)
其中 PK 为 1 的记录在 Table_A 和 Table_B 中都有,2 为 Table_A 特有,3 为 Table_B 特有。
常用的 JOIN
1、INNER JOIN
INNER JOIN 一般被译作内连接。内连接查询能将左表(表 A)和右表(表 B)中能关联起来的数据连接后返回。
文氏图:

INNER JOIN
示例查询:
- SELECT A.PK AS A_PK, B.PK AS B_PK,
- A.Value AS A_Value, B.Value AS B_Value
- FROM Table_A A
- INNER JOIN Table_B B
- ON A.PK = B.PK;
查询结果:
- +------+------+---------+---------+
- | A_PK | B_PK | A_Value | B_Value |
- +------+------+---------+---------+
- | 1 | 1 | both ab | both ab |
- +------+------+---------+---------+
- 1 row in set (0.00 sec)
注:其中 A 为 Table_A 的别名,B 为 Table_B 的别名,下同。
2、LEFT JOIN
LEFT JOIN 一般被译作左连接,也写作 LEFT OUTER JOIN。左连接查询会返回左表(表 A)中所有记录,不管右表(表 B)中有没有关联的数据。在右表中找到的关联数据列也会被一起返回。
文氏图:

LEFT JOIN
示例查询:
- SELECT A.PK AS A_PK, B.PK AS B_PK,
- A.Value AS A_Value, B.Value AS B_Value
- FROM Table_A A
- LEFT JOIN Table_B B
- ON A.PK = B.PK;
查询结果:
- +------+------+---------+---------+
- | A_PK | B_PK | A_Value | B_Value |
- +------+------+---------+---------+
- | 1 | 1 | both ab | both ba |
- | 2 | NULL | only a | NULL |
- +------+------+---------+---------+
- 2 rows in set (0.00 sec)
3、RIGHT JOIN
RIGHT JOIN 一般被译作右连接,也写作 RIGHT OUTER JOIN。右连接查询会返回右表(表 B)中所有记录,不管左表(表 A)中有没有关联的数据。在左表中找到的关联数据列也会被一起返回。
(编辑:江门站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|