在 SQL 中,HAVING 子句通常和 GROUP BY 一起使用,用来对分组后的结果进行筛选。
可以理解为:
WHERE:在分组前过滤“行”HAVING:在分组后过滤“组”SELECT 列, 聚合函数(列)
FROM 表名
WHERE 条件
GROUP BY 列
HAVING 条件;
| 子句 | 作用对象 | 能否用聚合函数 |
|---|---|---|
| WHERE | 原始行 | ❌ 不能 |
| HAVING | 分组结果 | ✅ 可以 |
orders| order_id | customer_id | amount |
|---|---|---|
| 1 | A | 100 |
| 2 | A | 200 |
| 3 | B | 50 |
| 4 | B | 80 |
| 5 | C | 300 |
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 200;
结果:
| customer_id | total |
|---|---|
| A | 300 |
| C | 300 |
先排除金额小于 100 的订单,再筛选客户总额 > 200:
SELECT customer_id, SUM(amount) AS total
FROM orders
WHERE amount >= 100
GROUP BY customer_id
HAVING SUM(amount) > 200;
筛选订单数大于 1 的客户:
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 1;
❌ 在 WHERE 中使用聚合函数:
-- 错误
SELECT customer_id
FROM orders
WHERE SUM(amount) > 200;
✅ 正确写法是用 HAVING。
先分组,后筛选,用 HAVING;
原始行过滤,用 WHERE。
如果你有具体的 SQL 场景或数据库(MySQL / PostgreSQL / Oracle),我可以帮你写具体例子。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。