摘要:在本教程中,你将了解如何使用 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 示例
让我们举一个使用 FULL OUTER JOIN
子句的示例,看看它是如何工作的。
首先,创建两个新表:baskets
和 fruits
以进行演示。每个篮子中可以存储零个或多个水果,每个水果可以存储在零个或一个篮子中。
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)
其次,在 baskets
和 fruits
表中插入一些示例数据。
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 子句从多个表中查询数据。
本教程是否有用?