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
操作,了解了不同類型的 JOIN
(INNER JOIN
、LEFT JOIN
、RIGHT JOIN
、FULL JOIN
和 CROSS JOIN
),並學會如何將來自不同資料表的數據進行關聯查詢。理解 JOIN
操作是處理複雜查詢和資料分析的基礎。明天我們將學習如何使用索引來優化查詢性能。