MySQL 零基础教程

MySQL RIGHT JOIN

MySQL 中的 RIGHT JOIN(右连接)操作会返回右表中的所有行,即使在左表中没有匹配的行。对于右表中在左表没有匹配项的行,结果集将针对属于左表的所有列显示 NULL 值。

当查询的主要重点是检索特定“右”表中的所有数据,以及“左”表中的任何相关数据时,这种连接类型非常有用。

1. 理解 RIGHT JOIN 的机制

RIGHT JOIN(也称为 RIGHT OUTER JOIN)确保位于 JOIN 关键字右侧的表中指定的每一行都包含在结果集中。

  • 如果右表中的某一行根据连接条件在左表中有匹配的行,则会合并两个表中的列。
  • 如果右表中的某一行在左表中没有对应的匹配项,则结果集中该行的左表列将包含 NULL 值。

考虑一个包含两个表的场景:Employees(员工,左表)和 Departments(部门,右表)。基于 department_id 对这两个表进行 RIGHT JOIN 将列出所有部门,并且对于每个部门,它会显示属于该部门的员工。如果一个部门没有员工,它仍会出现在结果中,而特定于员工的列将显示为 NULL

2. RIGHT JOIN 的语法

RIGHT JOIN 的基本语法如下:

SELECT
    columns
FROM
    left_table
RIGHT JOIN
    right_table ON join_condition;
  • columns: 指定你要从两个表中检索的列。
  • left_table: 在 RIGHT JOIN 关键字之前指定的表。
  • right_table: 在 RIGHT JOIN 关键字之后指定的表。此表的所有行都将包含在结果中。
  • join_condition: 链接 left_tableright_table 之间行的条件,通常基于公共列(例如外键关系)。

3. 详细示例:员工与项目

想象一家公司使用两个表:Projects(项目)和 ProjectAssignments(项目分配)。

  • Projects: 存储不同项目的信息,包括 project_id(主键)和 project_name
  • ProjectAssignments: 记录分配给项目的员工,包括 assignment_id(主键)、project_id(引用 Projects 的外键)和 employee_id

让我们用一些样本数据填充这些表:

-- 创建 Projects 表
CREATE TABLE Projects (
    project_id INT PRIMARY KEY,
    project_name VARCHAR(100)
);

-- 插入数据
INSERT INTO Projects (project_id, project_name) VALUES
(101, 'Website Redesign'),
(102, 'Mobile App Development'),
(103, 'Database Migration'),
(104, 'Cloud Infrastructure Setup'),
(105, 'AI Research Project');

-- 创建 ProjectAssignments 表
CREATE TABLE ProjectAssignments (
    assignment_id INT PRIMARY KEY,
    project_id INT,
    employee_id INT
);

-- 插入数据
INSERT INTO ProjectAssignments (assignment_id, project_id, employee_id) VALUES
(1, 101, 1001),
(2, 101, 1002),
(3, 102, 1003),
(4, 104, 1001);

现在,让我们执行一个 RIGHT JOIN 来查看所有项目以及与之相关的任何分配。我们希望确保所有项目都被列出,即使它们目前没有分配任何人。

SELECT
    P.project_name,
    PA.employee_id
FROM
    ProjectAssignments AS PA  -- 这是左表
RIGHT JOIN
    Projects AS P ON PA.project_id = P.project_id; -- 这是右表,我们要保留它的所有行

在这个查询中:

  • ProjectAssignments 是左表 (PA)。
  • Projects 是右表 (P)。
project_nameemployee_id
Website Redesign1001
Website Redesign1002
Mobile App Development1003
Cloud Infrastructure Setup1001
Database MigrationNULL
AI Research ProjectNULL

结果显示了所有的项目名称。对于像 'Database Migration'(ID 103)和 'AI Research Project'(ID 105)这样在 ProjectAssignments 中没有条目的项目,来自 ProjectAssignmentsemployee_id 列将显示 NULL

4. 实际应用场景:查找无关联数据

就像 LEFT JOIN 一样,RIGHT JOIN 经常与 WHERE 子句结合使用,以查找右表中在左表中没有匹配项的记录。

继续使用上面的项目示例,如果我们想找出没有分配任何员工的项目

SELECT
    P.project_name
FROM
    ProjectAssignments AS PA  -- 左表
RIGHT JOIN
    Projects AS P ON PA.project_id = P.project_id -- 右表
WHERE
    PA.assignment_id IS NULL; -- 过滤出左表没有匹配上的记录

这里,WHERE PA.assignment_id IS NULL 充当了一个过滤器。由于我们进行了右连接,没有分配记录的项目会在 PA 表的所有列上产生 NULL。通过检查左表主键是否为 NULL,我们就能精确地提取出那些尚未开始的项目。