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