MySQL 的 FULL OUTER JOIN如何实现

1、问题概述

在 MySQL 中,不支持 FULL OUTER JOIN 的语法,但我们可以通过其他方式来实现 FULL OUTER JOIN的效果。FULL OUTER JOIN 是一种联结方式,它返回两个表的所有匹配行和非匹配行。此篇博客介绍一种使用 UNION 和 LEFT JOIN、RIGHT JOIN 来实现 FULL OUTER JOIN 的方法。

2、实现方法

现在拿两个表来解释,表1是网站表(website)主要是id、网站名称、网站地址、排名和所属国家。表2是访问日志表(access_log),主要是id、网站id、访问次数和日期。

表1:website(网站表)
在这里插入图片描述
表2:access_log(访问日志表)
在这里插入图片描述
从表中可以看出,表1的网站表,没有id为7的,而表2的site_id是有id为7的数据,但是没有site_id为6的。

SELECT * FROM websites w
LEFT JOIN access_log a on w.id = a.site_id
UNION
SELECT * FROM websites w
RIGHT JOIN access_log a on w.id = a.site_id

输出结果如下,虽然access_log表没有id为6的,但是结果还会有id为6的一行数据,只是access_log表对应的各个数据项为null。虽然website表没有id为7的,但是结果还会有site_id为7的一行数据,但是website表的数据项为null。
在这里插入图片描述

3、总结

通过以上步骤,可以使用 UNION 和 LEFT JOIN、RIGHT JOIN 来实现 MySQL 中没有直接支持的 FULL OUTER JOIN。通过组合这些操作,我们可以获得两个表的所有匹配行和非匹配行。

4、union用法注意

  • 1、使用UNION命令时需要注意,只能在最后使用一个ORDER BY命令,是将两个查询结果合在一起之后,再进行排序!绝对不能写两个ORDER BY命令。另外,在使用ORDER BY排序时,注意两个结果的别名保持一致,使用别名排序很方便。当然也可以使用列数。

  • 2、ORDER BY 只能当前 SQL 查询结果进行排序,如要对 union all 出来的结果进行排序,需要先做集合。如下代码所示:

select aa.* from 
(select country,name from websites where country = 'CN'
union all select country,app_name from apps where country='CN' ) aa
order by aa.name;
  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值