Visual explanation of MySQL joins: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
mNo edit summary |
||
| Line 1: | Line 1: | ||
使用維恩圖(Venn diagram)視覺化解釋 MySQL Joins 的差異 | 使用維恩圖(Venn diagram)視覺化解釋 MySQL Joins (RIGHT Join、LEFT Join、INNER Join、OUTER Join) 的差異 | ||
== 準備測試資料 == | == 準備測試資料 == | ||
Revision as of 13:58, 28 October 2015
使用維恩圖(Venn diagram)視覺化解釋 MySQL Joins (RIGHT Join、LEFT Join、INNER Join、OUTER 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 |
table_b |
狀況 1-1: 以 a 資料為主,再把 b 資料黏上
MySQL 資料庫查詢:
SELECT * FROM table_a LEFT JOIN table_b ON table_a.id = table_b.id; /*相同效果的別種寫法*/ SELECT * FROM table_a LEFT OUTER JOIN table_b ON table_a.id = table_b.id;
預覽輸出資料
1|小一|1|女 3|小三|3|女 2|小二|NULL|NULL 4|小四|NULL|NULL
狀況 1-2: 以 b 資料為主,再把 a 資料黏上
MySQL 資料庫查詢:
SELECT * FROM table_a RIGHT JOIN table_b ON table_a.id = table_b.id; /*相同效果的別種寫法*/ SELECT * FROM table_a RIGHT OUTER JOIN table_b ON table_a.id = table_b.id;
預覽輸出資料
1|小一|1|女 3|小三|3|女 NULL|NULL|5|男 NULL|NULL|6|不明
狀況 2: 交集的資料,同時存在於 a 和 b
MySQL 資料庫查詢:
SELECT * FROM table_a INNER JOIN table_b ON table_a.id = table_b.id; /*相同效果的別種寫法*/ SELECT * FROM table_a, table_b WHERE table_a.id = table_b.id; SELECT a.*, b.* FROM table_a AS a NATURAL JOIN table_b AS b;
預覽輸出資料
1|小一|1|女 3|小三|3|女
狀況 3-1: 相對差集的資料,存在於 a,但是不存在於 b
存在於資料表 table_a ,但是不存在於 table_b
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
狀況 3-2: 相對差集的資料,存在於 b,但是不存在於 a
存在於資料表 table_b ,但是不存在於 table_a
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|不明
狀況 4: 聯集的資料,a 和 b 的所有資料
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|不明
狀況 5: 對稱差的資料,只存在於 a 或 b 其中一個
對稱差 (Symmetric difference)的資料,只存在於 table_a 或 table_b 其中一個
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|不明
參考資料
- A Visual Explanation of SQL Joins
- sql - Difference between INNER and OUTER joins - Stack Overflow
- (MySQL)left, right, inner, outer join 使用方法 - 小惡魔 - 電腦技術 - 工作筆記 - AppleBOY
- 維基百科:數學專題/集合論 - 維基百科,自由的百科全書
圖片素材