📜  PostgreSQL – 加入

📅  最后修改于: 2022-05-13 01:57:15.872000             🧑  作者: Mango

PostgreSQL – 加入

PostgreSQL Join 语句用于根据它们之间的公共字段组合来自一个(自联接)或多个表的数据或行。这些常用字段一般是第一张表的主键和其他表的外键。
PostgreSQL 支持 4 种基本类型的连接,即:

  1. 内部联接
  2. 左加入
  3. 右加入
  4. 全外连接

一些特殊的 PostgreSQL 连接如下:

  • 自然连接
  • 交叉连接
  • 自加入

让我们看看 PostgreSQL 中的 4 个基本连接。 为了本文,我们将在我们的 psql shell 中使用以下命令设置一个示例数据库:

  • 创建一个数据库动物园。
    CREATE DATABASE zoo;
  • 创建表zoo_1。
    CREATE TABLE zoo_1 (
        id INT PRIMARY KEY,
        animal VARCHAR (100) NOT NULL
    );
  • 创建表zoo_2。
    CREATE TABLE zoo_2 (
        id INT PRIMARY KEY,
        animal VARCHAR (100) NOT NULL
    );
  • 将数据插入 zoo_1 表。
    INSERT INTO zoo_1(id, animal)
    VALUES
        (1, 'Lion'),
        (2, 'Tiger'),
        (3, 'Wolf'),
        (4, 'Fox');
  • 将数据插入 zoo_2 表。
    INSERT INTO zoo_2(id, animal)
    VALUES
        (1, 'Tiger'),
        (2, 'Lion'),
        (3, 'Rhino'),
        (4, 'Panther');

现在,我们有两个表 zoo_1 和 zoo_2,其中包含两种常见动物和四种不同动物。我们还假设 zoo_1 是左表。

内部联接

下面的语句使用“animal”列中的值将左表与右表连接起来:



SELECT
    zoo_1.id id_a,
    zoo_1.animal animal_a,
    zoo_2.id id_b,
    zoo_2.animal animal_b
FROM
    zoo_1 
INNER JOIN zoo_2 ON zoo_1.animal = zoo_2.animal;

输出:

如上面的输出所示,内连接返回一个结果集,该结果集包含与右表中的行匹配的左表中的行。

INNER JOIN 的维恩图如下:

左加入

下面的语句使用左连接(或左外连接)将左表与右表连接起来:

SELECT
    zoo_1.id,
    zoo_1.animal,
    zoo_2.id,
    zoo_2.animal
FROM
    zoo_1
LEFT JOIN zoo_2 ON zoo_1.animal = zoo_2.animal;

输出:

如上面的输出所示,左连接从左表返回一组完整的行,如果右表中的匹配行可用。如果没有匹配,右侧将有空值。

LEFT JOIN 的维恩图如下:

右加入

RIGHT JOIN 或 RIGHT OUTER JOIN 的工作方式与 LEFT JOIN 完全相反。它从右表返回一组完整的行以及匹配的行(如果从左表可用)。如果没有匹配项,左侧将有空值。



下面的语句使用右连接(或右外连接)将右表与左表连接起来:

SELECT
    zoo_1.id,
    zoo_1.animal,
    zoo_2.id,
    zoo_2.animal
FROM
    zoo_1
RIGHT JOIN zoo_2 ON zoo_1.animal = zoo_2.animal;

输出:

RIGHT OUTER JOIN 的维恩图如下:

全外连接

全外连接或全连接返回一个结果集,该结果集包含来自左右表的所有行,以及来自两侧的匹配行(如果可用)。如果不匹配,则缺失的一侧包含空值。

以下语句说明了完整的外连接:

SELECT
    zoo_1.id,
    zoo_1.animal,
    zoo_2.id,
    zoo_2.animal
FROM
    zoo_1
FULL JOIN zoo_2 ON zoo_1.animal = zoo_2.animal;

输出:

FULL OUTER JOIN 的维恩图如下: