【数据库】单表查询(2)

数据库查询的单表查询的第二部分

请注意,本文编写于 592 天前,最后修改于 581 天前,其中某些信息可能已经过时。

3、order by子句

用户可以用order by子句对查询结果按照一个或多个属性列的升序(asc)或降序(desc)排序,默认值为升序。

【例】查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。

select Sno,Grade from sc where Cno='3' order by Grade desc;

对于空值,排序时显示的次序由具体系统实现来决定。例如按升序排,含空值的元组最后显示;按降序排,空值的元组则最先显示。(空值大)

【例】查询全体学生情况,查询结果按所在系的系号升序排列,同意系的学生按年龄降序排列。

select * from student order by Sdep,Sage desc;
4、聚集函数

为了进一步方便用户,增强检索功能,SQL提供了许多聚集函数,主要有:

语句含义
count(*)统计元组的个数(有多少行)
count([distinct或all] <列名>)统计一列中值的个数
sum([distinct或all] <列名>)计算一列值的平均值(此列必须是数值型)
AVG([distinct或all] <列名>)计算一列值的平均值(此列必须是数值型)
max([distinct或all] <列名>)求一列值的最大值
min([distinct或all] <列名>)求一列值的最小值

【例】查询学生的总人数。

select count(*) from student;

【例】查询选修了课程的学生人数。

select count(distinct Sno) from sc; 

【例】计算选修1号课程的学生平均成绩。

select avg(Grade) from sc where Cno=1;

【例】查询选修1号课程的学生最高分数。

select max(Grade) from sc where Cno=1;

【例】查询学生20220101选修课程的总学分数。

select sum(Ccredit) from  sc,course where Sno=20220101 and sc.Cno=course.Cno;

当聚集函数遇到空值时,除count(*)外,都跳过空值而只处理非空值。

注意,where子句中是不能用聚集函数作为条件表达式的。聚集函数只能用于select子句和group by中的having子句。

5、group by子句

group by 子句将查询结果按某一列或多列的值分组,值相等的为一组。分组后聚集函数将作用于每一个组,即每一组都有一个函数值。

【例】求各个课程号及相应的选课人数。

select Cno,count(Sno) from sc group by Cno; 

【例】查询选修了三门以上课程的学生学号。

select Sno from sc group by Sno having count(*)>3;

这里用group by子句按Sno进行分组,再用聚集函数count对每一组计数;having短语给出了选择组的条件,只有满足条件的组才会被选出来。

【例】查询平均成绩大于等于90分的学生学号和平均成绩。

select Sno,avg(Grade) from sc group by Sno having avg(Grade)>=90; 

添加新评论

已有 1 条评论