多表连接总结
写在前面
主要包括常规的一些数据表之前关联概念以及操作。例如: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 则不会判断返回的数据是否有相同项,只是无脑将结果拼接在一起而已。