資料庫左連線、右連線、內連線、全連線筆記
-- auto-generated definition
CREATE TABLE table_a
(
PK INT(10) NOT NULL
PRIMARY KEY,
Value VARCHAR(25) NULL
)
COMMENT '表A';
表B:
-- auto-generated definition
CREATE TABLE table_b
(
PK INT(10) NOT NULL
PRIMARY KEY,
Value VARCHAR(50) NULL
)
COMMENT '表B';
表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;
查詢結果:
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;
查詢結果:
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;
查詢結果:
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;
上面程式碼在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;
查詢結果:
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
查詢結果:
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
查詢結果:
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
由於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;
查詢結果: