文章

PostgreSQL - 第 12 天 - 關聯式查詢 (JOIN)

課程簡介

關聯式查詢是 SQL 的一個強大功能,允許我們根據某些共同的欄位將來自不同資料表的數據進行結合。這樣可以讓我們更靈活地進行數據分析,並且避免將所有數據放在單一資料表中。


什麼是 JOIN?

JOIN 用於從多個表中查詢資料並將它們合併。基本上,JOIN 是根據表格中一個或多個欄位的關聯來進行的。PostgreSQL 支持幾種不同的 JOIN 類型,每種類型有不同的結合方式。

常見的 JOIN 類型包括:

  • INNER JOIN:返回兩個表中匹配的行。
  • LEFT JOIN(或 LEFT OUTER JOIN):返回左表的所有行,即使右表中沒有匹配的行。
  • RIGHT JOIN(或 RIGHT OUTER JOIN):返回右表的所有行,即使左表中沒有匹配的行。
  • FULL JOIN(或 FULL OUTER JOIN):返回兩個表中所有的行,不管是否有匹配。
  • CROSS JOIN:返回兩個表的笛卡爾積,所有行的組合。

INNER JOIN(內聯接)

INNER JOIN 是最常用的 JOIN 類型,它返回兩個表中匹配的行。如果某一行在左表或右表中沒有對應的行,那麼這行數據不會被返回。

語法

1
SELECT 欄位1, 欄位2, ... FROM 1 INNER JOIN 2 ON 1.欄位 = 2.欄位;

範例

假設我們有兩個表:

  • 員工 表:記錄員工資訊,包括 員工ID部門ID
  • 部門 表:記錄部門資訊,包括 部門ID部門名稱

要查詢所有員工的姓名及其所屬部門名稱,並只返回有匹配的部門的員工,可以使用 INNER JOIN

1
2
3
SELECT 員工.姓名, 部門.部門名稱
FROM 員工
INNER JOIN 部門 ON 員工.部門ID = 部門.部門ID;

這將返回所有有對應部門的員工姓名和部門名稱。


LEFT JOIN(左聯接)

LEFT JOIN 返回左表的所有行,即使右表中沒有匹配的行。如果右表中沒有匹配的行,則返回 NULL

語法

1
SELECT 欄位1, 欄位2, ... FROM 1 LEFT JOIN 2 ON 1.欄位 = 2.欄位;

範例

假設我們有一些員工沒有分配部門,使用 LEFT JOIN 查詢所有員工及其部門名稱,並且即使員工沒有部門也能顯示出來:

1
2
3
SELECT 員工.姓名, 部門.部門名稱
FROM 員工
LEFT JOIN 部門 ON 員工.部門ID = 部門.部門ID;

這將返回所有員工的姓名和部門名稱。如果員工沒有對應的部門,部門名稱 欄位會顯示為 NULL


RIGHT JOIN(右聯接)

RIGHT JOIN 返回右表的所有行,即使左表中沒有匹配的行。如果左表中沒有匹配的行,則返回 NULL

語法

1
SELECT 欄位1, 欄位2, ... FROM 1 RIGHT JOIN 2 ON 1.欄位 = 2.欄位;

範例

假設我們有一些部門沒有員工,使用 RIGHT JOIN 查詢所有部門及其員工姓名,並且即使部門沒有員工也能顯示出來:

1
2
3
SELECT 員工.姓名, 部門.部門名稱
FROM 員工
RIGHT JOIN 部門 ON 員工.部門ID = 部門.部門ID;

這將返回所有部門的名稱及其對應員工姓名。如果某部門沒有員工,姓名 欄位會顯示為 NULL


FULL JOIN(全聯接)

FULL JOIN 返回兩個表中所有的行,不管是否有匹配。如果某一行在一個表中沒有對應的行,則顯示 NULL

語法

1
SELECT 欄位1, 欄位2, ... FROM 1 FULL JOIN 2 ON 1.欄位 = 2.欄位;

範例

假設我們要查詢所有員工和部門的信息,無論是否有匹配的部門或員工,都會顯示出來:

1
2
3
SELECT 員工.姓名, 部門.部門名稱
FROM 員工
FULL JOIN 部門 ON 員工.部門ID = 部門.部門ID;

這將返回所有員工和所有部門。如果員工沒有對應的部門,部門名稱 會顯示為 NULL;如果部門沒有員工,姓名 會顯示為 NULL


CROSS JOIN(笛卡爾積)

CROSS JOIN 會返回兩個表的笛卡爾積,即所有行的組合。這通常用於生成所有可能的行組合,並不常用於日常查詢。

語法

1
SELECT 欄位1, 欄位2 FROM 1 CROSS JOIN 2;

範例

假設我們有兩個表,顏色 表和 形狀 表。使用 CROSS JOIN 查詢每一個顏色和形狀的所有組合:

1
2
3
SELECT 顏色.顏色名稱, 形狀.形狀名稱
FROM 顏色
CROSS JOIN 形狀;

這將返回每個顏色與每個形狀的所有可能組合。


本日總結

今天我們學習了 SQL 中的 JOIN 操作,了解了不同類型的 JOININNER JOINLEFT JOINRIGHT JOINFULL JOINCROSS JOIN),並學會如何將來自不同資料表的數據進行關聯查詢。理解 JOIN 操作是處理複雜查詢和資料分析的基礎。明天我們將學習如何使用索引來優化查詢性能。

本文章以 CC BY 4.0 授權