以上的图片是基于理论的七种join关联,但不是所有都适用于Mysql
内容介绍如下
- 表展示
- 交集
- 左/右连接
- 左/右连接去除交集
- 全连接
- 外连接不包含内连接
表展示
表A:
表B:
笛卡尔积
SELECT * from a,b
SELECT * from a CROSS JOIN b
注意右下角的红线框处,笛卡尔积就是交叉相乘,以上两种写法都是笛卡尔积的写法
交集
SELECT * from a INNER JOIN b on a.`name`=b.`name`
左/右连接(自身+交集)
左连接:
select * from a left JOIN b on a.`name`=b.`name`
右连接:
select * from a right JOIN b on a.`name`=b.`name`
这里的左右连接,主体结构都没有变,都是如下的结构
select * from 表1 right/left JOIN 表2 on 交集条件
左/右连接但不包括交集(自己独有的)
左连接,不包括自身:
select * from a LEFT JOIN b on a.`name`=b.`name` WHERE b.`name` IS NULL
左连接,不包括自身:
select * from a right JOIN b on a.`name`=b.`name` WHERE a.`name` IS NULL
这里的左/右连接不包括自身,都是如下的结构:
select * from 表1 right/left JOIN 表2 on 交集条件 WHERE 表1/表2 .xx is NULL
全连接
直接运行FULL JOIN是会出现如下的错误,因为mysql不支持全连接,oracle就只吃支持
解决方法:
- 因为全连接可以看做是左连接+右链接+去重(union)
select * from a right JOIN b on a.`name`=b.`name`
UNION
select * from a LEFT JOIN b on a.`name`=b.`name`
外连接不包含内连接
同样的,这里不支持全连接,所以不行,解决方法如下:
- 左连接不包含交集+右连接不包含交集
select * from a LEFT JOIN b on a.`name`=b.`name` WHERE b.`name` IS NULL
UNION
select * from a right JOIN b on a.`name`=b.`name` WHERE a.`name` IS NULL