一、爲什麼要對數據進行分組
數據分組:是按照邏輯次序把具有重複值的字段進行合併。
二、GROUP BY子句
語法:
SELECT column1,column2
FROM table1,table2
WHERE conditions
GROUP BY column1,column2
ORDER BY column1,column2;
1、分組函數
典型的分組函數—也就是用於GROUP BY子句對數據進行劃分的函數—包括AVG、MAX、MIN、SUM、COUNT。
2、對選中的數據進行分組
數據分組是個簡單的過程。被選中的字段(查詢中SELECT之後的字段列表)才能在GROUP BY子句裏引用;如果字段在SELECT語句裏找不到,就不能用於GROUP BY子句。
注:在對數據進行分組時,分組字段的次序不一定要與SELECT子句裏字段次序相同。
3、創建分組和使用匯總函數
SELECT語句在使用GROUP BY子句時必須滿足一定條件。特別是被選中的字段必須出現在GROUP BY子句裏,除了彙總函數。
注:具體數值在排序時位於NULL值之前,字符型在排序時位於NULL值之後。
4、以整數代表字段名稱
像ORDER BY子句一樣,GROUP BY子句裏也可以用整數代表字段名稱。
三、GROUP BY和ORDER BY
ORDER BY子句專門用於對查詢得到的數據進行排序,GROUP BY子句也把查詢得到的數據排序爲適當分組的數據,因此,GROUP BY子句也可以像ORDER BY子句那樣用於數據排序。
使用GROUP BY子句實現排序操作的區別與缺點:
1、所有被選中的、非彙總函數的字段必須列在GROUP BY子句裏;
2、除非需要使用匯總函數,否則使用GROUP BY子句進行排序通常是沒有必要的。
四、CUBE和ROLLUP語句
ROLLUP語法:
GROUP BY ROLLUP(ordered column list of grouping sets)
MySQL ROLLUP語法:
GROUP BY order column list of grouping sets WITH ROLLUP
ROLLUP語句的工作方式:
1、在完成了基本的分組數據彙總以後,
2、按照從右向左的順序,每次去掉字段列表中的最後一個字段,再對剩餘的字段進行分組統計,並將獲得的小計結果插入返回表中,被去掉的字段位置使用NULL填充。
3、最後,再對全表進行一次統計,所有的字段位置均使用NULL填充。
CUBE語法:
GROUP BY CUBE(column list of grouping sets)
CUBE語句在SQL Server和Oracle中都可以使用,MySQL尚不支持該語句。
CUBE語句的工作方式:
1、它對分組列表中的所有字段進行排列組合,並根據每一種組合結果,分別進行統計彙總。 2、最後,CUBE語句也會對全表進行統計。
五、HAVING子句
HAVING子句必須跟在GROUP BY子句之後,在ORDER BY子句之前。
語法:
SELECT column1,column2
FROM table1,table2
WHERE contidions
GROUP BY column1,column2
HAVING conditions
ORDER BY column1,column2;