多表连接总结

写在前面

主要包括常规的一些数据表之前关联概念以及操作。例如:LEFT JOIN、RIGHT JOIN 以及 UNION 等

1. 普通关联(不设置主表)

-- sql 如下
select tb_a.*,tb_b.* from tb_a,tb_b where tb_a.a_id = tb_b.b_id

上面的 sql 结果将是展示 tb_a 和 tb_b 公有 tb_a.a_id 和 tb_b.b_id 相同部分

2. 左关联或右关联(LEFT JOIN 或 RIGHT JOIN)

-- sql 如下

select tb_a.*,tb_b.* from tb_a left join tb_b on tb_a.a_id = tb_b.b_id

select tb_a.*,tb_b.* from tb_a right join tb_b on tb_a.a_id = tb_b.b_id

上面 sql 的结果 sql(1) 则展示 tb_a的全部行数据,如果匹配到与 tb_b.b_id 相同时,则展示 tb_b 的数据,否则补空;sql(2)则相反,已tb_b 为主表,匹配时展示 tb_a 的数据,否则补空

3. 问题:Mysql 没有 OUTER JOIN ?

答案是:没有!但是我们可以通过下面的方式来解决此问题。

什么是 OUTER JOIN? OUTER JOIN 其实 两边的数据表都当作主表,每个表中的数据都将完全展示,当匹配不到另一个的数据时,各自补空。

-- sql 如下

select tb_a.*,tb_b.* from tb_a left join tb_b on tb_a.a_id = tb_b.b_id

union

select tb_a.*,tb_b.* from tb_a right join tb_b on tb_a.a_id = tb_b.b_id

如上述的 sql 其实等价于其他种类数据库的sql: select tb_a.*,tb_b.* from tb_a outer join tb_b on tb_a.a_id = tb_b.b_id

4. UNION 和 UNION ALL

UNION 是将两个 sql 返回的结果拼接到一起,由理解可以看出需要两段 sql 返回的数据接口是相同才能匹配并拼接,并剔除相同项

UNION ALL 则不会判断返回的数据是否有相同项,只是无脑将结果拼接在一起而已。

Last Updated: 8/3/2019, 11:39:58 PM