SQL - 左联接與右联接:初学者的全面指南

你好,有抱负的SQL爱好者!我很高兴能成为你在这个激动人心的SQL联接世界中的向导。作为一位有着多年教学经验的计算机科学老师,我可以向你保证,掌握联接就像在数据库领域中解锁了一个超级能力。那么,让我们一起来揭开左联接和右联接的神秘面纱吧!

SQL - Left Join vs Right Join

理解联接:基础

在我们深入了解左联接和右联接的具体内容之前,让我们先快速回顾一下SQL中的联接是什么。想象你正在计划一个派对,并且有两份名单:一份是宾客的名字,另一份是他们喜欢的饮料。联接就像是神奇的魔杖,帮助你以各种方式组合这些名单,以获取你需要的信息。

左联接的工作原理

什么是左联接?

左联接就像是邀请名单上的每个人参加派对,不管你是否知道他们喜欢的饮料。它会返回左表(查询中首先提到的表)的所有记录,以及右表的匹配记录。

左联接语法

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

左联接示例

让我们创建两个简单的表来演示这一点:

CREATE TABLE Guests (
GuestID INT PRIMARY KEY,
GuestName VARCHAR(50)
);

CREATE TABLE Drinks (
DrinkID INT PRIMARY KEY,
GuestID INT,
FavoriteDrink VARCHAR(50)
);

INSERT INTO Guests (GuestID, GuestName) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie'),
(4, 'David');

INSERT INTO Drinks (DrinkID, GuestID, FavoriteDrink) VALUES
(1, 1, 'Mojito'),
(2, 2, 'Beer'),
(3, 3, 'Wine');

现在,让我们使用左联接来获取所有宾客和他们喜欢的饮料(如果知道的话):

SELECT Guests.GuestName, Drinks.FavoriteDrink
FROM Guests
LEFT JOIN Drinks ON Guests.GuestID = Drinks.GuestID;

结果:

GuestName FavoriteDrink
Alice Mojito
Bob Beer
Charlie Wine
David NULL

正如你所看到的,David 出现在结果中,尽管我们不知道他喜欢的饮料。这就是左联接的魔力!

右联接的工作原理

什么是右联接?

右联接就像是关注饮料名单,看看哪些宾客喜欢每种饮料。它会返回右表的所有记录,以及左表的匹配记录。

右联接语法

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

右联接示例

使用我们之前的表,让我们执行一个右联接:

SELECT Guests.GuestName, Drinks.FavoriteDrink
FROM Guests
RIGHT JOIN Drinks ON Guests.GuestID = Drinks.GuestID;

结果:

GuestName FavoriteDrink
Alice Mojito
Bob Beer
Charlie Wine

注意David没有出现在这个结果中,因为他没有列出喜欢的饮料。

左联接与右联接

现在我们已经看到了两种联接的实际应用,让我们将它们并排比较:

方面 左联接 右联接
关注点 所有来自左表(第一个表)的记录 所有来自右表(第二个表)的记录
NULL值 在右表列中,对于不匹配的记录 在左表列中,对于不匹配的记录
使用场景 当你想要主表的所有记录时 当你想要联接表的所有记录时
结果集大小 总是包含所有左表的记录 总是包含所有右表的记录

何时使用左联接与右联接

  1. 使用左联接当:
  • 你想要保留主表(左表)的所有记录。
  • 你对于右表不匹配的记录可以接受NULL值。
  1. 使用右联接当:
  • 你想要保留次表(右表)的所有记录。
  • 你对于左表不匹配的记录可以接受NULL值。

专业提示

在我多年的教学经验中,我注意到许多开发人员更喜欢使用左联接而不是右联接。为什么?因为它通常更容易阅读和理解。你可以总是通过简单地交换表顺序将右联接重写为左联接。所以,如果你发现右联接令人困惑,请随意坚持使用左联接!

实践练习

让我们通过一个有趣的练习来巩固我们的理解。想象你正在组织一个读书俱乐部。你有两个表:Members(会员)和Books(书籍)。

CREATE TABLE Members (
MemberID INT PRIMARY KEY,
MemberName VARCHAR(50)
);

CREATE TABLE Books (
BookID INT PRIMARY KEY,
MemberID INT,
BookTitle VARCHAR(100)
);

INSERT INTO Members (MemberID, MemberName) VALUES
(1, 'Emma'),
(2, 'James'),
(3, 'Sophia'),
(4, 'Oliver');

INSERT INTO Books (BookID, MemberID, BookTitle) VALUES
(1, 1, 'Pride and Prejudice'),
(2, 2, '1984'),
(3, 2, 'To Kill a Mockingbird'),
(4, 3, 'The Great Gatsby');

现在,尝试这些查询:

  1. 使用左联接获取所有会员及其书籍(如果有的话):
SELECT Members.MemberName, Books.BookTitle
FROM Members
LEFT JOIN Books ON Members.MemberID = Books.MemberID;
  1. 使用右联接获取所有书籍及其所有者(如果有的话):
SELECT Members.MemberName, Books.BookTitle
FROM Members
RIGHT JOIN Books ON Members.MemberID = Books.MemberID;

比较结果。你能发现不同之处吗?

结论

恭喜你!你刚刚掌握了SQL中的左联接和右联接的技巧。记住,熟能生巧,所以不要犹豫,在不同的场景中使用这些联接进行实验。

作为最后的思考,我总是告诉我的学生:“SQL联接就像拼图块。你玩得越多,就越擅长拼凑出数据的完整画面!”

愉快地查询,愿你的联接总是准确无误!

Credits: Image by storyset