Visual explanation of MySQL joins

From LemonWiki共筆
Revision as of 01:59, 28 October 2015 by Planetoid (talk | contribs) (Created page with "使用維恩圖(Venn diagram)視覺化解釋 MySQL Join == 準備測試資料 == <pre> CREATE TABLE table_a (id int NOT NULL PRIMARY KEY, name varchar(30) CHARACTER SET utf...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

使用維恩圖(Venn diagram)視覺化解釋 MySQL Join

準備測試資料

CREATE TABLE table_a (id  int NOT NULL PRIMARY KEY, name varchar(30)  CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL);

INSERT INTO table_a (id, name)
VALUES
(1, '小一'),
(2, '小二'),
(3, '小三'),
(4, '小四')
;

CREATE TABLE table_b (id  int NOT NULL PRIMARY KEY, gender varchar(30)  CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL);

INSERT INTO table_b
(id, gender)
VALUES
(1, '女'),
(3, '女'),
(5, '男'),
(6, '不明')
;

預覽測試資料

table_a
id name
-- -------
1 小一
2 小二
3 小三
4 小四

table_b
id gender
-- --------
1 女
3 女
5 男
6 不明

狀況1: 交集的資料

Venn_diagrams_intersection_of_two_sets.png

MySQL 資料庫查詢:

SELECT * FROM table_a
INNER JOIN table_b
ON table_a.id = table_b.id;

預覽輸出資料

1|小一|1|女
3|小三|3|女

狀況2-1: 相對差集的資料,存在於 a,但是不存在於 b

存在於資料表 table_a ,但是不存在於 table_b

Venn_diagrams_relative_complement_of_b_(right)_in_a_(left).png

MySQL 資料庫查詢:

SELECT * FROM table_a
LEFT JOIN table_b
ON table_a.id = table_b.id
WHERE table_b.id IS NULL;

預覽輸出資料

2|小二|NULL|NULL
4|小四|NULL|NULL

狀況2-2: 相對差集的資料,存在於 b,但是不存在於 a

存在於資料表 table_b ,但是不存在於 table_a

Venn_diagrams_relative_complement_of_a_(left)_in_b_(right).png

MySQL 資料庫查詢:

SELECT * FROM table_a
RIGHT JOIN table_b
ON table_a.id = table_b.id
WHERE table_a.id IS NULL;

預覽輸出資料

NULL|NULL|5|男
NULL|NULL|6|不明

狀況3: 聯集的資料

Venn_diagrams_union_of_two_sets.png

MySQL 資料庫查詢 (相當於 SQL 的 FULL OUTER JOIN):

SELECT * FROM table_a
LEFT JOIN table_b
ON table_a.id = table_b.id

UNION

SELECT * FROM table_a
RIGHT JOIN table_b
ON table_a.id = table_b.id;

預覽輸出資料

1|小一|1|女
3|小三|3|女
2|小二|NULL|NULL
4|小四|NULL|NULL
NULL|NULL|5|男
NULL|NULL|6|不明

狀況4: 對稱差的資料,只存在於 a 或 b 其中一個

對稱差 (Symmetric difference)的資料,只存在於 table_a 或 table_b 其中一個

Venn_diagrams_symmetric_difference_of_two.png

MySQL 資料庫查詢:

SELECT * FROM table_a
LEFT JOIN table_b
ON table_a.id = table_b.id
WHERE table_a.id IS NULL OR table_b.id IS NULL

UNION

SELECT * FROM table_a
RIGHT JOIN table_b
ON table_a.id = table_b.id
WHERE table_a.id IS NULL OR table_b.id IS NULL;

預覽輸出資料

2|小二|NULL|NULL
4|小四|NULL|NULL
NULL|NULL|5|男
NULL|NULL|6|不明

參考資料

圖片素材