假设我们有一个 Orders
表,包含以下数据:
id | customer_id | amount |
---|---|---|
1 | 1 | 100 |
2 | 1 | 200 |
3 | 2 | 150 |
4 | 3 | 300 |
5 | 3 | 250 |
6 | 4 | 50 |
7 | 4 | 100 |
1. 使用 WHERE
子句
目标
查询每个客户的总订单金额,并且只考虑订单金额大于 150 的订单。
查询
sqlSELECT customer_id, SUM(amount) AS total_amount
FROM Orders
WHERE amount > 150
GROUP BY customer_id;
解释
WHERE amount > 150
:在分组前过滤掉订单金额小于或等于 150 的记录。GROUP BY customer_id
:按customer_id
分组。SUM(amount) AS total_amount
:计算每个客户的总订单金额。
结果
customer_id | total_amount |
---|---|
1 | 200 |
3 | 550 |
2. 使用 HAVING
子句
目标
查询每个客户的总订单金额,并且总金额大于 300 的客户。
查询
sqlSELECT customer_id, SUM(amount) AS total_amount
FROM Orders
GROUP BY customer_id
HAVING SUM(amount) > 300;
解释
GROUP BY customer_id
:按customer_id
分组。SUM(amount) AS total_amount
:计算每个客户的总订单金额。HAVING SUM(amount) > 300
:在分组后过滤掉总订单金额小于或等于 300 的客户。
结果
customer_id | total_amount |
---|---|
3 | 550 |
总结
WHERE
子句:在分组前过滤记录,适用于单个记录的条件,通常性能更好。HAVING
子句:在分组后过滤记录,适用于分组后的聚合结果,性能可能稍差。