mysql過濾分組
除了能用group by分組資料外,MySQL還允許過濾分組,規定包括哪些分組,排除哪些分組。例如,可能想要列出至少有兩個訂單的所有顧客。為得出這種數據,必須基於完整的分組而不是個別的進行過濾。
我們已經看到了where子句的作用。但是,在這個例子中where不能完成任務,因為where過濾指定的是行而不是分組。事實上,where沒有分組概念。
那麼,不使用where使用什麼呢? MySQL為此目的提供了另一個另一個的子句,那就是having子句。 having非常類似where。事實上,目前為止所學過的所有類型的where子句都可以用having來替代。唯一的差別是where過濾行,而having過濾分組。
注意:having支援所有的where運算子。
那麼,要怎麼過濾分組呢?請看下面的例子:
輸入:
select cust_id,count(*) as orders from orders group by cust_id having count(*) >= 2;
輸出:
分析:這條select語句的前3行類似於上面的語句。最後一行增加了having子句,它過濾count(*>)>=2(兩個以上的訂單)的那些分組。
如所見,這裡where子句不起作用,因為過濾是基於分組聚集值而不是特定行值的。
having和where的差異:這裡有另一種理解方法,where在資料分組前進行過濾,having在資料分組後進行過濾。這是一個重要的區別,where排除的行不包括在分組中。這可能會改變計算值,從而影響having子句中基於這些值過濾掉的分組。
那麼,有沒有在一條語句中同時使用where和having子句的需要呢?事實上,確實有。假如想進一步過濾上面的語句,使它回到過去12個月內有兩個以上的顧客。要達到這一點,可增加一個where子句,過濾出去12個月內下過的訂單。然後再增加having子句過濾出具有兩個以上訂單的分組。
為更好的理解,請看下面的例子,它列出具有2個(含)以上、價格為10(含)以上的產品供應商:
輸入:
select vend_id,count(*) as num_prods from products where prod_price >= 10 group by vend_id having count(*) >=2;
輸出:
分析:這條語句中,第一行是使用了聚集函數的基本SELECT ,它與前面的例子很相像。 WHERE 子句過濾所有 prod_price 至少為 10 的行。然後按 vend_id 分組數據, HAVING 子句過濾計數為 2 或 2 以上的分組。
如果沒有WHERE 子句,將會多檢索出兩行(供應商1002 ,銷售的所有產品價格都在10 以下;供應商1001 ,銷售3個產品,但只有一個產品的價格大於等於10 ):
輸入:select vend_id,count(*) as num_prods from products group by vend_id having count(*) >= 2;
#輸出:
【相關推薦】
以上是mysql資料分組:過濾分組的詳細內容。更多資訊請關注PHP中文網其他相關文章!