Mysql的七種join
阿新 • • 發佈:2020-12-15
首先準備一下需要的表和資料(以Mysql為準)
CREATE TABLE `boy` (
`bid` int(11) NOT NULL,
`bname` varchar(50) NOT NULL,
`gid` int(11) DEFAULT NULL,
PRIMARY KEY (`bid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `boy` VALUES ('1', '李雷', '1');
INSERT INTO `boy` VALUES ('2', '小明', '2');
INSERT INTO `boy` VALUES ('3', '小王', null);
CREATE TABLE `girl` (
`gid` int(11) NOT NULL,
`gname` varchar(50) NOT NULL,
`bid` int(11) DEFAULT NULL,
PRIMARY KEY (`gid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `girl` VALUES ('1', '韓梅梅', '1');
INSERT INTO `girl` VALUES ('2', '小紅' , '2');
INSERT INTO `girl` VALUES ('3', '小麗', null);
瞭解一下七種型別都有哪些
交集,A表與B表都包含的資料
SQL:
select * from Boy a inner join Girl b on a.gid = b.gid
查詢結果:
左外連線,包含A加AB共有的資料
SQL:
select * from Boy a left join Girl b on a.gid = b.gid
查詢結果:
右外連線,包含B加AB共有的資料
SQL:
select * from Boy a right join Girl b on a. gid = b.gid
查詢結果:
前三種都比較簡單,下面稍微分析下
A獨有的資料,這張圖跟第二張圖(左外連線)比較,去掉了AB共有的資料,這個在資料上分析更簡單,下面看一下第二張圖的資料
前兩條資料都是AB共有的資料,我們現在想要的是第三條資料,即在where條件加上b.gid is null即可
SQL:
select * from Boy a left join Girl b on a.gid = b.gid where b.gid is null
查詢結果:
**B獨有的資料,這個跟第三張圖(右外連線)比較,需要新增的條件是a.bid is null **
SQL:
select * from Boy a right join Girl b on a.gid = b.gid where a.bid is null
查詢結果:
AB全表,第二種(右外連線)和第三種(左外連線)相加就可以了,但是這裡有一個問題,兩種查詢方法都包含了AB’共有的,如果相加可能會有重複資料,這時就需要用union,這個關鍵字的左右合併結果集並去重,注意:多個結果集查詢的欄位必須相同
SQL:
select * from Boy a LEFT JOIN Girl b on a.gid = b.gid
UNION
select * from Boy a right join Girl b on a.gid = b.gid
查詢結果:
A獨有+B獨有,第三種和第四種的合集
SQL:
select * from Boy a LEFT JOIN Girl b on a.gid = b.gid where b.gid is null
UNION
select * from Boy a right join Girl b on a.gid = b.gid where a.bid is null
查詢結果: