SQL FULL OUTER JOIN

摘要:在本教程中,你将了解如何使用 SQL FULL OUTER JOIN 子句从多个表中查询数据。

SQL FULL OUTER JOIN 子句简介

理论上,全外连接是一个 左连接右连接 的结合。全外连接包括来自连接表的全部行,无论其他表是否有匹配行。

如果连接表中的行不匹配,则全外连接的结果集会为缺少匹配行的表中的每列包含 NULL 值。对于匹配行,结果集中会包含根据连接表填充列的单行。

以下语句说明了两个表全外连接的语法

SELECT column_list
FROM A
FULL OUTER JOIN B ON B.n = A.n;Code language: SQL (Structured Query Language) (sql)

请注意,OUTER 关键字是可选的。

以下维恩图说明了两个表的全外连接。

SQL FULL OUTER JOIN

SQL FULL OUTER JOIN 示例

让我们举一个使用 FULL OUTER JOIN 子句的示例,看看它是如何工作的。

首先,创建两个新表basketsfruits 以进行演示。每个篮子中可以存储零个或多个水果,每个水果可以存储在零个或一个篮子中。

CREATE TABLE fruits (
	fruit_id INTEGER PRIMARY KEY,
	fruit_name VARCHAR (255) NOT NULL,
	basket_id INTEGER
);Code language: SQL (Structured Query Language) (sql)
CREATE TABLE baskets (
	basket_id INTEGER PRIMARY KEY,
	basket_name VARCHAR (255) NOT NULL
);Code language: SQL (Structured Query Language) (sql)

其次,basketsfruits 表中插入一些示例数据

INSERT INTO baskets (basket_id, basket_name)
VALUES
	(1, 'A'),
	(2, 'B'),
	(3, 'C');
Code language: SQL (Structured Query Language) (sql)
INSERT INTO fruits (
	fruit_id,
	fruit_name,
	basket_id
)
VALUES
	(1, 'Apple', 1),
	(2, 'Orange', 1),
	(3, 'Banana', 2),
	(4, 'Strawberry', NULL);Code language: SQL (Structured Query Language) (sql)

第三,以下查询会返回每个在篮子中的水果和每个有水果的篮子,同时还会返回每个不在篮子中的水果和每个没有水果的篮子。

SELECT
	basket_name,
	fruit_name
FROM
	fruits
FULL OUTER JOIN baskets ON baskets.basket_id = fruits.basket_id;Code language: SQL (Structured Query Language) (sql)
 basket_name | fruit_name
-------------+------------
 A           | Apple
 A           | Orange
 B           | Banana
 (null)      | Strawberry
 C           | (null)Code language: SQL (Structured Query Language) (sql)

如你所见,篮子 C 中没有水果,草莓 也不在任何篮子中。

你可以在使用 FULL OUTER JOIN 子句的语句中添加一个 WHERE 子句 以获得更具体的信息。

例如,要查找不存储任何水果的空篮子,可以使用以下语句

SELECT
	basket_name,
	fruit_name
FROM
	fruits
FULL OUTER JOIN baskets ON baskets.basket_id = fruits.basket_id
WHERE
	fruit_name IS NULL;Code language: SQL (Structured Query Language) (sql)
 basket_name | fruit_name
-------------+------------
 C           | (null)
(1 row)Code language: SQL (Structured Query Language) (sql)

同样,若要查找不在任何篮子中的水果,可以使用以下语句

SELECT
	basket_name,
	fruit_name
FROM
	fruits
FULL OUTER JOIN baskets ON baskets.basket_id = fruits.basket_id
WHERE
	basket_name IS NULL;Code language: SQL (Structured Query Language) (sql)
 basket_name | fruit_name
-------------+------------
(null)       | Strawberry
(1 row)Code language: SQL (Structured Query Language) (sql)

在本教程中,我们展示了如何使用 SQL FULL OUTER JOIN 子句从多个表中查询数据。

本教程是否有用?