1. 程式人生 > 其它 >GROUP BY語句與HAVING語句的使用

GROUP BY語句與HAVING語句的使用

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就會出錯