1. 程式人生 > >第十三章 分組數據

第十三章 分組數據

之前 函數 表達 創建 指示 對組 lin mysq group by

學習目的: 了解如何分組數據,以便能匯總表內容的子集。GROUP BY 和HAVING的使用。 數據分組: 分組允許把數據分成多個邏輯組,以便能對每個組進行聚集計算。 創建分組: 分組是在SELECT語句的GROUP BY子句中建立的。 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 子句之前。
Q:檢索每個供應商的產品數目? SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id; 使用WITH ROLLUP關鍵字,可以得到每個分組以及每個分組匯總級別的值。 SELECT vend_id,COUNT(*) AS num_prod FROM products GROUP BY vend_id WITH ROLLUP; 過濾分組: 除了能用GROUP BY 分組數據外,MySQL還允許過濾分組,規定包括哪些分組,排除哪些分組。MySQL為對組進行過濾提供了另外的子句HAVING。 HAVING和WHERE非常類似,唯一差別是WHERE過濾行(WHERE沒有組的概念),而HAVING過濾分組。 Q:列出具有2個(含)以上,價格為10(含)以上的產品的供應商。 SELECT vend_id, COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >= 2; 分組和排序: ORDER BY 和GROUP BY 的區別
ORDER BY GROUP BY
排序產生的輸出 任意列都可以使用(甚至非選擇的列也可以使用) 不一定需要 分組行。但輸出可能不是分組的順序 只可能使用選擇列或表達式,而且必須使用每個選擇列表達式 如果與聚集函數一起使用列(表達式),則必須使用
Q:檢索總計訂單價格大於50的訂單的訂單號和總計訂單價格按照降序排列。 SELECT order_num, SUM(quantity*item_price) AS total_price FROM orderitems GROUP BY order_num HAVING SUM(quantity*item_price) >= 50 ORDER BY total_price DESC; SELECT 子句順序:
子句 說明 是否必須使用
SELECT 要返回的列或表達式
FROM 從中檢索數據的表 僅在從表選擇數據時使用
WHERE 行級過濾
GROUP BY 分組說明 僅在按組計算聚集時使用
HAVING 組級過濾
ORDER BY 輸出排序順序
LIMIT 要檢索的行數

第十三章 分組數據