在本教程中,您将学习如何使用sql full outer join
子句查询来自多个表的数据。
理论上,完全外连接是左连接和右连接的组合。 完整外连接包括连接表中的所有行,无论另一个表是否具有匹配的行。
如果连接表中的行不匹配,则完整外连接的结果集包含缺少匹配行的表的每列使用null
值。 对于匹配的行,结果集中包含从连接表填充列的行。
以下语句说明了两个表的完全外连接的语法:
select column_list
from a
full outer join b on b.n = a.n;
请注意,outer
关键字是可选的。
以下图说明了两个表的完整外连接。
让我们举一个使用full outer join
子句来看它是如何工作的例子。
首先,创建两个新表:用于演示的baskets
和fruits
表。 每个篮子存储零个或多个水果,每个水果可以存储在零个或一个篮子中。
-- 创建表1
create table fruits (
fruit_id integer primary key,
fruit_name varchar (255) not null,
basket_id integer
);
-- 创建表2
create table baskets (
basket_id integer primary key,
basket_name varchar (255) not null
);
其次,将一些样本数据插入到baskets
和fruits
表中。
-- 插入数据1
insert into baskets (basket_id, basket_name)
values
(1, 'a'),
(2, 'b'),
(3, 'c');
-- 插入数据2
insert into fruits (
fruit_id,
fruit_name,
basket_id
)
values
(1, 'apple', 1),
(2, 'orange', 1),
(3, 'banana', 2),
(4, 'strawberry', null);
第三,以下查询返回篮子中的每个水果和每个有水果的篮子,但也返回不在任何篮子中的每个水果和每个没有任何水果的篮子。
select
basket_name,
fruit_name
from
fruits
full outer join baskets on baskets.basket_id = fruits.basket_id;
执行上面示例代码,得到以下结果 -
basket_name | fruit_name
-------------+------------
a | apple
a | orange
b | banana
(null) | strawberry
c | (null)
如上所见,篮子c
没有任何水果,strawberry
不在任何篮子里。
您可以将where
子句添加到使用full outer join
子句的语句中以获取更具体的信息。
例如,要查找不存储任何水果的空篮子,请使用以下语句:
select
basket_name,
fruit_name
from
fruits
full outer join baskets on baskets.basket_id = fruits.basket_id
where
fruit_name is null;
执行上面示例代码,得到以下结果 -
basket_name | fruit_name
-------------+------------
c | (null)
(1 row)
同样,如果想查看哪个水果不在任何篮子中,请使用以下语句:
select
basket_name,
fruit_name
from
fruits
full outer join baskets on baskets.basket_id = fruits.basket_id
where
basket_name is null;
执行上面示例代码,得到以下结果 -
basket_name | fruit_name
-------------+------------
(null) | strawberry
(1 row)
在本教程中,我们演示了如何使用sql full outer join
子句来查询来自多个表的数据。