天天看点

MySQL索引深入学习(三)

前面我们看了mysql的一些安装和sql是怎么读取一个sql的,那我们现在就来看下常见的7种join查询

1、inner join(两者共有的)

MySQL索引深入学习(三)

下面我们以两张表格来看结果 :

# 二级分类表
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;
           
MySQL索引深入学习(三)

那换成inner join呢?我们知道inner join是查询两者共有的

select * from base_catalog2 2a inner join base_catalog3 3a on 2a.id = 3a.catalog2_id;
           
MySQL索引深入学习(三)

我们可以看到只有共有的八条。 

2 、A left join B (A有B没有的且多余的用null补齐)

MySQL索引深入学习(三)

表格查询语句:

select * from base_catalog2 2a left join base_catalog3 3a on 2a.id = 3a.catalog2_id;
           

这里为了方便看一些细节,我们这里使用和idea一家公司的DataGrip

MySQL索引深入学习(三)

我们可以看出两者不同的base_catalog3的字段都使用了null字段去补齐了

3、A right join B(B有A没有的且多余的用null补齐)

MySQL索引深入学习(三)

表格查询语句:

select * from base_catalog2 2a right join base_catalog3 3a on 2a.id = 3a.catalog2_id;
           

查询结果:

MySQL索引深入学习(三)

4、A left join B (A独有的)

MySQL索引深入学习(三)

查询语句:

select * from base_catalog2 as 2a left join base_catalog3 as 3a on 3a.catalog2_id = 2a.id where 3a.catalog2_id is null ;
           
MySQL索引深入学习(三)

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 ;
           
MySQL索引深入学习(三)

6、full outer join (全集)该命令请去oracle上面执行

这里在说下大家可以去看下去O(Oracle)计划.

MySQL索引深入学习(三)

那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
;
           
MySQL索引深入学习(三)

7、full outer join

MySQL索引深入学习(三)

同理该查询是去掉全集的共有的部分,就是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;
           
MySQL索引深入学习(三)
MySQL索引深入学习(三)

更多内容已上传公众号【那条转弯的路】

MySQL索引深入学习(三)