SQL - 左连接:初学者的全面指南
你好,有抱负的SQL爱好者们!今天,我们将踏上一段激动人心的旅程,探索SQL左连接的世界。别担心如果你是编程新手;我将作为你友好的向导,一步一步地解释一切。那么,拿起一杯咖啡,让我们开始吧!
外连接是什么?
在我们深入了解左连接之前,让我们先理解一下外连接是什么。想象你正在计划一个聚会,并且有两个列表:一个是你朋友的名字,另一个是他们喜欢的饮料。外连接就像是合并这些列表,即使有些朋友没有指定他们喜欢的饮料,或者有些饮料没有被分配给任何朋友。
在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;
这个查询首先连接 Students
和 Courses
,然后将结果与 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