1. 程式人生 > >Mysql| Mysql分組函式

Mysql| Mysql分組函式

分組資料: (GROUP BY,HAVING )

分組是對查詢出來的所有結果行再進行分組,所以GROUP BY 應該在過濾條件WHERE之後.對資料分完組之後再在組內進行資料的排序.所以GROUP BY在ORDER BY子句之前.

文章內容:
如何使用GROUP BY子句對資料組進行這些彙總計算,返回每個組的結果。我們看到了如何使用HAVING子句過濾特定的組,還知道了ORDER BY和GROUP BY之間以及WHERE和HAVING之間的差異。

資料分組

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分組資料,然後對每個組而不是整個結果集進行聚集。

SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id;

+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         4 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
+---------+-----------+

SQL解釋:
上面的SELECT語句指定了兩個列, vend_id包含產品供應商的ID,num_prods為計算欄位(用COUNT(*)函式建立)。 GROUP BY子句指示MySQL按vend_id排序並分組資料。這導致對每個vend_id而不是整個表計算num_prods一次。從輸出中可以看到,供應商1001有3個產品,供應商1002有2個產品,供應商1003有7個產品,而供應商1005有2個產品。

關於ROLLUP的使用:
SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id WITH ROLLUP;
使用ROLLUP 使用WITH ROLLUP關鍵字,可以得到每個分組以及每個分組彙總級別(針對每個分組)的值,在一下結果中,可以知道vend_id為NULL的一行資料,後面的num_prods是以上所有資料的彙總.

+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         4 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
|    NULL |        15 |
+---------+-----------+

過濾分組

HAVING支援所有WHERE操作符.

HAVING和WHERE的差別

這裡有另一種理解方法,WHERE在資料分組前進行過濾, HAVING在資料分組後進行過濾。這是一個重要的區別, WHERE排除的行不包括在分組中。這可能會改變計算值,從而影響HAVING子句中基於這些值過濾掉的分組。