摘自: https://www.cnblogs.com/leo0705/p/8473033.htmlphp
GROUP BY語句,通過研究和練習,終於明白如何使用了,在此記錄一下同時添加了一個本身舉的小例子,經過寫這篇文章來加深下本身學習的效果,還能和你們分享下,同時也方便之後查閱,一舉多得html
1、GROUP BYsql
GROUP BY語句用來與聚合函數(aggregate functions such as COUNT, SUM, AVG, MIN, or MAX.)聯合使用來獲得一個或多個列的結果集。express
語法以下:函數
SELECT column1, column2, ... column_n, aggregate_function (expression) 學習
FROM tables spa
WHERE predicates htm
GROUP BY column1, column2, ... column_n;blog
舉例get
好比說咱們有一個學生表格(student),包含學號(id),課程(course),分數(score)等等多個列,咱們想經過查詢獲得每一個學生選了幾門課程,此時咱們就能夠聯合使用COUNT函數與GROUP BY語句來獲得這一結果
SELECT id, COUNT(course) as numcourse
FROM student
GROUP BY id
由於咱們是使用學號來進行分組的,這樣COUNT函數就是在以學號分組的前提下來實現的,經過COUNT(course)就能夠計算每個學號對應的課程數。
注意
由於聚合函數經過做用於一組數據而只返回一個單個值,所以,在SELECT語句中出現的元素要麼爲一個聚合函數的輸入值,要麼爲GROUP BY語句的參數,不然會出錯。
例如,對於上面提到的表格,咱們作一個這樣的查詢:
SELECT id, COUNT(course) as numcourse, score
FROM student
GROUP BY id
此時查詢便會出錯,錯誤提示以下:
Column ‘student.score' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
出現以上錯誤的緣由是由於一個學生id對應多個分數,若是咱們簡單的在SELECT語句中寫上score,則沒法判斷應該輸出哪個分數。若是想用score做爲select語句的參數能夠將它用做一個聚合函數的輸入值,以下例,咱們能夠獲得每一個學生所選的課程門數以及每一個學生的平均分數:
SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore
FROM student
GROUP BY id
2、HAVING
HAVING語句一般與GROUP BY語句聯合使用,用來過濾由GROUP BY語句返回的記錄集。
HAVING語句的存在彌補了WHERE關鍵字不能與聚合函數聯合使用的不足。
語法:
SELECT column1, column2, ... column_n, aggregate_function (expression)
FROM tables
WHERE predicates
GROUP BY column1, column2, ... column_n
HAVING condition1 ... condition_n;
一樣使用本文中的學生表格,若是想查詢平均分高於80分的學生記錄能夠這樣寫:
SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore
FROM student
GROUP BY id
HAVING AVG(score)>=80;
在這裏,若是用WHERE代替HAVING就會出錯
參考資料:
http://www.w3schools.com/sql/sql_groupby.asp
http://www.techonthenet.com/sql/group_by.php
http://www.w3schools.com/sql/sql_having.asp