(注释:以下举例的所有操作内容均根据下图)
统计查询:
统计函数:
例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(*)计算计算机系的学生总数
Selectcount(*) 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”代表查询结果的第二列)