📜  使用联合子句的 SQL 完全外部联接(1)

📅  最后修改于: 2023-12-03 15:22:26.417000             🧑  作者: Mango

使用联合子句的 SQL 完全外部连接

在 SQL 中,完全外部连接是一种连接两个表中所有行的方法,无论它们是否满足连接条件。 使用联合子句和其他 SQL 命令可以执行此操作。

语法

以下是使用联合子句进行完全外部连接的语法:

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
UNION
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name
WHERE table2.column_name IS NULL
UNION
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name
WHERE table1.column_name IS NULL;
解释

以上 SQL 查询使用了联合子句和三个子查询。 它连接了两个表,并在其中一个表中查找不符合连接条件的行。

第一个子查询使用 FULL OUTER JOIN 连接两个表,并选择所有列。

第二个子查询使用 LEFT JOIN 连接两个表,并查找不在右表中的行。 该查询使用 WHERE 语句来查找右表中匹配行不存在的行。这个子查询必须使用 UNION,而不是 UNION ALL,以避免重复的行。

第三个子查询与第二个子查询相似。它使用 RIGHT JOIN 连接两个表,并查找不在左表中的行。

最终结果是三个子查询的联合结果,并执行去重操作,以避免重复的行。

示例

假设我们有两个表:一个存储客户的订单,另一个存储客户的收货地址。 我们想查找那些没有任何订单或没有任何收货地址的客户。

客户订单表格

| customer_id | customer_name | | ----------- | ------------- | | 1 | John Smith | | 2 | Jane Doe | | 3 | Bob Johnson |

客户地址表格

| customer_id | address | | ----------- | -------------------- | | 1 | 123 Main St | | 3 | 456 Elm St | | 4 | 789 Oak St |

下面是 SQL 查询,返回没有订单或收货地址的客户:

SELECT COALESCE(orders.customer_id, addresses.customer_id) AS customer_id,
       orders.customer_name,
       address
FROM   orders
       FULL OUTER JOIN addresses
                    ON orders.customer_id = addresses.customer_id
WHERE  orders.customer_id IS NULL
        OR addresses.customer_id IS NULL;

查询结果如下:

| customer_id | customer_name | address | | ----------- | ------------- | -------------- | | 2 | Jane Doe | NULL | | 4 | NULL | 789 Oak St |

结论

完全外部连接在 SQL 中是非常有用的,因为它允许您连接两个表中的所有行,而不管它们是否满足连接条件。 使用联合子句和其他 SQL 命令,可以轻松地执行此操作,从而提高 SQL 数据库的功能和效率。