SQL - 全外連接:初學者的全面指南

您好,未來的 SQL 大師!我很高興能成為您在 SQL 全外連接世界中的引路人。作為一位具有多年經驗的計算機科學老師,我見過無數學生在掌握這個強大概念時眼睛發亮。那麼,我們就挽起袖子,開始吧!

SQL - Full Join

SQL 全外連接

什麼是全外連接?

想像一下,您正在計劃一個大型派對,並且有兩份客人名單:一份是您的朋友,另一份是您的家人。全外連接就像將這些名單合並起來,讓每個人都在名單上,即使他們只在一份名單上。在 SQL 的術語中,全外連接會返回兩個表的所行,無論是否存在匹配。

全外連接的語法

以下是一個全外連接的基本語法:

SELECT columns
FROM table1
FULL JOIN table2
ON table1.column = table2.column;

讓我們分解一下:

  • SELECT columns:指定您想在結果中看到的列。
  • FROM table1:這是您的第一個表。
  • FULL JOIN table2:這告訴 SQL 您想與第二個表進行全外連接。
  • ON table1.column = table2.column:這是您的連接條件,指定表之間是如何關聯的。

一個簡單的例子

假設我們有兩個表:EmployeesDepartments

-- 創建 Employees 表
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name VARCHAR(50),
DepartmentID INT
);

-- 創建 Departments 表
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY,
DepartmentName VARCHAR(50)
);

-- 插入一些數據
INSERT INTO Employees VALUES (1, 'Alice', 1), (2, 'Bob', 2), (3, 'Charlie', NULL);
INSERT INTO Departments VALUES (1, 'HR'), (2, 'IT'), (3, 'Finance');

-- 执行全外連接
SELECT e.Name, d.DepartmentName
FROM Employees e
FULL JOIN Departments d ON e.DepartmentID = d.DepartmentID;

這個查詢會返回:

Name DepartmentName
Alice HR
Bob IT
Charlie NULL
NULL Finance

注意 Charlie(未分配到任何部門)和 Finance(沒有員工)仍然包含在結果中。這就是全外連接的魔力!

使用全外連接連接多個表

現在,讓我們升級一個等級。如果我們想連接兩個以上的表呢?沒問題!全外連接也可以處理這種情況。

三個表的全外連接示例

讓我們在我們之前的例子中添加一個 Projects 表:

-- 創建 Projects 表
CREATE TABLE Projects (
ProjectID INT PRIMARY KEY,
ProjectName VARCHAR(50),
DepartmentID INT
);

-- 插入一些數據
INSERT INTO Projects VALUES (1, 'Website Redesign', 2), (2, 'Employee Survey', 1), (3, 'Cost Cutting', 3);

-- 执行三個表的全外連接
SELECT e.Name, d.DepartmentName, p.ProjectName
FROM Employees e
FULL JOIN Departments d ON e.DepartmentID = d.DepartmentID
FULL JOIN Projects p ON d.DepartmentID = p.DepartmentID;

這個查詢會給我們一個員工、他們的部門和相關項目的綜合視圖:

Name DepartmentName ProjectName
Alice HR Employee Survey
Bob IT Website Redesign
Charlie NULL NULL
NULL Finance Cost Cutting

這不是很棒嗎?我們只需一個查詢就可以看到整個圖像!就像為您的數據庫開啟了 X 光視力!

在全外連接中使用 WHERE 子句

有時候,我們想過濾我們的全外連接結果。這時,WHERE 子句就派上用場了。

過濾全外連接結果

讓我們修改我們之前的查詢,只顯示有項目的部門:

SELECT e.Name, d.DepartmentName, p.ProjectName
FROM Employees e
FULL JOIN Departments d ON e.DepartmentID = d.DepartmentID
FULL JOIN Projects p ON d.DepartmentID = p.DepartmentID
WHERE p.ProjectName IS NOT NULL;

這會給我們:

Name DepartmentName ProjectName
Alice HR Employee Survey
Bob IT Website Redesign
NULL Finance Cost Cutting

看見 Charlie 消失在我們的結果中嗎?那是因為他沒有與任何項目關聯。

處理 NULL 值

當使用全外連接時,您經常會遇到 NULL 值。這裡有一個專業提示:使用 COALESCE 來將 NULL 替換為默認值:

SELECT
COALESCE(e.Name, 'Unassigned') AS EmployeeName,
COALESCE(d.DepartmentName, 'No Department') AS DepartmentName,
COALESCE(p.ProjectName, 'No Project') AS ProjectName
FROM Employees e
FULL JOIN Departments d ON e.DepartmentID = d.DepartmentID
FULL JOIN Projects p ON d.DepartmentID = p.DepartmentID;

這會給我們一個更用戶友好的輸出:

EmployeeName DepartmentName ProjectName
Alice HR Employee Survey
Bob IT Website Redesign
Charlie No Department No Project
Unassigned Finance Cost Cutting

更好了,對嗎?現在,我們對整個組織有了清晰的認識,包括沒有部門的員工和沒有項目的部門。

結論

好了,各位!我們一起穿越了 SQL 全外連接的土地,從基本概念到更高级的技巧。記住,全外連接就像是包容的派對邀請——不管是否有匹配,每個人都受到歡迎。

當您練習這些概念時,您會發現全外連接是數據分析和報告的強大工具。它們讓您能看到數據的完整圖像,包括可能缺失的部分。

繼續實驗,繼續連接,最重要的是,繼續在 SQL 中玩得開心!在您意識到之前,您將成為團隊中的全外連接忍者。開心編程!

Credits: Image by storyset