您的位置:首页 > 数据库

数据库查询之(Ⅱ)统计、分组(排序)查询

2012-10-30 21:39 253 查看

(注释:以下举例的所有操作内容均根据下图)



统计查询:

统计函数:



例1:求学号为S1的学生的总分和平均分

Select sum(score) as TotalSc ore,avg(score) as AveScore from sc where sno=s1

例2:求选修C1课程的最高分和最低分以及两者的差数

Select max(score) as MaxScore ,min(score) as MinScore,max(score)-min(score) as Diff from sc where cno=c1

例3:求学校共有多少个系

Select count(distinct dep) as DeptNum from s


(
注释:distinct的作用是消去重复行)

例4:统计有成绩学生的人数

Select count(score) from sc


(
注释:成绩为0的同学计算在内,没有成绩(即成绩为空)的不计算)

例5:利用特殊函数count(*)计算计算机系的学生总数

Select
count(*) from s where dept=”计算机”

(注释:count(*)用来统计元组的个数,不消除重复行,不允许使用distinct关键字(对比例3))

Group By 子句

将查询结果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同值。

例:查询各个教师的教师号及其任课门数。

Select TNo,count(*) as C_Num from TC group by TNo

(注释:group by子句按照TNo的值分组,所有具有相同TNo的元组为一组,对每一组使用函数Count进行计算,统计出各位教师任课的门数)

如要在分组后还要按照一定条件进行筛选,就要使用Having子句
例:查询选修两门以上课程学生的学号和选课门数

Select sno, count(*) as sc_num from sc group by sno having (count(*)>=2)

(注释:group by子句按sno的值分组,所有具有相同sno的元组为一组。对每一组使用函数count(*)进行计算,统计出每位学生选课的门数。Having子句去掉不满足count(*)>=2的组。)(注意:where子句和having子句都是指明查询条件的语句,但两者面向的对象不同,where面向的对象是“表或视图等等”,而having子句面向的是“分组”)

Order By子句
当需要对查询结果排序时,应该使用Order By子句,该语句必须出现在其它子句之后,排序的方式可以为desc(降序)、asc(升序)。默认为升序

例1:查询选修课程号为c1的学生学号和成绩,并按成绩降序排列

Select sno, score from sc where (cno=c1) order by score desc

例2:查询选修c2、c3、c4或c5课程的学号、课程号和成绩,查询结果按学号升序排列学号相同再按成绩降序排列。

Select sno,cno,score from sc where (cno in(c2,c3,c4,c5)) order by sno,score desc

例3:求选课在3门以上且各门课程均及格的学生的学号及总成绩,结果按总成绩降序排列。

Select sno,sum(score)as TotalScore from sc where (score>=60) group by sno having(count(*)>=3) order by sum(score) desc

(注释:order by sum(score) desc可以换为
order by 2 desc。”2”代表查询结果的第二列)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: