SQL汇总和分组数据

  • 格式:doc
  • 大小:270.00 KB
  • 文档页数:12

下载文档原格式

  / 12
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用聚合函数进行汇总和分组

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