前言
SQL中,JOIN
操作用于将多个表连接起来。我们工作中,常用的join方式有 INNER JOIN
、LEFT JOIN
。虽然 JOIN
的方式有如下图所示的7种,实际上其实可以分为3种,分别是 INNER JOIN
、LEFT JOIN
、FULL OUTER JOIN
,其余4种都是前三种的变种。
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
2)INNER JOIN
INNER JOIN 关键字在表中存在至少一个匹配时返回行。
SQL
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
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;
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
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
6)RIGHT JOIN
SELECT * FROM table_a
RIGHT JOIN table_b
ON table_a.column_name = table_b.column_name
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
中。