sql GROUP BY子句使用实例

 2023-09-07 阅读 26 评论 0

摘要:GROUP BY子句 GROUP BY子句可以将表的行划分为不同的组。分别总结每个组,这样就可以控制想要看见的详细信息的级别。 语法: [ GROUP BY [ ALL ] group_by_expression[ ,...n ] [ WITH { CUBE | ROLLUP } ] ] 参数说明: ALL:包含所有组和结果集&

GROUP BY子句
GROUP BY子句可以将表的行划分为不同的组。分别总结每个组,这样就可以控制想要看见的详细信息的级别。

语法:
[ GROUP BY [ ALL ] group_by_expression[ ,...n ]
[ WITH { CUBE | ROLLUP }  ]  ]
参数说明:
   ALL:包含所有组和结果集,甚至包含那些任何行都不满足
WHERE子句指定的搜索条件的组和结果集。如果指定了ALL,将对组中不满足搜索条件的汇总列返回空值。不能用CUBE或ROLLUP运算符指定ALL。如果访问远程表的查询中有WHERE子句,则不支持GROUP BY ALL操作。
   group_by_expression:对其执行分组的表达式。
group_by_expression也称为分组列。group_by_expression可以是列或引用列的非聚合表达式。在选择列表内定义的列的别名不能用于指定分组列。对于不包含CUBE或ROLLUP的GROUP BY子句,group_by_expression的项数受查询所涉及的GROUP BY列的大小、聚合列和聚合值的限制。该限制从8060字节的限制开始,对保存中间查询结果所需的中间级工作表有8060字节的限制。如果指定了CUBE或ROLLUP,则最多只能有10个分组表达式。
   CUBE:指定在结果集内不仅包含由
GROUP BY提供的正常行,还包含汇总行。在结果集内返回每个可能的组和子组组合的GROUP BY汇总行。GROUP BY汇总行在结果中显示为NULL,但可用来表示所有值。使用GROUPING函数确定结果集内的空值是否是GROUP BY汇总值。结果集内的汇总行数取决于GROUP BY子句内包含的列数。GROUP BY子句中的每个操作数(列)绑定在分组NULL下,并且分组适用于所有其他操作数(列)。由于CUBE返回每个可能的组和子组组合,因此,不论指定分组列所使用的是什么顺序,行数都相同。
   ROLLUP:指定在结果集内不仅包含由
GROUP BY提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。
使用GROUP BY子句的注意事项。
(1)在SELECT子句的字段列表中,除了聚集函数外,其他所出现的字段一定要在GROUP BY子句中有定义才行。例如“GROUP BY A,B”,那么“SELECT SUM(A),C”就有问题,因为C不在GROUP BY中,但是SUM(A)是可以的。
(2)SELECT子句的字段列表中不一定要有聚集函数,但至少要用到GROUP BY子句列表中的一个项目。例如“GROUP BY A,B,C”,则“SELECTA”是可以的。
(3)在SQL Server中text、ntext和image数据类型的字段不能作为GROUP BY子句的分组依据。
(4)GROUP BY子句不能使用字段别名。
1.按单列进行分组

GROUP BY子句可以基于指定某一列的值将数据集合划分为多个分组,同一组内所有记录在分组属性上具有相同值。

示例:
把“student”表按照“性别”这个单列进行分组。在查询分析器中输入的SQL语句如下:
use student
select  性别

from  student
group  by 性别

实现的过程如图1所示。

图1 “Student”表按“性别”分组
但仍然要强调SELECT子句必须与GROUP BY后的子句或者是分组函数列相一致。
例如,由于下列查询中“姓名”列既不包含在GROUP BY子句中,也不包含在分组函数中,所以是错误的。错误的SQL语句如下:
use  student  select  姓名
,性别 from  student  group  by 性别 


例如,在“grade”表中,按“学期”分组查询。SQL语句如下:
use  studnet  select 学期 from grade  group by 学期
2.按多列进行分组
GROUP BY子句可以基于指定多列的值将数据集合划分为多个分组。
示例:
在“student”表中,按照“性别”和“年龄”列进行分组。在查询分析中输入的SQL语句如下:
use student
select 性别,年龄
from student
group by 性别,年龄
实现的过程如图2所示。

