如果你編寫 SQL 查詢已有一段時間,那么你可能對 WHERE 子句非常熟悉。雖然它對聚合字段沒有影響,但有一種方法可以根據聚合值過濾記錄,那就是使用 HAVING 子句。本博客將介紹它的工作原理,并提供幾個在 SELECT 查詢中使用它的示例。
聚合和 Having 子句
聚合通常與分組結合使用。在 SQL 中,可以使用 GROUP BY 子句來實現。通過聚合和分組,我們可以深入了解數據。例如,一家電子商務公司可能希望跟蹤特定時間段內的銷售情況。
在很多情況下,我們可能不想在整個數據集上應用 GROUP BY 子句。在這種情況下,我們可以使用 GROUP BY 命令和有條件的 HAVING 子句來篩掉不需要的結果。與 WHERE 子句類似,HAVING 指定了一個或多個篩選條件,但針對的是一個組或一個聚合。因此,HAVING 總是放在 WHERE 和 GROUP BY 子句之后,而在(可選的)ORDER BY 子句之前:
一些實例
為了更好地了解 HAVING 如何工作,讓我們通過 Sakila 示例數據庫 運行幾個 SELECT 查詢。
我們的第一個查詢列出了租片次數最多的人,按降序排序,這樣租片次數最多的人就排在最前面。我們將使用 HAVING 子句刪除租片次數少于 3 次的客戶,以在一定程度上縮短列表:
下面是 Navicat Premium 中的查詢及其結果的第一頁:
從這些租金數字來看,我們還可以再進一步縮小列表長度!
通過 WHERE 和 HAVING 篩選行
正如 GROUP BY 和 ORDER BY 應用于查詢過程的不同階段一樣,WHERE 和 HAVING 也是如此。因此,我們可以在分組和聚合之前和之后加入這兩個子句來篩選結果。例如,我們可以添加一個 WHERE 子句,將結果限制在給定年份的上半年:
下面是在 Navicat Premium 中運行的上述查詢及其結果的第一頁:
組合多個條件
正如 WHERE 子句使用 AND 和 OR 關鍵字支持多個條件一樣,HAVING 子句也是如此。例如,我們可以將 HAVING 子句修改為類似下面的內容,從而找到租金數字在給定范圍內的客戶:
HAVING total_rentals >= 3 AND total_rentals <= 10