sql必知必會學習記錄(十)- 分組資料
阿新 • • 發佈:2018-12-01
sql必知必會學習記錄(十)- 分組資料
- 資料分組
如果要返回每個供應商提供的產品數目怎麼辦?或者返回只提供單項產品的供應商所提供的產品,或返回提供10個以上產品的供應商怎麼辦,這就是分組顯身手的時候了。分組允許把資料分為多個邏輯組,以便能對每個組進行聚集計算。
- 建立分組
分組是在SELECT語句的GROUP BY子句中建立的。
select vend_id, COUNT(*) AS num_prods from products group BY vend_id;
GROUP BY子句指示MySQL分組資料,然後對每個組而不是整個結果集進行聚集。
group by 子句的注意事項:
- GROUP BY子句可以包含任意數目的列。這使得能對分組進行巢狀,為資料分組提供更細緻的控制。
- 如果在GROUP BY子句中嵌套了分組,資料將在最後規定的分組上進行彙總。換句話說,在建立分組時,指定的所有列都一起計算(所以不能從個別的列取回資料)。
- GROUP BY子句中列出的每個列都必須是檢索列或有效的表示式(但不能是聚集函式)。如果在SELECT中使用表示式,則必須在GROUP BY子句中指定相同的表示式。不能使用別名。
- 除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
- 如果分組列中具有NULL值,則NULL將作為一個分組返回。如果列中有多行NULL值,它們將分為一組。
- GROUP BY子句必須出現在WHERE子句之後,ORDER BY子句之前。
- 過濾分組
除了能用GROUP BY分組資料外,MySQL還允許過濾分組,規定包括哪些分組,排除哪些分組。那就是HAVING子句。HAVING非常類似於WHERE。事實上,目前為止所學過的所有型別的WHERE子句都可以用HAVING來替代。唯一的差別WHERE過濾行,而HAVING過濾分組。
SELECT cust_id,COUNT(*) as orders from orders group by cust_id HAVING count(*) >= 2 SELECT vend_id, COUNT(*) as num_prods FROM products WHERE prod_price >= 8 GROUP BY vend_id HAVING COUNT(*) >= 2//WHERE子句過濾所有prod_price至少為10的行。然後按vend_id分組資料,HAVING子句過濾計數為2或2以上的分組。
- 分組和排血
order by | group by |
---|---|
排序產生的輸出 | 分組行。但是輸出可能不是分組的順序 |
任意列都可使用(甚至非選擇的列也可使用) | 只可能使用選擇列或者表示式列,而且必須使用每個選擇列表達式 |
不一定需要 | 如果與聚集函式一起使用列(或表示式)則必須使用 |
一般在使用GROUP BY子句時,應該也給出ORDER BY子句。這是保證資料正確排序的唯一方法。千萬
不要僅依賴GROUP BY排序資料
SELECT order_num,sum(quantity*item_price) as ordertotal from orderitems GROUP BY order_num HAVING sum(quantity*item_price) >= 50
SELECT order_num,SUM(quantity*item_price) as ordertotal from orderitems GROUP BY order_num HAVING sum(quantity*item_price) >= 50 order BY ordertotal;
- select 子句的順序
子句 | 說明 | 是否必須使用 |
---|---|---|
select | 要返回的列或表示式 | 是 |
from | 從中檢索資料的表 | 僅從表選擇資料時使用 |
where | 行級過濾 | 否 |
group by | 分組說明 | 僅在按組計算聚集時使用 |
having | 組級過濾 | 否 |
order by | 輸出排序順序 | 否 |
limit | 要檢索的行數 | 否 |