HAVING
是 SQL 中專門對 “分組之后的聚合結果” 再做篩選的子句。
它一般跟在 GROUP BY
后面,不能單獨使用,作用類似于分組版的 WHERE
。
? 1. 語法位置
SELECT 列1, 聚合函數(列2) AS 別名
FROM 表
GROUP BY 列1
HAVING 聚合條件; -- 這里寫對聚合結果的過濾條件
? 2. 與 WHERE 的區別(面試高頻)
子句 | 過濾時機 | 能用的表達式 | 作用對象 |
---|---|---|---|
WHERE | 分組前 | 普通列、表達式 | 原始行 |
HAVING | 分組后 | 聚合函數、分組列 | 聚合結果 |
? 3. 工作流程
FROM
取表WHERE
先過濾原始行GROUP BY
分組- 對每組算聚合值
HAVING
再按聚合值篩組SELECT
輸出最終列ORDER BY
排序(如有)
? 4. 示例表:orders
order_id | customer | amount |
---|---|---|
1 | Alice | 100 |
2 | Bob | 200 |
3 | Alice | 150 |
4 | Bob | 50 |
5 | Carol | 300 |
🔍 需求:找出 總消費 ≥ 250 的客戶
SELECT customer,SUM(amount) AS total
FROM orders
GROUP BY customer
HAVING SUM(amount) >= 250;
結果:
customer | total
---------|-------
Alice | 250
Carol | 300
- 先按
customer
分組,算每人總額 - 再用
HAVING
篩掉Bob
(總額 250 以下)
? 5. 常見場景
- 統計部門平均工資高于 1 萬的部門
- 找出銷量超過 100 件的商品
- 查詢下單次數 ≥ 3 次的用戶
? 6. 易錯點
- 把 非聚合列 放進
HAVING
會報錯(除非該列同時出現在GROUP BY
里) - 忘記先
GROUP BY
→ 語法錯誤 - 用
WHERE
寫聚合條件 → 也報錯
? 7. 一句話總結
HAVING
就是 “分組后再篩組” 的專用工具,和GROUP BY
形影不離,專門處理聚合結果。