📚 目录

  1. 概述
  2. 连接的类型
  3. 内连接 (INNER JOIN)
  4. 左连接 (LEFT JOIN)
  5. 右连接 (RIGHT JOIN)
  6. 全连接 (FULL JOIN)
  7. 交叉连接 (CROSS JOIN)
  8. 自连接 (SELF JOIN)
  9. 连接条件与 ON 子句
  10. 参考资料

🛠️ 概述

在 PostgreSQL 中,连接(JOIN)是将两个或更多的表组合成一个结果集的操作。通过连接操作,我们可以将多个表中的数据关联在一起,通常用于获取与查询条件相关的数据。连接操作的类型根据需要连接的表之间的关系和返回的结果有所不同。


📝 连接的类型

PostgreSQL 支持几种常见的连接类型,每种连接方式有不同的应用场景:

  • INNER JOIN:只返回两个表中满足连接条件的记录。
  • LEFT JOIN:返回左表中的所有记录,以及右表中符合连接条件的记录,如果右表没有匹配,则返回 NULL
  • RIGHT JOIN:返回右表中的所有记录,以及左表中符合连接条件的记录,如果左表没有匹配,则返回 NULL
  • FULL JOIN:返回左表和右表中所有的记录,如果某一边没有匹配,则返回 NULL
  • CROSS JOIN:返回左表和右表的笛卡尔积,即每一行左表记录与右表的所有行组合。
  • SELF JOIN:表与自身连接,通常用于处理层级或递归关系。

🔢 内连接 (INNER JOIN)

INNER JOIN 只返回两个表中符合连接条件的记录。如果某一边没有匹配的行,则该行不会出现在结果中。

示例(查询员工和他们所在部门的名称):

SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;

此查询将返回所有员工及其部门名称,只有那些有部门的员工才会出现在结果中。


🔢 左连接 (LEFT JOIN)

LEFT JOIN 返回左表中的所有记录,以及右表中满足连接条件的记录。如果右表中没有匹配的记录,则会返回 NULL

示例(查询所有员工及其部门名称,包括没有部门的员工):

SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

此查询将返回所有员工和他们的部门名称。如果某个员工没有部门,那么部门名称将是 NULL


🔢 右连接 (RIGHT JOIN)

RIGHT JOIN 返回右表中的所有记录,以及左表中满足连接条件的记录。如果左表中没有匹配的记录,则会返回 NULL

示例(查询所有部门及其员工名称,包括没有员工的部门):

SELECT d.department_name, e.name
FROM departments d
RIGHT JOIN employees e ON e.department_id = d.department_id;

此查询将返回所有员工和他们的部门名称。如果某个部门没有员工,员工名称将是 NULL


🔢 全连接 (FULL JOIN)

FULL JOIN 返回左表和右表中的所有记录。如果某一边没有匹配,则返回 NULL

示例(查询所有员工和所有部门,即使某些员工没有部门或某些部门没有员工):

SELECT e.name, d.department_name
FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id;

此查询将返回所有员工和所有部门。如果某个员工没有部门,部门名称将是 NULL,反之亦然。


🔢 交叉连接 (CROSS JOIN)

CROSS JOIN 返回左表和右表的笛卡尔积,即每一行左表记录都会与右表的所有行组合,结果集的大小是两个表行数的乘积。

示例(返回所有员工和所有部门的组合):

SELECT e.name, d.department_name
FROM employees e
CROSS JOIN departments d;

此查询将返回所有员工和所有部门的组合,每个员工会与每个部门匹配。


🔢 自连接 (SELF JOIN)

SELF JOIN 是表与自身的连接,通常用于处理层级关系或递归结构(例如员工与上级的关系)。

示例(查询每个员工和其直属上级的姓名):

SELECT e.name AS employee_name, m.name AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;

此查询返回每个员工和他们的直属上级的姓名。如果某个员工没有直属上级,则会显示 NULL


🔄 连接条件与 ON 子句

在所有连接类型中,都需要定义连接条件,通常通过 ON 子句来指定。在 INNER JOINLEFT JOINRIGHT JOINFULL JOIN 等连接中,ON 子句用于指定表之间如何进行匹配。

示例(通过 ON 子句指定连接条件):

SELECT e.name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

在这个查询中,ON e.department_id = d.department_id 是连接条件,它定义了 employees 表和 departments 表如何通过 department_id 进行连接。


📘 参考资料