-
1 分组
-
2 分组筛选
SQL统计查询——分组
再次给出讨论背景:

让我们来考虑这样一种查询需要:查询各系的人数。
想象一下这样的场景:全校的人都散落在风雨操场的各个角落里。现在我们要去统计出来每一个系的人数。想想都头大?怎么开始呢?一个一个的找,记清楚上一个是哪个系的?找到一个,就把记忆中这个系的人数调出来累计1?算了吧,不超过100个,估计你就已经在风雨操场中独自凌乱、抓狂!
换一种思路:我们给每一个系划定相应的区域,让各系的同学进入对应的区域;然后在依次去统计各区域的人数。好了,这应该可以统计清楚,圆满交差了!
其实大家可以注意到;上面的解决办法有2个要点,或者2个步骤:
步骤1:给每一个系划定相应的区域,让各系的同学进入对应的区域;
步骤2:依次去统计各区域的人数。
步骤1就是我们常说的分组;如果把每一个人看作是一行记录,那么第2步统计人数就是在统计记录的行数。怎么数行数呢?相信大家都已明了:count函数。所以现在的焦点就是怎么分组。
SQL分组关键字:
group by 按指定的列进行分组
一般的用法:group by 分组依据字段
那么分组依据字段是什么意思呢?就是根据每一行记录在这个字段上的值来决定将这行记录放入哪一个组内。依据字段值相同的放入同一个组。所以统计各系人数可用如下SQL语句实现:
select count(*) from Student group by Sdept
说明:我们来了解一些幕后的事情。这条语句的执行其实正如我们上面再操场里面数人一样,也是分为两个步骤来完成的。
第1:首先对数据进行分组。你可以近似地看作是这样一条语句的执行:
select * from Student group by Sdept
结果可想而知:有多少个系,就有多少个组;每一组内有若干行数据。
第2:对每一个组内的记录进行count运算,你可以近似地看做执行了若干次这样的SQL语句;
select count(*) from 第1组
select count(*) from 第2组
......
select count(*) from 第n组
最后返回n个结果,每一个结果就是对每一个组进行count运算的值。
OK!这就是SQL语句中的分组。
【例1】查询每门课程的课程号及相应的选课人数。
select Cno, count(Sno) from SC group by Cno
注意:分组对投影的影响
在进行分组以后,投影也不再随心所欲!如果一条SQL语句中出现了group by来进行分组,那么在投影字段中(也就是select之后书写的字段)就只能出现两个东西:
1、分组的依据字段;
2、聚合函数。
除此之外,别无其他!否则就会出现语法错误。

