首頁  >  文章  >  資料庫  >  mysql資料分組:過濾分組

mysql資料分組:過濾分組

巴扎黑
巴扎黑原創
2017-05-09 13:48:022250瀏覽

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;

輸出:

mysql資料分組:過濾分組

分析:這條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;

輸出:

mysql資料分組:過濾分組

分析:這條語句中,第一行是使用了聚集函數的基本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資料分組:過濾分組

【相關推薦】

  1. ##mysql資料分組與排序及SELECT子句順序

  2. mysql資料分組:建立分組

    ##

以上是mysql資料分組:過濾分組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn