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

本文学习如何使用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_namedepartment_name
Bette NicholsonSales
Christian GableSales
Joe SwankMarketing
Fred CostnerHR
Sandra KilmerIT
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_namedepartment_name
Julia Mcqueen

总结

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值