現有以下的學生信息表:
若果現在想計算每個班的平均年齡,使用where的操作如下:
SELECT Cno AS 班級, AVG(Sage) AS 平均年齡 FROM stu Where Cno=5;
這樣的話,有多少個班就需要操作幾次
因此引入分組 GROUP BY子句,根據列來分組,先看一下《MySQL必知必會》的提示:
引入分組后,操作如下:
SELECT Cno AS 班級,AVG(Sage) AS 平均年齡 FROM stu GROUP BY Cno;
由此可以理解,GROUP BY 根據給出的列進行分組,具有相同列屬性的被分到一組,然后你需要對組內的數據執行什么操作,就和平常的一樣,只是操作的不再是所有的數據,而是分組后的。
過濾分組
使用GROUP BY將數據分組后,還可以使用HAVING過濾分組,規定包括哪些分組,排除哪些分組,比如想在上述的學生信息表中,找出多於2個人的班級,使用以下的操作
SELECT Cno AS 班級,COUNT(Cno) AS 人數 FROM stu GROUP BY Cno HAVING COUNT(Cno)>=2;
關於HAVING和WHERE的區別 《MySQL必知必會》
HAVING和WHERE的差別 這里有另一種理解方法,WHERE在數據 分組前進行過濾,HAVING在數據分組后進行過濾。
這是一個重 要的區別,WHERE排除的行不包括在分組中。這可能會改變計 算值,從而影響HAVING子句中基於這些值過濾掉的分組。
從sql語句上而言,WHERE是寫在GROUP BY前的,而HAVING是在GROUP BY后的