摘要:在本教程中,您将学习如何使用 SQL RIGHT JOIN 子句合并两个表中的行。
SQL RIGHT JOIN 子句简介 #
RIGHT JOIN 是 SELECT 语句的一个可选子句。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 中的每一行检查条件。如果条件为 true,RIGHT JOIN 会将两个表中的两行合并为一行。
如果条件为 false,RIGHT 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 JOIN 和 RIGHT OUTER JOIN 是相同的,因为 OUTER 关键字是可选的。
理解 SQL right join #
假设您有两个表:
X表有两个列:id(键) 和x。Y表也有两列:id(键)和y。
右连接使用两个表中 id 列的值来匹配 X 表和 Y 表之间的行。
右连接包含右表(Y)中的所有行以及左表(X)中的匹配行;如果没有匹配的行,它将对左表(X)的列使用 null。
下面的维恩图是说明右连接的另一种方式。
基本的 SQL RIGHT JOIN 子句示例 #
假设我们有两个表:employees 和 departments。
employees 表
| employee_id | name | department_id |
|---|---|---|
| 1 | Jane | 1 |
| 2 | Bob | 2 |
| 3 | Maria | NULL |
departments 表
| department_id | department_name |
|---|---|
| 1 | Sales |
| 2 | 市场营销 |
以下查询使用 RIGHT JOIN 子句从 employees 和 departments 表中检索员工 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_id | name | department_id | department_id | department_name |
|---|---|---|---|---|
| 1 | Jane | 1 | 1 | Sales |
行 #2 (department_id 2) 与 departments 表中的行 #2 (department_id 2) 匹配。RIGHT JOIN 子句将这两行合并为一个新行。
| employee_id | name | department_id | department_id | department_name |
|---|---|---|---|---|
| 2 | Bob | 2 | 2 | 市场营销 |
行 #3 (department_id 为 NULL) 与 departments 表中的任何行都不匹配。RIGHT JOIN 包含 employees 表中的这一行,并为 departments 表的行所对应的列填充 NULL。
| employee_id | name | department_id | department_id | department_name |
|---|---|---|---|---|
| 3 | Maria | NULL | NULL | NULL |
RIGHT JOIN 得出以下中间结果集:
| employee_id | name | department_id | department_id | department_name |
|---|---|---|---|---|
| 1 | Jane | 1 | 1 | Sales |
| 2 | Bob | 2 | 2 | 市场营销 |
| 3 | Maria | NULL | NULL | NULL |
第 2 步:SELECT 子句从中间结果集中检索 employee_id、name 和 department_id,并返回以下最终结果集:
| employee_id | name | department_id |
|---|---|---|
| 1 | Jane | 1 |
| 2 | Bob | 2 |
| 3 | Maria | NULL |
使用表别名 #
当使用 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 示例数据库中的 countries 和 locations 表。

以下查询使用 RIGHT JOIN 子句从 countries 和 locations 表中检索 country_name 和 city。
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 示例数据库的三个表:regions、countries 和 locations。

以下查询使用 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子句来查找右表中不匹配的行。
测验 #
数据库 #
- PostgreSQL RIGHT JOIN 子句
- MySQL RIGHT JOIN 子句
- SQLite RIGHT JOIN 子句
- Db2 RIGHT JOIN 子句
- Oracle RIGHT JOIN 子句
- SQL Server RIGHT JOIN 子句