/ db

mysql-join

JOIN 可用于在查询、更新或者删除数据时,基于列来进行表连接。它可以让你在 ON 中写连接条件,而不用在 WHERE 中写。不过,这时你也还是使用 = 运算符来指定连接的列。

问题:相对于 WHERE 来说,使用 JOIN 有什么优势

JOIN

JOIN 从句分位 5 种:

  • 内连接(INNER JOIN )
  • 全外连接(FULL OUTER)
  • 左外连接(LEFT OUTER)
  • 右外连接(RIGHT OUTER)
  • 交叉连接(CROSS)

正确的选用 JOIN 从句来连接两张表。

INNER JOIN

INNER JOIN 基于连接谓词将两张表(A 和 B)的列组合在一起,产生新的结果表。

chrome_2018-05-17_18-02-57

SELECT a.name, b.status
FROM a
	JOIN b ON a.uid = b.uid;

LEFT OUTER JOIN

chrome_2018-05-17_18-21-25

左表 a 全部显示,表 b 作为附属表,显示部分内容。

只存在于左表 a,但不存在于表 b 的记录。

例如查询出所有用户和订单的信息。有的用户可能没有订单,则订单部分显示为 NULL。

SELECT `user`.name, `order`.oid
FROM `user`
	LEFT JOIN `order` ON `user`.uid = `order`.uid;
+-------------+----------------------+
|     name    | orderid              |
+-------------+----------------------+
| 刘伟        | 2018041415550350642  |
| 刘伟        | 2018042419260150019  |
| 刘伟        | 2018042617501350568  |
| 刘伟        | 2018050316042450477  |
| 张三丰      | 2018042310474452261  |
| 何以琛      | 2018042418302052433  |
| 朱萧木      | NULL                 |
| 林黛玉      | NULL                 |
| 宋太新      | NULL                 |
| 韦小宝      | NULL                 |
+-------------+----------------------+

或者显式地定义表 b 显示逻辑:

SELECT a.name, b.status
FROM a
	LEFT JOIN b ON a.uid = b.uid
WHERE b.status IS NULL;
+-------------+----------------------+
|     name    | orderid              |
+-------------+----------------------+
| 朱萧木      | NULL                 |
| 林黛玉      | NULL                 |
| 宋太新      | NULL                 |
| 韦小宝      | NULL                 |
+-------------+----------------------+
SELECT a.name, b.status
FROM a
	LEFT JOIN b ON a.uid = b.uid
WHERE b.status IS NOT NULL;
+-------------+----------------------+
|     name    | orderid              |
+-------------+----------------------+
| 刘伟        | 2018041415550350642  |
| 刘伟        | 2018042419260150019  |
| 刘伟        | 2018042617501350568  |
| 刘伟        | 2018050316042450477  |
| 张三丰      | 2018042310474452261  |
| 何以琛      | 2018042418302052433  |
+-------------+----------------------+