SQL汇总和分组数据
- 格式:doc
- 大小:270.00 KB
- 文档页数:12
使用聚合函数进行汇总和分组
SQL提供一组聚合函数,它们能够对整个数据集合进行计算,将一组原始数据转换为有用的信息,以便用户使用。例如求成绩表中的总成绩、学生表中平均年龄等。
SQL的聚合函数如表1所示。
表1 聚合函数
1.SUM( )函数和A VG( )函数
两个函数都是对列式数字型的进行计算,只不过SUM( )是对列求和;而A VG( )是对列求平均值。
示例:
求“grade”表中每学期的课程成绩的总和。在查询分析器中输入的SQL语句如下:use student
select sum(课程成绩) as 总成绩
from grade
实现的过程如图1所示。
图1 求课程成绩的总和
当与GROUP BY子句一起使用时,每个聚集函数都为每一组生成一个值,而不是对整个表生成一个值。
示例:
在“student”表中,按“性别”分别求年龄的平均值。在查询分析器中输入的SQL语句如下:
use student
select 性别,avg(年龄) as 平均年龄
from student group by 性别
实现的过程如图2所示。
图2 男女生的平均年龄
2.MIN( )函数和MAX( )函数
MIN( )和MAX( )函数分别查询列中的最小值和最大值。但列的数据包含数字、字符或日期/时间信息。MIN( )和MAX( )函数结果与列中数据的数据类型完全相同。
示例:
查询“student”表中最早出生的学生。在查询分析器中输入的SQL语句如下:
use student
select min(出生日期) as 最早出生
from Student
实现的过程结果如图3所示。
图3 学生表中年龄最小的学生信息
下面把GROUP BY子句和MAX( )函数结合使用。
示例:
在“student”表中,按“性别”分别求年龄的最大值。在查询分析器中输入的SQL语句如下:
use student
select 性别, max(年龄) as 最大年龄
from Student
group by 性别
实现的过程如图4所示。
图4 男女生中年龄的最大值
3.COUNT( )函数和COUNT_big( )函数
COUNT( )函数和COUNT_big( )函数两个函数都是对列中数据值的数目进行计数。它们返回的值总是一个整数,不管列的数据类型。
示例:
求“student”表中女生的人数。在查询分析器中输入的SQL语句如下:
use student
select count(年龄) as 女生记录总数
from student
where 性别='女'
实现的过程如图5所示。
图5 “Student”表中女生的记录总数
COUNT(*)就可以求整个表所有的记录数。例如,求“student”表中所有的记录数,SQL语句如下:
use student
select count(*) from student
4.消除重复记录(DISTINCT)
指定DISTINCT关键字不但可以消除查询结果中的重复记录,而且在使用SUM( )、A VG( )和COUNT( )聚合函数时,可以从列中消除重复的值。DISTINCT关键字和聚合函数使用的格式是:聚合函数名称(DISTINCT 列名)。
示例:
在“grade”表中,统计多少学生参加考试。在查询分析器中输入的SQL语句如下:use student
select count(学号)
from grade
实现的过程如图6所示。
图6 统计参加考试的学生
从上面的统计结果不难看出,实际上参加考试的学生是学号从B001~B005共5名,其中有重复的学号。这样为了正确统计到底有多少学生参加考试,就必须用到关键字DISTINCT。
示例:
在“grade”表中,统计多少学生参加考试。在查询分析器中输入的SQL语句如下:use student
select count(distinct 学号)
from grade
实现的过程如图7所示。
图7 使用DISTINCT关键字统计参加考试的学生
注意:当使用DISTINCT关键字时,聚合函数的参数必须是一个简单的列名。
筛选分组结果
用GROUP BY可以实现数据分组操作,但有时用户不需要对数据表中所有的数据进行分组,这时就需要使用HA VING子句来筛选分组。
示例:
在“grade”表中,查询参加同一门课程考试的同学至少两个人的课程成绩总和。在查询分析器中输入的SQL语句如下:
use student
select 课程代号, sum(课程成绩) as 课程总成绩
from grade
group by 课程代号
having count(*)>=2
实现的过程如图1所示。
图1 至少两个人对加同一门考试的课程成绩总和
1.SQL SELECT语句的执行顺序
下面给出SQL SELECT语句的执行顺序。
(1)FROM子句组装来自不同数据源的数据。
(2)WHERE子句基于指定的条件对记录行进行筛选。
(3)GROUP BY子句将数据划分为多个分组。
(4)使用聚集函数进行计算。
(5)使用HA VING子句筛选分组。
(6)计算所有的表达式。
(7)使用ORDER BY对结果集进行排序。
示例:
在“grade”表中,把“学号”内容不为空的记录按照“学号”分组,并且筛选分组结果,选出“课程成绩”大于92的学生信息。在查询分析器中输入的SQL语句如下:use student
select 学号,avg(课程成绩) as 平均成绩
from grade