前面我們看了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;
更多内容已上傳公衆号【那條轉彎的路】