简介:"Group By"根据字面上的意思理解,就是根据"By"后面指定的规则对数据进行分组(分组就是将一个数据集按照"By"指定的规则分红若干个子数据集),而后再对子数据集进行数据处理。sql
一、下面经过一个实例来了解"Group By"的做用和功能,代码以下:函数
select * from course
这是一个课程明细表,如今有一个报表程序,须要每一个老师的编号,以及每位老师所教的课程总数,下面是解决代码:spa
select tno,COUNT(cname) as courses from course group by tno
这就是我的的理解,上图是经过Group By分组以后的第一组,后面的数据集合包含教师ID为t001的全部行数数据,这个数据集合咱们可使用汇集函数来获取咱们想要的信息,可是没法获取其中的详细的列信息!缘由咱们能够经过上图的结构能够看出!code
ok,经过group by 完成需求!blog
上面的Select指定了两个列,tno包含教师的编号,courses 为计算字段(用Count()函数创建),group by子句指示DBMS按tno排序并分组数据。这就会对每一个tno而不是整个表计算courses一次(也就是说DBMS会对(按照tno排序并分组以后的单个数据子集)进行Count()运算,而不是真个数据集)。排序
二、下面是使用Group By子句须要知道的一些重要的规定class
(1)Group By子句能够包含任意数目的列,于是能够对分组进行嵌套,进行更细致的分组。select
(2)Group By子句中列出的每一列都必须是检索列(或者有效的表达式,注意不能是汇集函数)。若是在SELECT中使用了检索列(或者表达式),则在Group By子句中使用相同的表达式,不能使用别名。数据类型
(3)大多数SQL不容许Group By带有可变长度的数据类型(如文本,text类型)。程序
(4)除汇集计算语句外,SELECT语句中的每一列都必须在Group By中给出。
(5)若是分组列中包含具备Null值的行,则Null将做为一个分组返回,若是列中有多行Null,他们将做为一个分组返回。
(6)Group By必须出如今Where子句以后,Order By子句以前。
(7)若是在Group By子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说,在创建分组时,指定的全部列都一块儿计算(不能从个别的列中取回数据)。
三、Group By All+多个字段,Group By+多个字段
在SQL Server 中Group By All+多个字段和Group By+多个字段在效果是同样的,都是经过多个字段来分组!以下代码:
select * from course
这是一个课程明细表,如今有个报表程序须要展现每一个老师教授的课程(相同的课程)一共教多少个班级,下面是解决代码:
select tno,cname,COUNT(cname) from course group by all tno,cname order by tno
这是我的的理解,上图是经过Group By分组以后的第一组,后面的数据集合包含(教师ID为t001而且课程名称为Oracle)的全部行数数据,这个数据集合咱们可使用汇集函数来获取咱们想要的信息,可是没法获取其中的详细的列信息!缘由咱们能够经过上图的结构能够看出!
ok,解决需求,经过上面的结果图,咱们能够看出,三个老师所教的课程基本都只教一个班,除了t003老师的sql SERVER 2005教了两个班,固然咱们实际的业务中,并不会这样建表,我这边指示为了演示Group By+多个字段能完成的功能,才强行构建这个需求!