在开始下文的例子之前,建议大家先了解下常用的聚合函数, 例如SUM, COUNT, MAX, AVG等,和其它函数的根本区别就是它们一般作用在多条记录上。
假如数据库中有A表,包括学生,学科,成绩三个字段
数据库结构为
学生 学科 成绩
张三 语文 80
张三 数学 100
李四 语文 70
李四 数学 80
李四 英语 80
SELECT SUM(成绩) FROM A
返回所有成绩的总和。
通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。
当你指定 GROUP BY 学科 时, 属于同一个学科的一组数据将只能返回一行值.
也就是说,表中所有除学科外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值.
HAVING子句可以让我们筛选成组后的各组数据.
WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前. 而 HAVING子句在聚合后对组记录进行筛选。
一、显示每个学生的总成绩.
SELECT 学科, SUM(成绩) FROM A GROUP BY 学生
先以学生把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。
二、 显示每个学生的总成绩,总成绩大于160的。
SELECT 学科, SUM(成绩) FROM A GROUP BY 学生 HAVING SUM(成绩)>160
此处不能用where来筛选超过160的学生,因为表中不存在这样一条记录。
但是,HAVING子句可以完成筛选并分组,having就是用来分组的咯。