數據庫左連接、右連接、內連接、全連接筆記
-- auto-generated definition
CREATE TABLE table_a
(
PK INT(10) NOT NULL
PRIMARY KEY,
Value VARCHAR(25) NULL
)
COMMENT '表A';
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
表B:
-- auto-generated definition
CREATE TABLE table_b
(
PK INT(10) NOT NULL
PRIMARY KEY,
Value VARCHAR(50) NULL
)
COMMENT '表B';
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
表A數據:
表B數據:
下面是各種連接的韋恩圖:
詳細分析
1.INNER JOIN (內連接)
內連接是一種一一映射關係,就是兩張表都有的才能顯示出來
用韋恩圖表示是兩個集合的交集,如圖:
實現代碼:
SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value
FROM table_a A
INNER JOIN table_b B
ON A.PK = B.PK;
- 1
- 2
- 3
- 4
查詢結果:
2.LEFT JOIN (左連接)
左連接是左邊表的所有數據都有顯示出來,右邊的表數據只顯示共同有的那部分,沒有對應的部分只能補空顯示,所謂的左邊表其實就是指放在left join的左邊的表
用韋恩圖表示如下:
實現代碼:
SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value
FROM table_a A
LEFT JOIN table_b B
ON A.PK = B.PK;
- 1
- 2
- 3
- 4
查詢結果:
3.RIGHT JOIN(右連接)
右連接正好是和左連接相反的,這裏的右邊也是相對right join來說的,在這個右邊的表就是右表
用韋恩圖表示如下:
實現代碼:
SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value
FROM table_a A
RIGHT JOIN table_b B
ON A.PK = B.PK;
- 1
- 2
- 3
- 4
查詢結果:
4.OUTER JOIN(外連接、全連接)
查詢出左表和右表所有數據,但是去除兩表的重複數據
韋恩圖表示如下:
實現代碼:
SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value
FROM table_a A
FULL JOIN table_b B
ON A.PK = B.PK;
- 1
- 2
- 3
- 4
上面代碼在mysql執行是報錯的,因爲mysql不支持全連接,只能用以下代碼實現效果,含義是左連接+右連接+去重=全連接:
SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value
FROM table_a A
LEFT JOIN table_b B
ON A.PK = B.PK
UNION
SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value
FROM table_a A
RIGHT JOIN table_b B
ON A.PK = B.PK;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
查詢結果:
5.LEFT JOIN EXCLUDING INNER JOIN(左連接不包含內連接)
這個查詢是隻查詢左邊表有的數據,共同有的也不查出來
韋恩圖表示如下:
實現代碼:
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK = B.PK
WHERE B.PK IS NULL
- 1
- 2
- 3
- 4
- 5
- 6
查詢結果:
6.RIGHT JOIN EXCLUDING INNER JOIN(右連接不包含內連接)
這個查詢是隻查詢右邊表有的數據,共同有的也不查出來
韋恩圖表示如下:
實現代碼:
SELECT A.PK AS A_PK, A.Value AS A_Value, B.PK AS B_PK,
B.Value AS B_Value
FROM Table_A A
RIGHT JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL
- 1
- 2
- 3
- 4
- 5
- 6
查詢結果:
7.OUTER JOIN EXCLUDING INNER JOIN(外連接不包含內連接)
意思就是查詢左右表各自擁有的那部分數據
韋恩圖表示如下:
實現代碼:
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL
OR B.PK IS NULL
- 1
- 2
- 3
- 4
- 5
- 6
- 7
由於mysql不支持full join,只能通過下面代碼模擬實現:
SELECT A.PK AS A_PK, A.Value AS A_Value, B.PK AS B_PK,
B.Value AS B_Value
FROM table_a A
LEFT JOIN table_b B
ON A.PK = B.PK
WHERE B.PK IS NULL
UNION ALL
SELECT *
FROM table_a A
RIGHT JOIN table_b B
ON A.PK = B.PK
WHERE A.PK IS NULL;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
查詢結果: