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

你好,有抱负的SQL爱好者们!我很高兴能成为你们在这个激动人心的SQL连接世界中的向导。作为一个教计算机科学多年的老师,我可以向你保证,掌握连接就像在数据库领域解锁了超能力。那么,让我们一起深入探讨左连接(Left Join)和右连接(Right Join)的奥秘吧!

SQL - Left Join vs Right Join

理解连接:基础知识

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

左连接的工作原理

什么是左连接?

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

左连接的语法

SELECT 列名(s)
FROM 表1
LEFT JOIN 表2
ON 表1.列名 = 表2.列名;

左连接示例

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

CREATE TABLE 宾客 (
宾客ID INT PRIMARY KEY,
宾客姓名 VARCHAR(50)
);

CREATE TABLE 饮料 (
饮料ID INT PRIMARY KEY,
宾客ID INT,
喜爱的饮料 VARCHAR(50)
);

INSERT INTO 宾客 (宾客ID, 宾客姓名) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie'),
(4, 'David');

INSERT INTO 饮料 (饮料ID, 宾客ID, 喜爱的饮料) VALUES
(1, 1, 'Mojito'),
(2, 2, '啤酒'),
(3, 3, '葡萄酒');

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

SELECT 宾客.宾客姓名, 饮料.喜爱的饮料
FROM 宾客
LEFT JOIN 饮料 ON 宾客.宾客ID = 饮料.宾客ID;

结果:

宾客姓名 喜爱的饮料
Alice Mojito
Bob 啤酒
Charlie 葡萄酒
David NULL

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

右连接的工作原理

什么是右连接?

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

右连接的语法

SELECT 列名(s)
FROM 表1
RIGHT JOIN 表2
ON 表1.列名 = 表2.列名;

右连接示例

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

SELECT 宾客.宾客姓名, 饮料.喜爱的饮料
FROM 宾客
RIGHT JOIN 饮料 ON 宾客.宾客ID = 饮料.宾客ID;

结果:

宾客姓名 喜爱的饮料
Alice Mojito
Bob 啤酒
Charlie 葡萄酒

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

左连接与右连接

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

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

何时使用左连接与右连接

  1. 使用左连接当:
  • 你想要保留主表(左表)的所有记录。
  • 你对右表不匹配的记录中有NULL值没问题。
  1. 使用右连接当:
  • 你想要保留次表(右表)的所有记录。
  • 你对左表不匹配的记录中有NULL值没问题。

技巧

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

实践练习

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

CREATE TABLE 成员 (
成员ID INT PRIMARY KEY,
成员姓名 VARCHAR(50)
);

CREATE TABLE 书籍 (
书籍ID INT PRIMARY KEY,
成员ID INT,
书名 VARCHAR(100)
);

INSERT INTO 成员 (成员ID, 成员姓名) VALUES
(1, 'Emma'),
(2, 'James'),
(3, 'Sophia'),
(4, 'Oliver');

INSERT INTO 书籍 (书籍ID, 成员ID, 书名) VALUES
(1, 1, '傲慢与偏见'),
(2, 2, '1984'),
(3, 2, '杀死一只知更鸟'),
(4, 3, '了不起的盖茨比');

现在,尝试以下查询:

  1. 左连接来获取所有成员和他们的书籍(如果有的话):
SELECT 成员.成员姓名, 书籍.书名
FROM 成员
LEFT JOIN 书籍 ON 成员.成员ID = 书籍.成员ID;
  1. 右连接来获取所有书籍和它们的主人(如果有的话):
SELECT 成员.成员姓名, 书籍.书名
FROM 成员
RIGHT JOIN 书籍 ON 成员.成员ID = 书籍.成员ID;

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

结论

恭喜你!你刚刚掌握了SQL中的左连接和右连接的艺术。记住,熟能生巧,所以不要犹豫,用不同的场景尝试这些连接。

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

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

Credits: Image by storyset