大家好,又见面了,我是你们的朋友全栈君。
本文部分内容参考了:Mysql 多表查询详解、图解SQL的各种连接,同时感谢原作者的整理与创作;
另外,推荐:
Mysql 连接的使用 – 菜鸟教程
MySQL 8.0参考手册 – 官方手册

在一般的业务情况下,我们大致将 Mysql多表连接 分为如下几种:
- 内连接:
INNER JOIN– 可简写为JOIN; - 左外连接:
LEFT OUTER JOIN– 可简写为LEFT JOIN; - 右外连接:
RIGHT OUTER JOIN– 可简写为RIGHT JOIN; - 全连接:使用
UNION完成; - 交叉连接:
CROSS JOIN– 也称为笛卡儿乘积连接,大抵不使用;
内连接 – INNER JOIN:
SQL 语句:
SELECT * FROM a INNER JOIN b ON(a.id = b.id)
解释:
查询出 a表 和 b表 的 交集;
图例:

左外连接 – LEFT OUTER JOIN:
SQL 语句:
SELECT * FROM a LEFT OUTER JOIN b ON(a.id = b.id)
解释:
查询出 左边表 -- 即a表 的完全集,而 右边表 -- 即b表 中匹配的则有值,没匹配的以 null 值取代;
图例:

右外连接 – RIGHT OUTER JOIN:
SQL 语句:
SELECT * FROM a RIGHT OUTER JOIN b ON(a.id = b.id)
解释:
与 左外连接相反 ,查询出 右边表 -- 即b表 的完全集,而 左边表 -- 即a表 中匹配的则有值,没匹配的以 null 值取代;
图例:

全连接 – UNION:
事实上由于 Mysql 不支持 FULL JOIN,所以我们将使用 UNION 来完成 全连接;
SQL 语句:
SELECT * FROM a LEFT OUTER JOIN b ON(a.id = b.id) UNION SELECT * FROM a RIGHT OUTER JOIN b ON(a.id = b.id)
解释:
全连接 是 左右外连接 的并集,连接表包含被连接的表的所有记录,如果缺少匹配的记录,,则以 null 取代;
图例:

交叉连接 – CROSS JOIN:
关于
交叉连接的教程,可以参考:MySQL交叉连接(CROSS
JOIN),本文此处便是转载于此;
CROSS JOIN 子句从连接的表返回行的 笛卡儿乘积;
假设使用 CROSS JOIN 连接两个表;
结果集将包括两个表中的所有行,其中结果集中的每一行都是第一个表中的行与第二个表中的行的组合;
当连接的表之间没有关系时,会使用这种情况;
要特别注意的是,如果每个表有 1000 行,那么结果集中就有 1000 x 1000 = 1,000,000 行,那么数据量是非常巨大的;
SQL 语句:
SELECT * FROM a CROSS JOIN b /** * 注意: * 与 INNER JOIN 或 [LEFT, RIGHT] OUTER JOIN 子句不同 * CROSS JOIN 连接没有 ON 条件 */
添加了 WHERE 子句后,如果 a表 和 b表 有关系,则 CROSS JOIN 的工作方式与 INNER JOIN 类似,SQL 语句为:
SELECT * FROM a CROSS JOIN b WHERE a.id = b.id
本文至此已结束,若有疏漏,还望诸位提醒更正
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142939.html原文链接:https://javaforall.net
