Join操作集合 INNER JOIN、LEFT/RIGHT JOIN、FULL JOIN、CROSS JOIN
阿新 • • 發佈:2018-12-12
假設兩張表: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。
注意:
t1
對應圖中的Table A
,t2
對應圖中的Table B
。- 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;
這是 t1
、t2
表笛卡爾積運算後的結果——將 t2
表中的資料依次取出,取出時分別與 t1
表中所有資料挨個組合。也就是說,最後的結果中,一共有 4×4=16 條記錄。
總結
通過下面這張圖,可以較全面的理解 MySQL JOINS 了。