图2  把“student”表按多列进行分组
在“student”表中,首先按照“性别”分组,然后再按照“年龄”分组。
再举一个例子,例如,在“grade”表中,按照“学号”和“课程代号”列进行分组。SQL语句如下:
use student
select 学号,课程代号  from  grade  group by 学号,课程代号
按多列进行分组时有NULL组的是如何处理的。当表按多列进行分组时有NULL组,这时NULL被作为一个特定值处理,就像其他任何值一样。也就是说,如果在某个分组列中存在两个NULL,则按它们有相同的值那样处理,并将它们放在相同的组中。
示例:
在“grade”表中,按“学期”和“课程代号”列进行分组。在查询分析器中输入的SQL语句如下:
use  student
select  学期,课程代号
from grade
group by 学期,课程代号
实现的过程如图3所示。

图3  “grade”表多列查询时的NULL组
3.与聚集函数一起使用
GROUP BY子句是经常与聚集函数一起使用。如果SELECT子句中包含聚集函数,则计算每组的汇总值,当用户指定GROUP BY时,选择列表中任一非聚集表达式内的所有列都应包含在GROUP BY列表中,或者GROUP BY表达式必须与选择列表表达式完全匹配。
示例:
在“student”表中,分别求男女生的平均年龄。在查询分析器中输入的SQL语句如下:
use student
select 性别,avg(年龄) as 平均年龄
from student
group by 性别
实现的过程如图4所示。

图4  求“Student”表中男女生的平均年龄
例如,在“student”表中,分别求有多少个男生和女生。SQL语句如下:
use student
select 性别,count(性别) as 人数  from student group by 性别
说明:关于聚合函数的详细讲解可参阅9.2.1节。
4.与HAVING子句一起使用
HAVING子句对GROUP BY子句选择出来的结果进行再次筛选,最后输出符合HAVING子句中条件的记录。HAVING子句的语法与WHERE子句的语法相类似,惟一不同的是HAVING子句中可以包含聚合函数。
语法:
[HAVING <search_condition>]
参数说明:
<search_condition>:指定组或聚合应满足的搜索条件。当HAVING与GROUP BY ALL一起使用时,HAVING 子句替代ALL。
示例:
在“student”表中,按“性别”分组求平均年龄,并且查询其平均年龄大于21的学生信息。在查询分析器中输入的SQL语句如下:

use student
select  avg(年龄), 性别
from student
group  by 性别
having avg(年龄)>21
实现的过程如图5所示。

图5  男女生中平均年龄大于21的学生信息
示例:
在“grade”表中,按“学期”分组求平均成绩,并且查询“平均成绩”大于93的课程信息。在查询分析器中输入的SQL语句如下:
use    student
select 学期,avg(课程成绩) as 平均成绩
from   grade
group  by 学期
having avg(课程成绩)>93
实现的过程如图6所示。

图6  每个学期平均成绩大于93的课程信息
说明:HAVING查询条件是在进行分组操作之后才应用的;在HAVING子句中不能使用text、image和ntext 数据类型。
5.对统计结果进行排序
统计结果并不能保证结果集内记录按一定顺序排列,如果使用ORDER BY子句,就可以使结果集中的结果按一定的顺序(升序、降序)排序。
示例:
在“student”表中,按“性别”和“年龄”列分组,并按“年龄”列降序排序。在查询分析器中输入的SQL语句如下:
use    student
select 性别,年龄
from  student
group  by 性别,年龄
order by 年龄 desc
实现的过程如图7所示。

图7  对“student”按“年龄”统计并排序
例如,在“grade”表中,按“学号”分组,并按课程的“平均成绩”升序排序。SQL语句如下:
use student
select 学号,avg(课程成绩) as 平均成绩  from grade  group by 学号  order by 平均成绩

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/10739.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息