跳转到主要内容
模块 5 · 第 3 课(共 4)课程中的19/57~10 min
模块课程(3/4)

外连接:寻找“间隙”

在模块 3 中,您看到了 LEFT JOIN:将所有行保留在左侧,即使是那些 右侧没有匹配项(变成 NULL)。在本章中我们 使用 RIGHT JOIN 和 FULL OUTER JOIN 扩展工具包,我们了解到 如何使用它们来查找数据中的**“漏洞”**:一个表中的行 没有对方的对应物。

三种OUTER JOIN

SQL
A LEFT  JOIN B  ON …  -- tutte le righe di A, con o senza match in B
A RIGHT JOIN B  ON …  -- tutte le righe di B, con o senza match in A
A FULL  JOIN B  ON …  -- tutte le righe di A *e* di B; NULL dove non c'è match

A RIGHT JOIN B 总是可以重写为 B LEFT JOIN A 具有相同的 ON:这是一个可读性问题。多种风格(包括本课程) 为了保持一致性,更喜欢始终使用 LEFT JOIN 。

“反连接”模式:找到缺失的部分

LEFT JOIN 最常见的用法不是“丰富 右”,但找到左侧没有匹配项的行 对。这称为反加入:

SQL
-- Prodotti senza nessuna recensione:
SELECT p.id, p.name
FROM   products p
LEFT JOIN reviews r ON r.product_id = p.id
WHERE  r.id IS NULL
ORDER BY p.id;

模式逻辑:

  1. LEFT JOIN 附上每个产品的评论(如果有);
  2. 对于没有评论的产品,所有r列都是NULL;
  3. WHERE r.id IS NULL 仅那些产品。

键检查:右侧表的 NOT NULL 列上的 id IS NULL 意思是*“没有匹配”*。你经常过滤右手的PK 表正是出于这个原因。

全外连接

FULL OUTER JOIN 保持 双方 双方不匹配。很少用, 通常用于数据完整性检查:

SQL
SELECT c.id AS customer_id, o.id AS order_id
FROM   customers c
FULL OUTER JOIN orders o ON o.customer_id = c.id
WHERE  c.id IS NULL OR o.id IS NULL;

具有 c.id IS NULL 的行将是孤儿订单(customer_id customers 中不存在)。具有 o.id IS NULL 的客户是客户 没有命令。在我们的数据集上,外键保证没有孤儿 订单已存在;只剩下没有订单的顾客。

自己尝试一下

锻炼#sql.m5.l3.e1
尝试:0加载中...

Trova tutti i prodotti che non hanno mai Ricevuto una recensione。 Mostra Solo la colonna 的名字。奥迪娜的名字。

正在加载编辑器...
显示提示

模式反连接:LEFT JOIN 评论 su Product_id, poi WHERE r.id IS NULL。

3 次尝试后可用的解决方案

复习练习

锻炼#sql.m5.l3.e2
尝试:0加载中...

Trova i 客户非 hanno mai ordinato nulla。莫斯特拉电子邮件。 Ordina 每封电子邮件。

正在加载编辑器...
显示提示

Stesso 模式 dell'esercizio 先例,ma fra 客户 e 订单。

3 次尝试后可用的解决方案