SQL - 左連接:初学者的全面指南

你好,有抱負的SQL愛好者!今天,我們將踏上一段令人興奮的旅程,探索SQL左連接的世界。別擔心如果你是編程新手;我將成為你的友好導遊,一步步解釋一切。所以,來一杯咖啡,我們一起來深入探討吧!

SQL - Left Join

外連接是什麼?

在我們深入左連接之前,讓我們先來了解什麼是外連接。想像你正在計劃一個派對,並且有兩個名單:一個是你的朋友的名字,另一個是他們喜歡的飲料。外連接就像是將這兩個名單合並,即使有些朋友沒有指定他們喜歡的飲料,或者有些飲料沒有分配給任何朋友。

在SQL術語中,外連接允許我們基於相關列合並兩個或多個表的行,即使其中一個表沒有匹配。有三种外連接類型:

連接類型 描述
左連接 返回左表的所有行和右表的匹配行
右連接 返回右表的所有行和左表的匹配行
完全外連接 在左表或右表有匹配時返回所有行

在本教程中,我們將專注於最常使用的左連接。

SQL 左連接

左連接返回左表(查詢中首先提到的表)的所有記錄和右表的匹配記錄。如果沒有匹配,結果在右側為NULL。

讓我們看一個例子。假設我們有兩個表:StudentsCourses

-- Students 表
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
Name VARCHAR(50)
);

INSERT INTO Students VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie');

-- Courses 表
CREATE TABLE Courses (
CourseID INT PRIMARY KEY,
CourseName VARCHAR(50),
StudentID INT
);

INSERT INTO Courses VALUES
(101, 'SQL基礎', 1),
(102, '高級SQL', 2),
(103, '數據分析', NULL);

現在,讓我們使用左連接來查看所有學生和他們的課程(如果有的話):

SELECT Students.Name, Courses.CourseName
FROM Students
LEFT JOIN Courses ON Students.StudentID = Courses.StudentID;

結果會像這樣:

Name CourseName
Alice SQL基礎
Bob 高級SQL
Charlie NULL

正如你所看到的,Charlie 出現在結果中,即使他沒有報名任何課程。這就是左連接的魔法!

使用左連接合並多個表

現在我們已經掌握了基本知識,讓我們加大難度。在現實世界中,你經常需要合並多於兩個表。別擔心;左連接會支持你!

讓我們在我們的例子中添加第三個表:Instructors

CREATE TABLE Instructors (
InstructorID INT PRIMARY KEY,
InstructorName VARCHAR(50),
CourseID INT
);

INSERT INTO Instructors VALUES
(201, 'Prof. Smith', 101),
(202, 'Dr. Johnson', 102),
(203, 'Ms. Williams', NULL);

現在,讓我們合並所有三個表以獲得學生、他們的課程和講師的綜合視圖:

SELECT Students.Name AS StudentName,
Courses.CourseName,
Instructors.InstructorName
FROM Students
LEFT JOIN Courses ON Students.StudentID = Courses.StudentID
LEFT JOIN Instructors ON Courses.CourseID = Instructors.CourseID;

這個查詢首先將 StudentsCourses 合並,然後將結果與 Instructors 合並。結果可能會像這樣:

StudentName CourseName InstructorName
Alice SQL基礎 Prof. Smith
Bob 高級SQL Dr. Johnson
Charlie NULL NULL

難道不是很容易就能將多個表的信息合並起來嗎?

左連接與 WHERE 子句

有時候,你可能想要過濾左連接的結果。這時 WHERE 子句就派上用場了。讓我們說我們想要找到所有沒有報名任何課程的學生:

SELECT Students.Name
FROM Students
LEFT JOIN Courses ON Students.StudentID = Courses.StudentID
WHERE Courses.CourseID IS NULL;

這個查詢會返回:

Name
Charlie

WHERE 子句過濾掉了所有 Courses.CourseID 不是 NULL 的行,從而只給我們沒有課程的學生。

記住,WHERE 子句在連接操作之後應用。如果你想在連接之前過濾右表,你應該使用 ON 子句。

結論

好了,各位!我們已經穿越了SQL左連接的土地,從基本概念到更先进的應用。左連接是你在SQL工具包中的非常強大的工具,它允許你在沒有完美匹配的情況下合並多個表的数据。

隨著你練習並獲得經驗,你會發現左連接變得習以為常。它就像瑞士軍刀一樣——多用途、有用,並且在你需要時總是隨身攜帶。

記住,掌握SQL的關鍵在於練習。所以,不要害怕嘗試不同的查詢和表結構。快樂編程,並愿你所有的連接都能成功!

Credits: Image by storyset