【Java 从 0 到架构师】SQL 多表查询
LEFT JOIN
对应的 ON
条件其实就是两个表共同的部分



[](()多表查询 SQL 示例
==============================================================================
目前有两张表:
customer:顾客信息表

company:公司信息表

有顾客的公司信息(附带顾客信息) = 有公司的顾客信息(附带公司信息)
[](()INNER JOIN
内连接:查询出所有有公司信息的顾客信息(附带公司信息)
等价于 所有有顾客信息的公司信息(附带顾客信息)

l ∩ r
SELECT * FROM
customer l
INNER JOIN
company r
ON
l.company_id = r.id;
下面的写法等价于上面的内连接:
SELECT * FROM
customer l, company r
WHERE l.company_id 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 = r.id;
[](()LEFT JOIN
左外连接:查询出所有有公司和没有公司的顾客信息(附带公司信息)

l ∪ (l ∩ r)
SELECT * FROM
customer l
LEFT JOIN
company r
ON
l.company_id = r.id;
[](()LEFT JOIN EXCLUDING INNER JOIN
有 WHERE 的左外连接:查询出所有没有公司的顾客信息(附带公司信息)
排除了有公司的顾客信息(附带公司信息)

l - (l ∩ r)
SELECT * FROM
customer l
LEFT JOIN
company r
ON
l.company_id = r.id
WHERE
r.id IS NULL;
[](()RIGHT JOIN
右外连接:查询出所有有顾客和没有顾客的公司信息(附带顾客信息)

r ∪ (l ∩ r)
SELECT * FROM
customer l
RIGHT JOIN
company r
ON
l.company_id = r.id;
[](()RIGHT JOIN EXCLUDING INNER JOIN
带 WHERE 的右外连接:查询出所有没有顾客的公司信息(附带顾客信息)
排除了有顾客的公司信息(附带顾客信息)

r - (l ∩ r)
SELECT * FROM
customer l
RIGHT JOIN
company r
ON
l.company_id = r.id
WHERE
l.company_id IS NULL;
SQL 规范中定义了 FULL OUTER JOIN(全外连接),MySQL 中实现需要依靠
UNION
[](()FULL OUTER JOIN
全外连接:查询出所有:
有顾客的公司信息(附带顾客信息)
等价于 有公司的顾客信息(附带公司信息)
没有顾客的公司信息(附带顾客信息)
没有公司的顾客信息(附带公司信息)

l ∪ r
(
SELECT * FROM
customer l
LEFT JOIN
company r
ON
l.company_id = r.id
)
UNION
(
SELECT * FROM
customer l
RIGHT JOIN
company r
ON
l.company_id = r.id
);
[](()FULL OUTER JOIN EXCLUDING INNER JOIN
排除内连接的全连接,查询出所有:
没有顾客的公司信息(附带顾客信息)
没有公司的顾客信息(附带公司信息)

(l ∪ r) - (l ∩ r)
(
SELECT * FROM
customer l
LEFT JOIN
company r
评论