分組資料
資料分組
分組允許把資料分為多個邏輯組,以便能對每個組進行聚集計算,
創建分組
分組是在SELECT陳述句的GROUP BY子句中建立的:
SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id;
注意:
- GROUP BY子句可以包含任意數目的列,這使得能對分組進行嵌套,為資料分組提供更細致的控制,
- 如果在GROUP BY子句中嵌套了分組,資料將在最后規定的分組上進行匯總,換句話說,在建立分組時,指定的所有列都一起計算(所以不能從個別的列取回資料),
- GROUP BY子句中列出的每個列都必須是檢索列或有效的運算式(但不能是聚集函式),如果在SELECT中使用運算式,則必須在GROUP BY子句中指定相同的運算式,不能使用別名,
- 除聚集計算陳述句外,SELECT陳述句中的每個列都必須在GROUP BY子句中給出,
- 如果分組列中具有NULL值,則NULL將作為一個分組回傳,如果列中有多行NULL值,它們將分為一組,
- GROUP BY子句必須出現在WHERE子句之后,ORDER BY子句之前,
- 使用WITH ROLLUP關鍵字,可以得到每個分組以及每個分組匯總級別(針對每個分組)的值,
過濾分組
目前為止所學過的所有型別的WHERE子句都可以用HAVING來替代,唯一的差別是WHERE過濾行,而HAVING過濾分組,
SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;
注意:
-HAVING和WHERE的差別:這里有另一種理解方法,WHERE在資料分組前進行過濾,HAVING在資料分組后進行過濾,這是一個重要的區別,WHERE排除的行不包括在分組中,這可能會改變計算值,從而影響HAVING子句中基于這些值過濾掉的分組,
SELECT vend_id, COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >= 2;
分組和排序
雖然GROUP BY和ORDER 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 ORDER BY ordertotal; |
SELECT子句順序
| 子 句 | 說 明 | 是否必須使用 |
|---|---|---|
| SELECT | 要回傳的列或運算式 | 是 |
| FROM | 從中檢索資料的表 | 僅在從表選擇資料時使用 |
| WHERE | 行級過濾 | 否 |
| GROUP BY | 分組說明 | 僅在按組計算聚集時使用 |
| HAVING | 組級過濾 | 否 |
| ORDER BY | 輸出排序順序 | 否 |
| LIMIT | 要檢索的行數 | 否 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/542308.html
標籤:MySQL
上一篇:MySQL性能優化淺析及線上案例
下一篇:MySQL性能優化淺析及線上案例
