SQL - 全外連接:初學者的全面指南
您好,未來的 SQL 大師!我很高興能成為您在 SQL 全外連接世界中的引路人。作為一位具有多年經驗的計算機科學老師,我見過無數學生在掌握這個強大概念時眼睛發亮。那麼,我們就挽起袖子,開始吧!
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
:這是您的連接條件,指定表之間是如何關聯的。
一個簡單的例子
假設我們有兩個表:Employees
和 Departments
。
-- 創建 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