join 分内连接 和 **外链接 **
内连接分 inner join 和全连接 full join(mysql 不支持 full join,下面介绍full join作用,还有实现full join 的其他方法)
外连接分左连接 left join 和右连接 right join
试验准备表数据如下:
表a有a1、a2字段,a1唯一,a2有重复
表b有b1、b2字段,b1唯一,b2有重复
1、先使用简单的唯一数据去介绍。
使用表 a、b,使用字段 a1、b1
左链接 left join,也可写作 left outer join
left join 是使用 join 左边的表去匹配右边的表,on 的条件是匹配的规则,匹配规则左右两边必须为2个表的字段。
假如用 a left join b on a.a1 = b.b1
假如要过滤掉不匹配的数据,就需要剔除 join 右边的表字段 null 空值
假如需要过滤掉能匹配的数据,就需要等于 join 右边的表空值
右连接 right join 类似 left join,只是 join左右2个表颠倒位置
a left join b 等于 b right join a
过滤匹配数据时候,同样要颠倒,要过滤掉 join 左边的空值
由于right join 功能可以用left join实现,所以建议使用left join,不用right join,免得混淆左右顺序和过滤顺序。
内连接 inner join,也可以简写为 join
inner join 是使用 join 两边的表相互匹配,相当于 left join和 right join 过滤掉 null 以后去除重复的结果
这个结果相当于join 两边的表相互匹配,去除不匹配的值。
由于自带的已经去除不匹配的值,再使用上边的外连接去除不匹配方法就没用了
全连接 full join
和上边 inner join 相反, full join 就是全匹配,不管是否匹配上都显示结果,理论上 full join 显示结果应该是这样
无论是否有匹配,匹配的值显示匹配的值,不匹配的值也显示对应null。实际上mysql不支持 full join,如果有需要可以使用其他方式实现,比如 union all。
2、使用有重复数据的字段去展示
使用表a、b,字段a2、b2
原始数据仍然用上边的数据
仍然先介绍左连接 left join
显示结果如上,匹配规则是a2 = b2,由于a2有重复值,并且在b2中对应的也不是一条数据,查询结果就是将a表中a2字段每行都匹配一次,
这样结果数量就翻倍带上a1和b1显示会更明了一些
用下图表示a和b关联关系,应该更明了一些
3、更多匹配规则
假如匹配规则 on 有多个规则,可以使用 and 连接