对表数据进行检索时,经常需要对结果进行汇总或计算,例如,在学生成绩数据库中求某门课程的总成绩,统计各分数段的人数等。
1.统计函数
统计函数用于计算表中的数据,返回单个计算结果
SUM和AVG函数:分别用于求表达式中所有值项的总和与平均值
--求选修100012课程的学生的平均成绩。 select avg(result_number) from school_result where result_course='100012';
MAX和MIN函数:用于求表达式中所有值得最大值和最小值
--求选修100012课程的学生的最高分和最低分。 select max(result_number) from school_result where result_course='100012';
COUNT函数:用于统计组中满足条件的行数或总行数
--求学生的总人数。 select count(*) from school_students ;
--统计数据库技术及应用课程成绩在85分以上的人数。 select count(*) from school_result where RESULT_NUMBER>=85 and result_course=( select course_id from SCHOOL_COURSE where course_name='数据库技术及应用' ) ;
2.分组
GROUP BY子句用于对表或视图中的数据按字段分组,格式为:
[ GROUP BY [ ALL ] group_by_expression [,…n]
--将数据库成绩表中各专业编号输出。 select result_course from school_result group by result_course;
3.分组筛选
使用group by子句和统计函数对数据进行分组后,还可以使用having子句对分组数据进行进一步的筛选
having子句的查询条件与where子句类似,不同的是having子句可以使用统计函数,而where子句不可以使用统计函数
--查找数据库中平均成绩在85分以上的学生的学号和平均成绩。 select avg(result_number), result_stu from school_result group by result_stu having avg(result_number)>=65;
在select语句中,当where,group by与having子句都被使用时,要注意他们的作用和执行顺序。where用于筛选由from指定的数据对象;group by用于对where的结果进行分组;having则是对group by 子句以后的分组数据进行过滤。
--查找选修课程超过2门且成绩都在80分以上的学生的学号。 select result_stu from school_result where RESULT_NUMBER>=80 group by result_stu having count(result_stu)>=2;
4.排序
在应用中经常要对查询的结果排序输出,例如,学生成绩由高到底排序
升序asc
倒序 desc
默认的是asc
--将20163001专业的学生按出生时间先后排序。 select * from SCHOOL_STUDENTS where stu_class='20163001' order by STU_BIRTHDAY asc;
5.合并
使用union子句可以将两个或多个select查询结果合并成一个结果集
其中:all表示对所有值进行运算,distinct表示去除重复值,默认是all
--把课程和班级合并查询 select * from school_class UNION all select * from school_course;
使用union组合两个查询的结果集的基本规则如下:
1.所有查询中的列数和列的顺序必须相同
2.数据类型必须兼容