數據庫左連接、右連接、內連接、全連接筆記 數據庫左連接、右連接、內連接、全連接筆記

翻譯

數據庫左連接、右連接、內連接、全連接筆記

-- 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

查詢結果:
這裏寫圖片描述

文章最後發佈於: 2018-03-29 15:10:14
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章