目前爲止的全部計算都是在表的全部數據或匹配特定的 WHERE 子句的
數據上進行的。提示一下,下面的例子返回供應商 1003 提供的產品數目函數
但若是要返回每一個供應商提供的產品數目怎麼辦?或者返回只提供
單項產品的供應商所提供的產品,或返回提供10個以上產品的供應商怎
麼辦?
這就是分組顯身手的時候了。分組容許把數據分爲多個邏輯組,以
便能對每一個組進行彙集計算學習
分組是在 SELECT 語句的 GROUP BY 子句中創建的。理解分組的最好辦
法是看一個例子3d
上面的 SELECT 語句指定了兩個列, vend_id 包含產品供應商的ID,
num_prods 爲計算字段(用 COUNT(*) 函數創建)。 GROUP BY 子句指
示MySQL按 vend_id 排序並分組數據。這致使對每一個 vend_id 而不是整個表
計算 num_prods 一次。從輸出中能夠看到,供應商 1001 有 3 個產品,供應商
1002 有 2 個產品,供應商 1003 有 7 個產品,而供應商 1005 有 2 個產品blog
由於使用了 GROUP BY ,就沒必要指定要計算和估值的每一個組了。系統
會自動完成。 GROUP BY 子句指示MySQL分組數據,而後對每一個組而不是
整個結果集進行彙集排序
在具體使用 GROUP BY 子句前,須要知道一些重要的規定。產品
使用 ROLLUP 使用 WITH ROLLUP 關鍵字,能夠獲得每一個分組以
及每一個分組彙總級別(針對每一個分組)的值,以下所示select
除了能用 GROUP BY 分組數據外,MySQL還容許過濾分組,規定包括
哪些分組,排除哪些分組。例如,可能想要列出至少有兩個訂單的全部
顧客。爲得出這種數據,必須基於完整的分組而不是個別的行進行過濾方法
HAVING 很是相似於 WHERE 。事實上,目前爲止所
學過的全部類型的 WHERE 子句均可以用 HAVING 來替代。惟一的差異是
WHERE 過濾行,而 HAVING 過濾分組im
HAVING 支持全部 WHERE 操做符 在第6章和第7章中,咱們學習
了 WHERE 子句的條件(包括通配符條件和帶多個操做符的子
句)。所學過的有關 WHERE 的全部這些技術和選項都適用於
HAVING 。它們的句法是相同的,只是關鍵字有差異技術
這條 SELECT 語句的前3行相似於上面的語句。最後一行增長了
HAVING 子句,它過濾 COUNT(*) >=2 (兩個以上的訂單)的那些
分組。
正如所見,這裏 WHERE 子句不起做用,由於過濾是基於分組彙集值而
不是特定行值的
HAVING 和 WHERE 的差異 這裏有另外一種理解方法, WHERE 在數據
分組前進行過濾, HAVING 在數據分組後進行過濾。這是一個重
要的區別, WHERE 排除的行不包括在分組中。這可能會改變計
算值,從而影響 HAVING 子句中基於這些值過濾掉的分組
那麼,有沒有在一條語句中同時使用 WHERE 和 HAVING 子句的須要呢?
事實上,確實有。假如想進一步過濾上面的語句,使它返回過去12個月
內具備兩個以上訂單的顧客。爲達到這一點,可增長一條 WHERE 子句,過
濾出過去12個月內下過的訂單。而後再增長 HAVING 子句過濾出具備兩個
以上訂單的分組
爲更好地理解,請看下面的例子,它列出具備 2 個(含)以上、價格
爲 10 (含)以上的產品的供應商
雖然 GROUP BY 和 ORDER BY 常常完成相同的工做,但它們是很是不一樣
的。表13-1彙總了它們之間的差異
表13-1中列出的第一項差異極爲重要。咱們常常發現用 GROUP BY 分
組的數據確實是以分組順序輸出的。但狀況並不老是這樣,它並非SQL
規範所要求的。此外,用戶也可能會要求以不一樣於分組的順序排序。僅
由於你以某種方式分組數據(得到特定的分組彙集值),並不表示你須要
以相同的方式排序輸出。應該提供明確的 ORDER BY 子句,即便其效果等
同於 GROUP BY 子句也是如此
不要忘記 ORDER BY 通常在使用 GROUP BY 子句時,應該也給
出 ORDER BY 子句。這是保證數據正確排序的惟一方法。千萬
不要僅依賴 GROUP BY 排序數據
檢索總計訂單價格大於等於 50 的訂
單的訂單號和總計訂單價格
下面回顧一下 SELECT 語句中子句的順序。表13-2以在 SELECT 語句中
使用時必須遵循的次序,列出迄今爲止所學過的子句
咱們學習瞭如何用SQL彙集函數對數據進行彙總計算。 本章講授瞭如何使用 GROUP BY 子句對數據組進行這些彙總計算,返回每 個組的結果。咱們看到了如何使用 HAVING 子句過濾特定的組,還知道了 ORDER BY 和 GROUP BY 之間以及 WHERE 和 HAVING 之間的差別。