1
数据库技术及应用
1.8.2.2 5.2.2 分组统计查询
5.2.2 分组统计查询

分组查询主要是指用GROUPBY子句将行划分成较小的组,然后使用聚合函数返回每一组的汇总信息。分组查询一般用来满足统计需求。

1.使用GROUPBY进行分组查询

使用SELECT语句进行数据查询时,可以用GROUPBY子句对某一列数据的值进行分类,形成结果集,然后在结果集的基础上再进行分组。分组可以使同组的数据集中在一起,也可使数据能够分组统计。当SELECT子句后的目标列中有统计函数时,如果查询语句中有分组子句,则统计为分组统计,否则为对整个结果集的统计。GROUPBY子句后可以带上HAVING子句表达组选择条件,组选择条件为带有函数的条件表达式,它决定着整个组记录的取舍条件。GROUPBY子句的语法格式为:

其中,column_name表示列名;ROLLUP表示只返回第一个分组条件指定的列的统计行,若改变列的顺序,就会使返回的结果行数据发生变化;CUBE是ROLLUP的扩展,表示除了返回由GROUPBY子句指定的列外,还返回按组统计的行;关键字ALL一般与WHERE子句的条件一同使用,表示所有被GROUPBY子句分类的数据都将出现在结果集中,即使该列不满足WHERE子句的查询条件。GROUPBY子句通常与统计函数联合使用,如COUNT、SUM等。

【例5-19】查询SC表中不同课程的平均成绩。

(1)启动MicrosofT-SQL Server Management Studio,单击工具栏上的按钮,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)执行以上T-SQL代码命令,查看结果,如图5-20所示。

图5-20 分组统计查询使用(1)

在使用GROUPBY子句时,同样可以与WHERE子句结合使用。

【例5-20】按照学号、课程编号和成绩分组,查询SC表中学生成绩大于80的考试信息。

(1)启动MicrosofT-SQL Server Management Studio,执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)单击工具栏上的按钮,执行以上T-SQL代码命令,查看结果,如图521所示。

2.使用HAVING子句进行分组筛选

HAVING子句相当于一个用于组的WHERE子句,指定了组或聚合的搜索条件。HAVING子句通常与GROUPBY子句一起使用。

图5-21 分组统计查询使用(2)

HAVING子句的语法格式为:

在使用HAVING子句定义搜索条件时,只与组有关,不与单个的数据有关。其使用规则如下:

(1)如果指定了GROUPBY子句,则HAVING子句的搜索条件将应用于GROUP BY子句创建的组。

(2)如果指定了WHERE子句,而没有指定GROUPBY子句,那么HAVING子句的搜索条件将应用于WHERE子句的输出结果集。

(3)如果既没有指定WHERE子句,又没有指定GROUPBY子句,那么HAVING子句的搜索条件将应用于FROM子句的输出结果集。

对于所允许的元素,HAVING子句对GROUPBY子句设定搜索条件的方式,与WHERE子句对SELECT语句设定搜索条件的方式类似,但是在是否包含聚集函数上却不相同。HAVING子句中可以包含聚集函数,WHERE子句不可以,而且HAVING子句中的每个元素都必须出现在SELECT语句的列表中。

【例5-21】按照学号、姓名和系别进行分组,查询Student_info表中管理系、计算机工程系、财经系的学生信息。

(1)启动MicrosofT-SQL Server Management Studio,单击工具栏上的按钮,建立一个新的查询。

(2)在查询编辑窗口中输入如下T-SQL代码:

(3)执行以上T-SQL代码命令,查看结果,如图5-22所示。

图5-22 使用HAVING犌子句

注意:一般情况下,HAVING子句都与GROUPBY子句结合使用。

3.分组查询子句对比

通过以上实例分别介绍了分组查询子句WHERE子句、GROUPBY子句和HAVING子句的应用,从执行结果中可以看出,它们在SELECT语句中的使用是有区别的,如图5-23所示。

图5-23 分组查询子句对比

图523标识了WHERE子句的作用是在对查询结果进行分组前,过滤掉不符合WHERE条件的记录,条件中不能包含聚合函数,使用WHERE条件显示特定的行;GROUPBY子句的作用是对筛选后剩下的记录进行分组处理;而HAVING子句的作用是对分组后的数据集进行再次筛选,去除不符合HAVING条件的行,条件中经常包含聚合函数,使用HAVING条件显示特定的组,也可以使用多个分组标准进行分组。因此WHERE语句在GROUPBY语句之前,SQL会在分组之前计算WHERE语句;而HAVING语句在GROUPBY语句之后,SQL会在分组之后计算HAVING语句。

实战演练——BBS中的数据分组统计查询

按照以下任务要求,使用SELECT语句从BBS数据库中检索数据,并将查询结果以表格的形式输出。具体要求如下:

(1)从发帖信息表(tb_Topic)中查询点击率最高的帖子。

具体操作步骤如下:

步骤1:启动MicrosofT-SQL Server Management Studio。

步骤2:单击工具栏上的按钮,或者执行“文件”→“新建”→“使用当前连接查询”命令,建立一个新的查询。

步骤3:在查询编辑窗口中输入以下T-SQL代码:

步骤4:单击工具栏上的按钮,执行以上TSQL代码命令,查看结果。

(2)在用户信息表(tb_Users)中,统计男、女用户人数。

具体操作步骤如下:

步骤1:启动MicrosofT-SQL Server Management Studio。

步骤2:单击工具栏上的按钮,建立一个新的查询。

步骤3:在查询编辑窗口中输入以下T-SQL代码:

步骤4:单击工具栏上的按钮,执行以上TSQL代码命令,查看结果。

(3)按照用户编号、姓名和电子邮箱进行分组,查询用户信息表(tb_Users)中电子邮箱为163.com的用户信息。

具体操作步骤如下:

步骤1:启动MicrosofT-SQL Server Management Studio。

步骤2:单击工具栏上的按钮,建立一个新的查询。

步骤3:在查询编辑窗口中输入以下T-SQL代码:

步骤4:单击工具栏上的按钮,执行以上TSQL代码命令,查看结果。

(4)按所发帖子的总点击数由高到低列出所发帖子的总点击数超过500的论坛用户编号、姓名和帖子总点击数。

具体操作步骤如下:

步骤1:启动MicrosofT-SQL Server Management Studio。

步骤2:单击工具栏上的按钮,建立一个新的查询。

步骤3:在查询编辑窗口中输入以下T-SQL代码:

步骤4:单击工具栏上的按钮,执行以上TSQL代码命令,查看结果。