GROUP BY
GROUP BY語句用來與聚合函數(aggregate functions such as COUNT, SUM, AVG, MIN, or MAX.)聯合使用來得到一個或多個列的結果集。
語法如下:
SELECT column1, column2, ... column_n, aggregate_function (expression) FROM tables WHERE predicates GROUP BY column1, column2, ... column_n;
舉例
比如說我們有一個學生表格(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
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就會出錯