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

你好,有抱负的SQL爱好者们!今天,我们将踏上一段激动人心的旅程,探索SQL左连接的世界。别担心如果你是编程新手;我将作为你友好的向导,一步一步地解释一切。那么,拿起一杯咖啡,让我们开始吧!

SQL - Left Join

外连接是什么?

在我们深入了解左连接之前,让我们先理解一下外连接是什么。想象你正在计划一个聚会,并且有两个列表:一个是你朋友的名字,另一个是他们喜欢的饮料。外连接就像是合并这些列表,即使有些朋友没有指定他们喜欢的饮料,或者有些饮料没有被分配给任何朋友。

在SQL术语中,外连接允许我们基于相关列合并两个或多个表的行,即使其中一个表没有匹配项。有三种类型的外连接:

连接类型 描述
左连接 返回左表的所有行和右表的匹配行
右连接 返回右表的所有行和左表的匹配行
完全外连接 当左表或右表有匹配时返回所有行

在这个教程中,我们将专注于左连接,这是最常用的外连接。

SQL 左连接

左连接返回左表(查询中提到的第一个表)的所有记录和右表的匹配记录。如果没有匹配项,结果是右边的NULL。

让我们来看一个例子。假设我们有两个表:Students(学生)和Courses(课程)。

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

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

-- 课程表
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 Basics
Bob Advanced 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 Basics Prof. Smith
Bob Advanced 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的瑞士军刀——多功能、有用,并且在你需要时总是在那里。

记住,掌握SQL的关键是练习。所以,不要害怕尝试不同的查询和表结构。快乐编码,愿你的连接总是成功!

Credits: Image by storyset