- 25
- 0
- 约8.46千字
- 约 12页
- 2017-08-10 发布于河南
- 举报
SQL汇总和分组数据
使用聚合函数进行汇总和分组
SQL提供一组聚合函数,它们能够对整个数据集合进行计算,将一组原始数据转换为有用的信息,以便用户使用。例如求成绩表中的总成绩、学生表中平均年龄等。
SQL的聚合函数如表1所示。
表1 聚合函数
聚合函数 支持的数据类型 功 能 描 述 Sum(?) 数字 对指定列中的所有非空值求和 avg(?) 数字 对指定列中的所有非空值求平均值 min(?) 数字、字符、日期 返回指定列中的最小数字、最小的字符串和最早的日期时间 max(?) 数字、字符、日期 返回指定列中的最大数字、最大的字符串和最近的日期时间 count([distinct] *) 任意基于行的数据类型 统计结果集中全部记录行的数量,最多可达2?147?483?647行 count_big([distinct] *) 任意基于行的数据类型 类似于count(?)函数,但因其返回值使用了bigint数据类型,所以最多可以统计2^63-1行 ?
1.SUM(?)函数和AVG(?)函数
两个函数都是对列式数字型的进行计算,只不过SUM(?)是对列求和;而AVG(?)是对列求平均值。
示例:
求“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(?)、AVG(?)和COUNT(?)聚合函数时,可以从列中消除重复的值。DISTINCT关键字和聚合函数使用的格式是:聚合函数名称(DISTINCT 列名)。
示例:
在“grade”表中,统计多少学生参加考试。在查询分析器中输入的SQL语句如下:
use student
select count(学号)
from grade
实现的过程如图6所示。
图6 统计参加考试的学生
从上面的统计结果不难看出,实际上参加考试的学生是学号从B001~B005共5名,其中有重复的学号。这样为了正确统计到底有多少学生参加考试,就必须用到关键字DISTINCT。
示例:
在“grade”表中,统计多少学生参加考试。在查询分析器中输入的SQL语句如下:
use student
select count(dist
原创力文档

文档评论(0)