GROUP BY 和 HAVING

已完成

為了取得更深入的見解,並更妥善地組織資料庫中的數據,SQL 引進了強大的 GROUP BYHAVING 子句。

這些工具可讓您將原始數據轉換成有意義的摘要,方法是將數據列分類並套用聚合函數,讓您更輕鬆地分析趨勢、識別模式,或產生針對特定類別量身打造的報表。

GROUP BY

若要依類別或群組分析數據,SQL 會提供 GROUP BY 子句。 這個子句會根據指定數據行中的值來分類數據列,有效地將數據分割成子集。

GROUP BY 與聚合函數搭配使用時,其真正的威力便展現出來。 匯總函數,例如COUNT()SUM()AVG()MIN()MAX() 在這些群組上執行計算,可讓您為每個類別產生摘要統計數據。

例如,您可以使用 GROUP BY 來計算:每個產品類別的 -total 銷售 SUM() ,-average 來自每個供應商的產品價格 AVG() ,-number 每個城市的客戶 COUNT()

SELECT category_id, AVG(price)
FROM sales.products
GROUP BY category_id;

此查詢會依據 category_idsales.products 資料表的資料列進行分組,藉此擷取各類別內產品的平均價格。 藉由將函 AVG() 式套用至 price 數據行,查詢會計算每個不同 category_id下所有產品的平均價格值。

GROUP BY 子句不一定要與彙總函式配對。 雖然它通常與聚合函數一起用來對群組數據執行計算,但GROUP BY也可以單獨用來將數據組織成群組,進行其他用途,例如擷取不同欄位組合。

SELECT category_id
FROM sales.products
GROUP BY category_id;

此查詢不進行匯總,僅通過category_id分組數據列,列出category_id表中存在的每個相異的sales.products

HAVING

在 SQL 中 WHERE ,子句無法用來篩選聚合函數的結果。
若要根據聚合函數結果篩選 子句所建立的 GROUP BY 群組,您可以使用 HAVING 子句。
HAVING想像它是群組的WHERE子句:它可讓您對彙總函數產生的彙總數據套用條件,使您能夠優化分析,專注於相關群組。

SELECT category_id, AVG(price)
FROM sales.products
GROUP BY category_id
HAVING AVG(price) > 30;

此查詢會依據 category_idsales.products 資料表的資料列進行分組,藉此計算各類別內產品的平均 price。 然後,它會篩選結果,只包含那些平均值price超過 30 且使用 HAVING 子句的類別。