摘自: 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