LEFT JOIN 保留没有订单的客户
统计每个客户的已支付金额,同时保留没有订单的 Guido。
常见做法先查客户再逐个查询订单容易产生 N+1 查询。
把 o.status 条件放在 WHERE 中会排除空匹配行;一对多 JOIN 会扩大行数,聚合前先确认粒度。
SELECT c.name, COALESCE(SUM(o.amount), 0) AS paid_total
FROM customers AS c
LEFT JOIN orders AS o
ON o.customer_id = c.id AND o.status = 'paid'
GROUP BY c.id, c.name
ORDER BY c.id;示例结果
| name | paid_total |
|---|---|
| Ada | 200.00 |
| Linus | 50.00 |
| Grace | 150.00 |
| Guido | 0.00 |
动手练习
统计每个客户的已支付订单数量,包括 0 笔。
查看参考答案 +
把 SUM(o.amount) 换成 COUNT(o.id),结果依次为 2、1、1、0。