上一篇我們介紹了SQL如何使用指定的條件,搭配的SELECT 和 FROM 來篩選資料。本篇我們來討論,如何將兩個或多個資料表中的資料結合在一起,根據欄位之間的邏輯關係來拼接、合併資料表。
JOIN
常見的 JOIN
類型包括 INNER JOIN
、LEFT JOIN
、RIGHT JOIN
和 FULL OUTER JOIN
等。我們以下圖介紹 JOIN
的及範例。
1. Area A (交集部分)
A
部分代表兩個表中都有匹配的記錄,表示表 X 和表 Y 之間的交集部分。SELECT ...
FROM X
INNER JOIN Y
ON X.key = Y.key;
2. Area A + B
A + B
部分代表 X 表中的所有記錄,包括那些在表 Y 中沒有匹配的記錄(B
區域)。SELECT ...
FROM X
LEFT JOIN Y
ON X.key = Y.key;
A + C
部分代表 Y 表中的所有記錄,包括那些在表 X 中沒有匹配的記錄(C
區域)。SELECT ...
FROM X
RIGHT JOIN Y
ON X.key = Y.key;
A + B + C
部分代表 X 表和 Y 表中的所有記錄,無論它們之間是否有匹配。未匹配的部分會顯示 NULL
。SELECT ...
FROM X
FULL OUTER JOIN Y
ON X.key = Y.key;
B
部分代表在表 X 中有,但在表 Y 中沒有匹配的記錄。SELECT ...解釋:此查詢會返回所有在表 X 中,但在表 Y 中沒有匹配的記錄。
FROM X
LEFT JOIN Y
ON X.key = Y.key
WHERE Y.key IS NULL;
C
部分代表在表 Y 中有,但在表 X 中沒有匹配的記錄。SELECT ...解釋:此查詢會返回所有在表 Y 中,但在表 X 中沒有匹配的記錄。
FROM X
RIGHT JOIN Y
ON X.key = Y.key
WHERE X.key IS NULL;
範例
資料表employees
資料表departments
資料表locations
範例1:查詢每位員工的名字、部門名稱以及部門所在城市
SELECT employees.first_name, departments.department_name, locations.city
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id
INNER JOIN locations ON departments.location_id = locations.location_id;
範例2:查詢每位員工的名字、部門名稱,若部門為空,則顯示 "Unassigned"
SELECT employees.first_name,
COALESCE(departments.department_name, 'Unassigned') AS department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;
範例3:查詢所有部門名稱以及員工數,若沒有員工,則顯示 0 (不適用於 SQLite)
SELECT departments.department_name,
COUNT(employees.employee_id) AS employee_count
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id
GROUP BY departments.department_name;
範例4:查詢所有員工和部門,如果員工未分配部門或部門未分配員工,顯示 NULL
(不適用於 SQLite)
SELECT employees.first_name, departments.department_name
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.department_id;
謝謝您花時間將此篇文章讀完,若覺得對您有幫助可以幫忙按個讚、分享來或是珍藏喔!也歡迎Follow我的Threads,持續追蹤生產力工具、商業分析、商業英文的實用範例,提升自己的職場力喔!