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;
😍