分組
一個(gè)表中有很多供應(yīng)商,每個(gè)供應(yīng)商都有很多商品,假設(shè)要返回每個(gè)供應(yīng)商提供的產(chǎn)品數(shù)目,這時(shí)候用前面提到的聚集函數(shù)無法完成,這是需要使用分組功能
SELECT vend_id , COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;
vend_id | num_prods |
---|---|
1001 | 2 |
1002 | 4 |
1003 | 12 |
在具體使用GROUP BY子句前,需要知道一些重要的規(guī)定:
- GROUP BY子句可以包含任意數(shù)目的列。這使得能對(duì)分組進(jìn)行嵌套,為數(shù)據(jù)分組提供更細(xì)致的控制。
- 如果在GROUP BY子句中嵌套了分組,數(shù)據(jù)將在最后規(guī)定的分組上進(jìn)行匯總。換句話說,在建立分組時(shí),指定的所有列都一起計(jì)算(所以不能從個(gè)別的列取回?cái)?shù)據(jù))。
- GROUP BY 子句中列出的每個(gè)列都必須是檢索列或有效的表達(dá)式 (但不能是聚集函數(shù))。如果在 SELECT 中使用表達(dá)式, 則必須在GROUP BY子句中指定相同的表達(dá)式。不能使用別名。
- 除聚集計(jì)算語(yǔ)句外,SELECT語(yǔ)句中的每個(gè)列都必須在GROUP BY子句中給出。
- 如果分組列中具有NULL值,則NULL將作為一個(gè)分組返回。如果列中有多行NULL值,它們將分為一組。
- GROUP BY子句必須出現(xiàn)在WHERE子句之后,ORDER BY子句之前
過濾分組
分組的過濾使用是HAVING子句。HAVING非常類似于WHERE,目前為止所學(xué)過的所有類型的 WHERE 子句都可以用 HAVING 來替代。 唯一的差別是 WHERE過濾行,而HAVING過濾分組
下面是一個(gè)復(fù)雜的查詢,它返回具有兩個(gè)以上訂單并且訂單價(jià)格不低于10元的顧客
SELECT vend_id, COUNT(*) AS num_prods
FROM products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;
注意:一般在使用GROUP BY子句時(shí),應(yīng)該也給出ORDER BY子句,因?yàn)镚ROUP BY輸出可能不是分組的順序。所以為了保證數(shù)據(jù)正確的排序,提供ORDER BY是唯一的方法。千萬不要僅依賴GROUP BY默認(rèn)排序數(shù)據(jù)
本文摘自 :https://www.cnblogs.com/