SQL - 左連接:初学者的全面指南
你好,有抱負的SQL愛好者!今天,我們將踏上一段令人興奮的旅程,探索SQL左連接的世界。別擔心如果你是編程新手;我將成為你的友好導遊,一步步解釋一切。所以,來一杯咖啡,我們一起來深入探討吧!
外連接是什麼?
在我們深入左連接之前,讓我們先來了解什麼是外連接。想像你正在計劃一個派對,並且有兩個名單:一個是你的朋友的名字,另一個是他們喜歡的飲料。外連接就像是將這兩個名單合並,即使有些朋友沒有指定他們喜歡的飲料,或者有些飲料沒有分配給任何朋友。
在SQL術語中,外連接允許我們基於相關列合並兩個或多個表的行,即使其中一個表沒有匹配。有三种外連接類型:
連接類型 | 描述 |
---|---|
左連接 | 返回左表的所有行和右表的匹配行 |
右連接 | 返回右表的所有行和左表的匹配行 |
完全外連接 | 在左表或右表有匹配時返回所有行 |
在本教程中,我們將專注於最常使用的左連接。
SQL 左連接
左連接返回左表(查詢中首先提到的表)的所有記錄和右表的匹配記錄。如果沒有匹配,結果在右側為NULL。
讓我們看一個例子。假設我們有兩個表:Students
和 Courses
。
-- 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;
這個查詢首先將 Students
與 Courses
合並,然後將結果與 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