天天看點

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索引深入學習(三)