首頁專案文章關於我

資料庫體驗營 #05 資料表合併

四種 JOIN 的用法

課程紀錄

新增日期:2025/12/30 17:30 (UTC+8)

更新日期:2025/12/30 18:02 (UTC+8)

資料庫體驗營 #05 資料表合併 文章主視覺

JOIN 資料關聯

JOIN 資料關聯 - 組合資料表關鍵語法

可將兩個資料表 (Table) 組合在一起

JOIN 語法種類

  • inner join
  • outer join : left join, right join, full join

範例資料

users 員工資料表

員工編號 id姓名 name薪資 salary部門編號 team_id FK
1張小明450001
2王大明480001
3李小華520002
4陳小玉550002
5林小豪470001
6陳小明42000null
7王小美41000null

teams 部門資料表

部門編號 id PK名稱 name
1開發部
2人事部
3行銷部
4研發部

inner join - 查詢有部門的員工

INNER JOIN 文氏圖

SELECT
  users.id, users.name AS user_name, users.salary,
  teams.name AS team_name
FROM users
INNER JOIN teams ON users.team_id = teams.id;

SQL 處理順序:「先進行 JOIN,然後在 SELECT 階段選取所需欄位」

員工編號 id PK姓名 name薪資 salary部門編號 team_id FK部門編號 id PK名稱 name
1張小明4500011開發部
2王大明4800011開發部
3李小華5200022人事部
4陳小玉5500022人事部
5林小豪4700011開發部

最終呈現結果

員工編號 iduser_namesalaryteam_name
1張小明45000開發部
2王大明48000開發部
3李小華52000人事部
4陳小玉55000人事部
5林小豪47000開發部

left join - 顯示未分配部門的員工資料

LEFT JOIN 文氏圖

SELECT
  users.name AS user_name,
  teams.name AS team_name
FROM users
LEFT JOIN teams ON users.team_id = teams.id;

SQL 處理順序:「先進行 JOIN,然後在 SELECT 階段選取所需欄位」

員工編號 id PK姓名 name薪資 salary部門編號 team_id FK部門編號 id PK名稱 name
1張小明4500011開發部
2王大明4800011開發部
3李小華5200022人事部
4陳小玉5500022人事部
5林小豪4700011開發部
6陳小明42000nullnullnull
7王小美41000nullnullnull

最終呈現結果

user_nameteam_name
張小明開發部
王大明開發部
李小華人事部
陳小玉人事部
林小豪開發部
陳小明null
王小美null

right join + 搭配 where 篩選空部門

RIGHT JOIN 文氏圖

SELECT
  teams.name AS team_name,
  users.name AS user_name
FROM users
RIGHT JOIN teams ON users.team_id = teams.id;

SQL 處理順序:「先進行 JOIN,然後在 SELECT 階段選取所需欄位」

員工編號 id PK姓名 name薪資 salary部門編號 team_id FK部門編號 id PK名稱 name
1張小明4500011開發部
2王大明4800011開發部
3李小華5200022人事部
4陳小玉5500022人事部
5林小豪4700011開發部
nullnullnullnull3行銷部
nullnullnullnull4研發部

最終呈現結果

user_nameteam_name
開發部張小明
開發部王大明
人事部李小華
人事部陳小玉
開發部林小豪
行銷部null
研發部null
SELECT
  teams.name AS team_name,
  users.name AS user_name
FROM users
RIGHT JOIN teams ON users.team_id = teams.id
WHERE users.name IS NULL;

最終呈現結果

user_nameteam_name
行銷部null
研發部null

full join - 部門配置與新進人員總覽

FULL JOIN 文氏圖

SELECT
  teams.name AS team_name,
  users.name AS user_name
FROM users
FULL JOIN teams ON users.team_id = teams.id;

SQL 處理順序:「先進行 JOIN,然後在 SELECT 階段選取所需欄位」

員工編號 id PK姓名 name薪資 salary部門編號 team_id FK部門編號 id PK名稱 name
1張小明4500011開發部
2王大明4800011開發部
3李小華5200022人事部
4陳小玉5500022人事部
5林小豪4700011開發部
6陳小明42000nullnullnull
7王小美41000nullnullnull
nullnullnullnull3行銷部
nullnullnullnull4研發部

最終呈現結果

user_nameteam_name
開發部張小明
開發部王大明
人事部李小華
人事部陳小玉
開發部林小豪
null陳小明
null王小美
行銷部null
研發部null

JOIN 搭配 COALESCE 設計

有些後端語言遇到 null 會出錯

SELECT
  COALESCE(teams.name, '未分配') AS team_name,
  COALESCE(users.name, '無員工') AS user_name
FROM users
FULL JOIN teams ON users.team_id = teams.id;

最終呈現結果

user_nameteam_name
開發部張小明
開發部王大明
人事部李小華
人事部陳小玉
開發部林小豪
未分配陳小明
未分配王小美
行銷部無員工
研發部無員工