模块课程(3/4)
外连接:寻找“间隙”
在模块 3 中,您看到了 LEFT JOIN:将所有行保留在左侧,即使是那些
右侧没有匹配项(变成 NULL)。在本章中我们
使用 RIGHT JOIN 和 FULL OUTER JOIN 扩展工具包,我们了解到
如何使用它们来查找数据中的**“漏洞”**:一个表中的行
没有对方的对应物。
三种OUTER JOIN
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'è matchA RIGHT JOIN B 总是可以重写为 B LEFT JOIN A 具有相同的
ON:这是一个可读性问题。多种风格(包括本课程)
为了保持一致性,更喜欢始终使用 LEFT JOIN 。
“反连接”模式:找到缺失的部分
LEFT JOIN 最常见的用法不是“丰富
右”,但找到左侧没有匹配项的行
对。这称为反加入:
-- 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;模式逻辑:
LEFT JOIN附上每个产品的评论(如果有);- 对于没有评论的产品,所有
r列都是NULL; WHERE r.id IS NULL仅那些产品。
键检查:右侧表的 NOT NULL 列上的 id IS NULL
意思是*“没有匹配”*。你经常过滤右手的PK
表正是出于这个原因。
全外连接
FULL OUTER JOIN 保持 双方 双方不匹配。很少用,
通常用于数据完整性检查:
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 的客户是客户
没有命令。在我们的数据集上,外键保证没有孤儿
订单已存在;只剩下没有订单的顾客。
自己尝试一下
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 次尝试后可用的解决方案
复习练习
Trova i 客户非 hanno mai ordinato nulla。莫斯特拉电子邮件。 Ordina 每封电子邮件。
显示提示
Stesso 模式 dell'esercizio 先例,ma fra 客户 e 订单。
3 次尝试后可用的解决方案