PostgreSQL – 加入
PostgreSQL Join 语句用于根据它们之间的公共字段组合来自一个(自联接)或多个表的数据或行。这些常用字段一般是第一张表的主键和其他表的外键。
PostgreSQL 支持 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 的维恩图如下: