1. 程式人生 > >資料庫左連線、右連線、內連線、全連線筆記

資料庫左連線、右連線、內連線、全連線筆記

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

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