更新於 2024/10/02閱讀時間約 6 分鐘

SQL 解鎖 - JOIN (1)

上一篇我們介紹了SQL如何使用指定的條件,搭配的SELECT 和 FROM 來篩選資料。本篇我們來討論,如何將兩個或多個資料表中的資料結合在一起,根據欄位之間的邏輯關係來拼接、合併資料表。

JOIN

常見的 JOIN 類型包括 INNER JOINLEFT JOINRIGHT JOINFULL OUTER JOIN 等。我們以下圖介紹 JOIN 的及範例。

1. Area A (交集部分)

  • 範圍:圖中 A 部分代表兩個表中都有匹配的記錄,表示表 X 和表 Y 之間的交集部分。
  • SQL 語句
SELECT ... 
FROM X
INNER JOIN Y
ON X.key = Y.key;


2. Area A + B

  • 範圍:圖中 A + B 部分代表 X 表中的所有記錄,包括那些在表 Y 中沒有匹配的記錄(B 區域)。
  • SQL 語句
SELECT ...
FROM X
LEFT JOIN Y
ON X.key = Y.key;


  1. Area A + C
  • 範圍:圖中 A + C 部分代表 Y 表中的所有記錄,包括那些在表 X 中沒有匹配的記錄(C 區域)。
  • SQL 語句
SELECT ...
FROM X
RIGHT JOIN Y
ON X.key = Y.key;


4. Area A + B + C

  • 範圍:圖中 A + B + C 部分代表 X 表和 Y 表中的所有記錄,無論它們之間是否有匹配。未匹配的部分會顯示 NULL
  • SQL 語句
SELECT ...
FROM X
FULL OUTER JOIN Y
ON X.key = Y.key;


5. Area B

  • 範圍:圖中 B 部分代表在表 X 中有,但在表 Y 中沒有匹配的記錄。
  • SQL 語句
    SELECT ...
    FROM X
    LEFT JOIN Y
    ON X.key = Y.key
    WHERE Y.key IS NULL;
    解釋:此查詢會返回所有在表 X 中,但在表 Y 中沒有匹配的記錄。


6. Area C

  • 範圍:圖中 C 部分代表在表 Y 中有,但在表 X 中沒有匹配的記錄。
  • SQL 語句
    SELECT ...
    FROM X
    RIGHT JOIN Y
    ON X.key = Y.key
    WHERE X.key IS NULL;
    解釋:此查詢會返回所有在表 Y 中,但在表 X 中沒有匹配的記錄。



範例

資料表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,持續追蹤生產力工具、商業分析、商業英文的實用範例,提升自己的職場力喔!


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.