最近的工作中遇到了一些信息篩選的要求,其中一個要求就是,統計信息中某項活動超過5次的。這里就需要用到一些Mysql中的GROUP BY 和HAVING 兩個語句了。
一、核心方法:GROUP BY 與 HAVING
要理解頻率查詢,首先必須明白兩個核心SQL子句:GROUP BY和HAVING。
GROUP BY(分組):它的作用是將具有相同值的行分配到不同的“桶”里。想象一下,你有一堆混雜的不同水果,GROUP BY就是讓你按水果種類(蘋果、香蕉、橘子)將它們分到不同的籃子中。
COUNT()(聚合函數):在分好組之后,我們需要計算每個“籃子”里有多少個水果。COUNT(*)就是完成這個計數的工具,它返回每個組中的行數。
HAVING(過濾組):WHERE子句用于在分組前過濾行,而HAVING子句則在分組后過濾組。它允許我們對分組后的結果集設置條件,例如,我們只關心水果數量超過5個的籃子。
二、實戰演練:從基礎查詢到復雜過濾
讓我們通過一個具體的例子來演示。假設我們有一張名為 orders 的訂單表,其中有一個 customer_id 字段,記錄了下訂單的客戶ID。
1. 基礎統計:每個值出現了多少次?
我們的第一個問題是:每個客戶總共下了多少訂單?

2. 進階過濾:哪些值出現的次數超過了閾值?
現在,我們不再滿足于知道所有客戶的訂單數。我們想找出下單次數超過5次的優質客戶。這時,HAVING子句就派上了用場。

三、注意事項與最佳實踐
HAVING vs WHERE:切記,WHERE在分組前過濾行,它不能使用聚合函數(如COUNT)。HAVING在分組后過濾組,通常與聚合函數一起使用。將條件放在錯誤的子句會導致查詢失敗或結果錯誤。
處理NULL值:COUNT(*)會計算所有行,包括那些字段值為NULL的行。而COUNT(customer_id)只會計算customer_id不為NULL的行。根據你的業務邏輯選擇合適的方式。
性能優化:對于大型表,在用于GROUP BY和WHERE的字段上建立索引可以極大地提高查詢速度。例如,為customer_id字段添加索引,會讓上面的分組計數查詢快得多。



