where 和 having 子句在 sql 中均用于過濾數(shù)據(jù),但作用范圍不同:where 子句過濾單行,having 子句過濾分組后的結(jié)果集。where 子句在分組前應(yīng)用,影響聚合函數(shù)的結(jié)果行;having 子句在分組后應(yīng)用,影響分組行而不是單個行。where 子句可以過濾任何列,而 having 子句只能過濾聚合函數(shù)的結(jié)果。
WHERE 和 HAVING 子句的區(qū)別
在 SQL 查詢中,WHERE 和 HAVING 子句用于過濾數(shù)據(jù)行,但它們有不同的作用范圍和用途。
WHERE 子句
應(yīng)用于表的單個行上。
用于過濾出滿足指定條件的行。
在數(shù)據(jù)分組之前應(yīng)用。
影響聚合函數(shù)的結(jié)果行。
HAVING 子句
應(yīng)用于分組后的結(jié)果集上。
用于過濾出滿足指定條件的分組。
在數(shù)據(jù)分組之后應(yīng)用。
影響分組行而不是單個行。
對比表
特征 | WHERE 子句 | HAVING 子句 |
---|---|---|
作用范圍 | 單行 | 分組 |
應(yīng)用時機(jī) | 分組前 | 分組后 |
影響 | 聚合函數(shù)結(jié)果行 | 分組行 |
示例
以下查詢使用 WHERE 子句過濾出銷售額超過 1000 的訂單:
<code class="sql">SELECT * FROM orders WHERE sales_amount > 1000;</code>
登錄后復(fù)制
以下查詢使用 HAVING 子句過濾出平均銷售額超過 1000 的所有客戶:
<code class="sql">SELECT customer_id, AVG(sales_amount) AS avg_sales FROM orders GROUP BY customer_id HAVING avg_sales > 1000;</code>
登錄后復(fù)制
注意事項
WHERE 子句可以過濾任何列,而 HAVING 子句只能過濾聚合函數(shù)的結(jié)果。
HAVING 子句通常與 GROUP BY 子句一起使用,而 WHERE 子句可以獨(dú)立使用。