九月 1, 2023
摘要:在本教程中,您将学习如何使用 PostgreSQL 的FULL OUTER JOIN
从两个或多个表中查询数据。
目录
PostgreSQL FULL OUTER JOIN 简介
假设您要执行表 A 和表 B 的完全外连接。以下说明了FULL OUTER JOIN
语法:
SELECT * FROM A
FULL [OUTER] JOIN B on A.id = B.id;
在此语法中,OUTER
关键字是可选的。
完全外连接结合了左连接和右连接的结果。
如果连接表中的行不匹配,则完全外连接会为表中没有匹配行的每一列设置 NULL 值。
如果一个表中的一行与另一个表中的行匹配,则结果行将包含由两个表中的行列填充的列。
下面的维恩图说明了FULL OUTER JOIN
操作:
结果包括两个表中的匹配行以及不匹配的行。
PostgreSQL FULL OUTER JOIN 示例
首先,创建两个新表用于演示:employees
和departments
:
DROP TABLE IF EXISTS departments;
DROP TABLE IF EXISTS employees;
CREATE TABLE departments (
department_id serial PRIMARY KEY,
department_name VARCHAR (255) NOT NULL
);
CREATE TABLE employees (
employee_id serial PRIMARY KEY,
employee_name VARCHAR (255),
department_id INTEGER
);
每个部门有零个或多个员工,每个员工属于零个或一个部门。
其次,将一些示例数据插入到departments
和employees
表中。
INSERT INTO departments (department_name)
VALUES
('Sales'),
('Marketing'),
('HR'),
('IT'),
('Production');
INSERT INTO employees (
employee_name,
department_id
)
VALUES
('Bette Nicholson', 1),
('Christian Gable', 1),
('Joe Swank', 2),
('Fred Costner', 3),
('Sandra Kilmer', 4),
('Julia Mcqueen', NULL);
第三步,从departments
和employees
表中查询数据:
SELECT * FROM departments;
SELECT * FROM employees;
第四步,使用FULL OUTER JOIN
从employees
和departments
表中查询数据。
SELECT
employee_name,
department_name
FROM
employees e
FULL OUTER JOIN departments d
ON d.department_id = e.department_id;
结果集包括属于某个部门的每个员工以及拥有该员工的每个部门。此外,它还包括不属于某个部门的每个员工以及没有员工的每个部门。
要查找没有任何员工的部门,请使用 WHERE 子句,如下所示:
SELECT
employee_name,
department_name
FROM
employees e
FULL OUTER JOIN departments d
ON d.department_id = e.department_id
WHERE
employee_name IS NULL;
结果显示Production
部门没有任何员工。
要查找不属于任何部门的员工,请检查WHERE
子句中的department_name
列值为NULL
,如下所示:
SELECT
employee_name,
department_name
FROM
employees e
FULL OUTER JOIN departments d ON d.department_id = e.department_id
WHERE
department_name IS NULL;
从输出中可以清楚地看到, Juila Mcqueen
不属于任何部门。
在本教程中,您学习了如何使用 PostgreSQL 的FULL OUTER JOIN
子句连接两个或多个表。