前言
SQL中,JOIN 操作用于将多个表连接起来。我们工作中,常用的join方式有 INNER JOIN、LEFT JOIN。虽然 JOIN的方式有如下图所示的7种,实际上其实可以分为3种,分别是 INNER JOIN、LEFT JOIN、FULL OUTER JOIN,其余4种都是前三种的变种。

SQL JOINS
1)LEFT JOIN
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
SQL
SELECT column_name(s)
FROM table1
LEFT JOIN table2
WHERE table1.column_name = table2.column_name
或
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
WHERE table1.column_name = table2.column_name

LEFT JOIN 图示
2)INNER JOIN
INNER JOIN 关键字在表中存在至少一个匹配时返回行。
SQL
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

INNER JOIN
3)FULL OUTER JOIN (FULL JOIN) (MySQL 不支持)
FULL OUTER JOIN 结合了 LEFT JOIN 和 RIGHT JOIN的结果。
SQL
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

FULL OUTER JOIN
4) FULL OUTER JOIN BUT a.Key is null or b.Key is null
SELECT * FROM table_a
FULL OUTER JOIN table_b
on table_a.column_name = table_b.column_name
where table_a.column_name is null or table_b.column_name is null

FULL OUTER JOIN BUT a.key is null or b.key is null
5) LEFT JOIN BUT b.key is null
SELECT * from table_a
LEFT OUTER JOIN table_b
on table_a.column_name= table_b.column_name
where table_b.column_name is null

LEFT JOIN BUT b.key is null
6)RIGHT JOIN
SELECT * FROM table_a
RIGHT JOIN table_b
ON table_a.column_name = table_b.column_name

image.png
7)RIGHT JOIN BUT a.key is null
SELECT * FROM table_a
RIGHT JOIN table_b
ON table_a.column_name = table_b.column_name
WHERE table_a.column_name is null
总结
在平时的实践中,使用最多的还是 inner join 和 left join。left join 与 right join可以看作为同一类型的join操作。好比,乘数与被乘数。也就是说,我们完全可以使用 left join 替代 right join。在我们公司NodeJS项目中,使用到了一个ORM(TypeORM),这库就只提供left join。
关于join中 where语句 与 ON 语句,我们常常困惑将什么条件放到 where 合适 还是放到 on 中合适。当为 inner join时,放在 where 或 ON 中,查询结果都一样。当为 outer(left、right) join 时,放在 where 或 ON 就有区别。当需要对交际做筛选时放在 where 中,当需要对单张表做筛选然后进行 join操作时,放在 ON 中。