1. 程式人生 > >Join操作集合 INNER JOIN、LEFT/RIGHT JOIN、FULL JOIN、CROSS JOIN

Join操作集合 INNER JOIN、LEFT/RIGHT JOIN、FULL JOIN、CROSS JOIN

假設兩張表:t1 和 t2。它們的資料如下。

id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

各有四條記錄,有兩條是一樣的。

接下來,就以這兩張表作為操作物件,介紹 SQL JOINS。

注意:

  1. t1 對應圖中的 Table A , t2 對應圖中的 Table B 。
  2. MySQL 不支援 FULL JOIN 。

一、INNER JOIN

簡單點說,就是交集。

請看下面的語句。

SELECT * FROM t1 INNER JOIN t2 
ON t1.name = t2.name

得結果

id  name       id   name
--  ----       --   ----
1   Pirate     2    Pirate
3   Ninja      4    Ninja

其實,多表聯查預設使用的就是 INNER JOIN。就是說

SELECT * FROM t1 INNER JOIN t2 
ON t1.name = t2.name

# 等於

SELECT * FROM t1, t2 
WHERE t1.name = t2.name

二、LEFT JOIN

3.1 情況一、以 t1 為查詢依據

SELECT * FROM t1 LEFT JOIN t2
ON t1.name = t2.name

得結果

id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey     null  null
3   Ninja      4     Ninja
4   Spaghetti  null  null

最終的資料是以左表 t1 為依據, t2 表中沒有的,顯示 null。且返回結果中的記錄條數,總是等於表 t1

 的記錄條數。

3.2 情況二、獨一無二的 t1

我們把下面的 t1 叫做獨一無二的 t1 (相對於 t2 來說的)。

SELECT * FROM t1 LEFT JOIN t2
ON t1.name = t2.name
WHERE ISNULL(t2.name);

ISNULL(t2.name) 是過濾操作, 把t1 中包含 t2 的部分(即 t1 和 t2 的交集部分)過濾掉,過濾依據是欄位 name。這就得到了獨一無二的 t1 。

結果如下

id  name       id     name
--  ----       --     ----
2   Monkey     null   null
4   Spaghetti  null   null

三、RIGHT JOIN

RIGHT JOIN 與 LEFT JOIN 類似,這裡不再贅述。

四、FULL JOIN

就是並集。

SELECT * FROM t1 FULL JOIN t2
ON t1.name = t2.name

 結果:

id    name       id    name
--    ----       --    ----
1     Pirate     2     Pirate
2     Monkey     null  null
3     Ninja      4     Ninja
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

t2 表中沒有的,用 null 替代; t1 表中沒有的,用 null 替代。

MySQL 不支援 FULL JOIN 。可以用 UNION 來實現類似的功能。

SELECT * FROM t1 LEFT JOIN t2 ON t1.name = t2.name
UNION ALL
SELECT * FROM t1 RIGHT JOIN t2 ON t1.name = t2.name;

查詢出非交集部分。

SELECT * FROM t1 FULL JOIN t2
ON t1.name = t2.name
WHERE t1.id IS null OR t2.id IS null

五、CROSS

SELECT * FROM t1 CROSS JOIN t2;

這是 t1t2 表笛卡爾積運算後的結果——將 t2 表中的資料依次取出,取出時分別與 t1 表中所有資料挨個組合。也就是說,最後的結果中,一共有 4×4=16 條記錄。

總結

通過下面這張圖,可以較全面的理解 MySQL JOINS 了。

å¾è§£SQLçJOINæä½