前面我们看了mysql的一些安装和sql是怎么读取一个sql的,那我们现在就来看下常见的7种join查询
1、inner join(两者共有的)

下面我们以两张表格来看结果 :
# 二级分类表
create table base_catalog2
(
id int auto_increment comment '编号'
primary key,
name varchar(200) not null comment '二级分类名称',
catalog1_id int null comment '一级分类编号'
)
charset = utf8;
# 三级分类表
create table base_catalog3
(
id bigint auto_increment comment '编号'
primary key,
name varchar(200) not null comment '三级分类名称',
catalog2_id bigint null comment '二级分类编号'
)
charset = utf8;
# 三级有二级分类的id
首先我们查看两者全部的:
# 这里我们base_catalog2有1259条数据 base_catalog3 有8条所以查询出来的会有10072条(笛卡尔积)
select * from base_catalog2 2a, base_catalog3 3a;
那换成inner join呢?我们知道inner join是查询两者共有的
select * from base_catalog2 2a inner join base_catalog3 3a on 2a.id = 3a.catalog2_id;
我们可以看到只有共有的八条。
2 、A left join B (A有B没有的且多余的用null补齐)
表格查询语句:
select * from base_catalog2 2a left join base_catalog3 3a on 2a.id = 3a.catalog2_id;
这里为了方便看一些细节,我们这里使用和idea一家公司的DataGrip
我们可以看出两者不同的base_catalog3的字段都使用了null字段去补齐了
3、A right join B(B有A没有的且多余的用null补齐)
表格查询语句:
select * from base_catalog2 2a right join base_catalog3 3a on 2a.id = 3a.catalog2_id;
查询结果:
4、A left join B (A独有的)
查询语句:
select * from base_catalog2 as 2a left join base_catalog3 as 3a on 3a.catalog2_id = 2a.id where 3a.catalog2_id is null ;
5、A right join B (B独有的)
查询语句:
select * from base_catalog2 as 2a right join base_catalog3 as 3a on 3a.catalog2_id = 2a.id where 2a.id is null ;
6、full outer join (全集)该命令请去oracle上面执行
这里在说下大家可以去看下去O(Oracle)计划.
那mysql怎么办呢(union)?
我们上面的可以看做是A全部+B全部,但是现在他们共有的部分就重复了,所以需要去重下
select * from base_catalog2 as 2a left join base_catalog3 as 3a on 3a.catalog2_id =2a.id union
select * from base_catalog2 as 2a right join base_catalog3 as 3a on 3a.catalog2_id =2a.id
;
7、full outer join
同理该查询是去掉全集的共有的部分,就是A独有的+B独有的
select * from base_catalog2 as 2a left join base_catalog3 as 3a on 3a.catalog2_id =2a.id
where 3a.catalog2_id is null
union
select * from base_catalog2 as 2a right join base_catalog3 as 3a on 3a.catalog2_id =2a.id
where 2a.id is null;
更多内容已上传公众号【那条转弯的路】