--分组查询
--group by 分组技术
/*
语法:
group by[all] 分组条件表达式
[with {cube | rollup}]
all : 包含所有组和结果,甚至包含不满足where条件的记录
*/
/*
分组规则:
注意:在指定group by语句时,选择列表中任意非聚合表达式(含有聚合函数的表达式)内的所有列都应该包含在gruop by列表中
*/
--简单分组(不包含cube或rollup关键字)
--查询学生表中的年龄并分组计算人数
select Sage,COUNT(Sname) as 人数 from Student
group by Sage
select * from Student
select Sname,COUNT(Sname) as 人数 from Student
group by all Sname
--带有having子句的普通分组查询
/*
having 子句是应用于结果集的附加筛选,用在向使用group by的子句查询中添加数据过滤准则
*/
/*
having语句和where的区别:
where语句是对整表中的数据进行筛选满足条件的行
having语句是对group by 分组查询后产生的组加条件,筛选出满足条件的组
*/
--在SC表中查询选修了两门及以上课程的学生号和选课数
use Student
go
select Sno ,COUNT(Sno) as 选课数
from SC group by(Sno) having COUNT(Sno)>=2
select * from SC
--分组查询(续)
select * from Student
--简单分组查询
--按照年龄将学生分类,并显示各个年龄的学生的人数
select Sage ,COUNT(Sname) from Student
group by Sage
having COUNT(Sname)>1
--with cube 关键字的使用
/*
with cube 关键字的作用:
cube指定在结果集合中不仅包含由group by提供的行,而且还包括“汇总行”。
*/
select Sage ,COUNT(Sname) as 该年龄段的人数 from Student
group by Sage
with cube
--查询SC表中被选修的各门课的平均成绩和选修该门课的人数
select * from SC
--
select Cno ,AVG(Grade) as 平均成绩,COUNT(Sno) as 人数
from SC
group by Cno
with cube
--with rollup 关键字的使用
/*
with rollup 关键字的作用:
rollup指定包括汇总行,但按照层次结构顺序,包括从组内的低级级别到高级级别的所有汇总行
注意:分组的层次顺序会直接影响结果集内生成的行数。
*/
select Cno ,AVG(Grade) as 平均成绩,COUNT(Sno) as 人数
from SC
group by Cno
with rollup --当只有一个分组层次时rollup的作用和cube的作用都相同
select Sage,Ssex ,COUNT(Sname) as 该年龄段的人数 from Student
group by Sage,Ssex
with rollup
--数据汇总(明细汇总)
--compute关键字的作用
/*
在select语句中使用聚合函数查询数据汇总时,没有汇总明细值,而compute关键字可以解决该问题
*/
/*
语法:
compute 聚合函数名(expression)[by expression]
*/
--查询所有学生信息并统计人数
select * from Student compute count (Sno)
--查询所有学生信息,并统计各个年龄段的学生人数
/*
在使用compute by expression时也必须同时使用 order by expression对结果进行排序
且compute和排序所依据的列名必须相同
*/
select * from Student order by Sage compute count(Sno) by Sage(七):分组查询、数据汇总示例
原文:http://blog.csdn.net/yyc1023/article/details/19636189