Skip to main content
 首页 » 数据库

PostgreSQL 完全外连接(FULL OUTER JOIN) 教程

2022年07月19日154Leo_wl

本文学习如何使用PostgreSQL 完全外连接,从两个或多个表中查询数据。

完全外连接介绍

完全外连接合并左连接和右连接的结果。对于连接表不匹配的行,完全连接设置每一列的值为null 。如果一个表的行与另一个表匹配,那么结果将包含来自两个的相应列。

假设需要从A,B两个完全连接查询结果,语法如下:

SELECT * FROM A 
FULL [OUTER] JOIN B on A.id = B.id; 

其中 [OUTER] 关键字为可选的。下图使用韦恩图表示完全连接:
在这里插入图片描述
图1

其结果包括两个表匹配的记录,也包不匹配的记录。

完全外连接示例

我们创建两个示例表,employeesdepartments:

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 
); 

每个部门有0个或多个员工,每个员工属于0个或一个部门。下面插入一些示例数据:

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); 

我们指定如何使用内连接仅显示匹配的记录,同样左连接则丢失右边表的记录,右连接也一样。现在我们使用完全连接查询匹配和不匹配的记录:

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; 

返回结果:

employee_name department_name
Bette Nicholson Sales
Christian Gable Sales
Joe Swank Marketing
Fred Costner HR
Sandra Kilmer IT
Julia Mcqueen
Production

我们看到 Julia Mcqueen 没有部门,同时 Production 部门没有所属员工。如果仅查询没有部门的员工,可以增加where条件进行过滤:

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; 

返回结果:

employee_name department_name
Julia Mcqueen

总结

本文我们学习了完全连接查询,使用完全连接可以返回匹配记录和不匹配记录,避免信息丢失。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/120271193
阅读延展