SQL RIGHT JOIN

摘要:在本教程中,您将学习如何使用 SQL RIGHT JOIN 子句合并两个表中的行。

SQL RIGHT JOIN 子句简介 #

RIGHT JOINSELECT 语句的一个可选子句。RIGHT JOIN 子句允许您合并两个表中的行。

以下是 RIGHT JOIN 子句的语法:

SELECT
  column1,
  column2
FROM
  left_table
  RIGHT JOIN right_table ON condition;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

在此语法中:

  • 首先,在 FROM 子句中指定第一个表(left_table)。
  • 其次,在 RIGHT JOIN 子句中提供第二个表(right_table)。
  • 第三,在 ON 关键字后指定第一个表和第二个表之间行匹配的条件。

对于 right_table 中的每一行,RIGHT JOIN 会与 left_table 中的每一行检查条件。如果条件trueRIGHT JOIN 会将两个表中的两行合并为一行。

如果条件falseRIGHT JOIN 子句会将右表中的行与一个由 NULL 值填充的左表行合并成一个单行。换句话说,RIGHT JOIN 子句总是会包含右表中的所有行。

通常,您会使用等于运算符 (=) 来比较左右两个表的列之间的行。

SELECT
  column1,
  column2
FROM
  left_table
  RIGHT JOIN right_table ON right_table.column1 = left_table_column2;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

RIGHT JOINRIGHT OUTER JOIN 是相同的,因为 OUTER 关键字是可选的。

理解 SQL right join #

假设您有两个表:

  • X 表有两个列:id (键) 和 x
  • Y 表也有两列:id(键)和 y

右连接使用两个表中 id 列的值来匹配 X 表和 Y 表之间的行。

右连接包含右表(Y)中的所有行以及左表(X)中的匹配行;如果没有匹配的行,它将对左表(X)的列使用 null

sql right join visualization

下面的维恩图是说明右连接的另一种方式。

sql right join Venn diagram

基本的 SQL RIGHT JOIN 子句示例 #

假设我们有两个表:employeesdepartments

employees

employee_idnamedepartment_id
1Jane1
2Bob2
3MariaNULL

departments

department_iddepartment_name
1Sales
2市场营销

以下查询使用 RIGHT JOIN 子句从 employeesdepartments 表中检索员工 ID、姓名和部门名称。

SELECT
  employee_id,
  name,
  department_name
FROM
  departments
  RIGHT JOIN employees ON employees.department_id = departments.department_id;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

输出

 employee_id | name  | department_name
-------------+-------+-----------------
           1 | Jane  | Sales
           2 | Bob   | Marketing
           3 | Maria | NULLCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

查询工作原理

第 1 步RIGHT JOIN 子句检查 employees 表中的每一行。

行 #1 (department_id 1) 与 departments 表中的行 #1 (department_id 1) 匹配。RIGHT JOIN 子句将两个表中的行合并为一行。

employee_idnamedepartment_iddepartment_iddepartment_name
1Jane11Sales

行 #2 (department_id 2) 与 departments 表中的行 #2 (department_id 2) 匹配。RIGHT JOIN 子句将这两行合并为一个新行。

employee_idnamedepartment_iddepartment_iddepartment_name
2Bob22市场营销

行 #3 (department_id 为 NULL) 与 departments 表中的任何行都不匹配。RIGHT JOIN 包含 employees 表中的这一行,并为 departments 表的行所对应的列填充 NULL

employee_idnamedepartment_iddepartment_iddepartment_name
3MariaNULLNULLNULL

RIGHT JOIN 得出以下中间结果集:

employee_idnamedepartment_iddepartment_iddepartment_name
1Jane11Sales
2Bob22市场营销
3MariaNULLNULLNULL

第 2 步SELECT 子句从中间结果集中检索 employee_idnamedepartment_id,并返回以下最终结果集:

employee_idnamedepartment_id
1Jane1
2Bob2
3MariaNULL

使用表别名 #

当使用 RIGHT JOIN 子句将一个表与另一个表连接时,您可以使用表别名。例如:

SELECT
  employee_id,
  name,
  department_name
FROM
  departments d
  RIGHT JOIN employees e ON e.department_id = d.department_id;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

试一试

查找左表中不匹配的行 #

RIGHT JOIN 子句可以帮助使用以下查询模式在右表中查找不匹配的行:

SELECT
  column1,
  column2
FROM
  left_table
  RIGHT JOIN right_table ON right_table.column1 = left_table_column2
WHERE column2 IS NULL;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

WHERE 子句中的条件保留了 column2 列值为 NULL 的行。这些行在左表中没有匹配的行。

例如,您可以使用 RIGHT JOIN 子句来查找不属于任何部门的员工。

SELECT
  employee_id,
  name,
  department_name
FROM
  departments d
  RIGHT JOIN employees e ON e.department_id = d.department_id
WHERE
  department_name IS NULL;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

试一试

输出

 employee_id | name  | department_name
-------------+-------+-----------------
           3 | Maria | NULLCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

使用 RIGHT JOIN 子句连接两个表 #

我们将使用 HR 示例数据库中的 countrieslocations 表。

SQL RIGHT JOIN - countries & locations tables

以下查询使用 RIGHT JOIN 子句从 countrieslocations 表中检索 country_namecity

SELECT
  country_name,
  city
FROM
  locations l
  RIGHT JOIN countries c ON c.country_id = l.country_id
ORDER BY
  city,
  country_name;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

试一试

输出

       country_name       |        city
--------------------------+---------------------
 United Kingdom           | London
 Germany                  | Munich
 United Kingdom           | Oxford
 United States of America | Seattle
 United States of America | South San Francisco
 United States of America | Southlake
 Canada                   | Toronto
 Argentina                | NULL
 Australia                | NULL
...Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

结果集包括所有的国家名称(来自 countries 表)和城市(来自 locations 表)。对于在 locations 表中没有城市的国家,城市为 NULL

使用 RIGHT JOIN 子句连接三个表 #

这里是来自 HR 示例数据库的三个表:regionscountrieslocations

SQL LEFT JOIN - Joining three tables

以下查询使用 RIGHT JOIN 子句从这三个表中检索数据。

SELECT
  region_name,
  country_name,
  city
FROM
  locations l
  RIGHT JOIN countries c ON c.country_id = l.country_id
  RIGHT JOIN regions r ON r.region_id = c.region_id
ORDER BY
  region_name;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

试一试

输出

      region_name       |       country_name       |        city
------------------------+--------------------------+---------------------
 Americas               | United States of America | South San Francisco
 Americas               | United States of America | Southlake
 Americas               | Mexico                   | NULL
 Americas               | Canada                   | Toronto
 Americas               | Brazil                   | NULL
 Americas               | United States of America | Seattle
 Americas               | Argentina                | NULL
 Asia                   | Australia                | NULL
 Asia                   | HongKong                 | NULL
...Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

摘要 #

  • 使用 RIGHT JOIN 子句来选择行以合并两个表中的数据。RIGHT JOIN 子句总是在结果集中包含右表的所有行。
  • 使用 RIGHT JOIN 子句来查找右表中不匹配的行。

测验 #

数据库 #

本教程是否有帮助?
© .