谢丽明 朱少强
【摘 要】SQL Server中的Select语句具有强大的查询统计功能,是SQL Server的最核心的语句。通过子句的添加Select语句功能不断丰富完善,其Group by子句实现了分组统计的功能,本文通过实例探讨了多加入不同的关键字和关键词组拓展它的统计输出形式。
【关键词】SELECT语句;Group子句;分组统计
中图分类号: TP391.1 文献标识码: A 文章编号: 2095-2457(2018)34-0099-003
DOI:10.19694/j.cnki.issn2095-2457.2018.34.040
Analysis of Group Statistics Function of Select Statement in SQL Server
XIE Li-ming ZHU Shao-qiang
(School of Information Engineering,Pingdingshan University,Pingdingshan Henan 467000,China)
【Abstract】Select statement in SQL Server has powerful query statistics function,it is the core statement of SQL Server.Continuously enrich and improve the function of Select sentence by adding clauses,Group by clause realizes the function of grouping statistics.This paper discusses how to expand its statistical output form by adding different keywords and key phrases through examples.
【Key words】SELECT Statement;Group Clause;Grouping Statistics-SQL语言,不但遵循了标准SQL的要求,而且对其功能进行了扩展,使其功能更加完善,操作性能更加优良。T-SQL语言的核心语句是Select语句,貌似简单的一个Select语句能够实现数据管理中要求的查询、统计等多种功能,通过Select子句的变化,Select语句在数据库操作中展现多变的魅力。本文就学生成绩信息管理系统数据库中相关的数据统计汇总操作浅谈Select的分组统计的功能实现。
1 学生成绩信息数据库简介
学生成绩管理系统涉及到学生基本信息、课程基本信息、学生所属院系基本信息和学生选修课程情况,因此学生成绩数据库需建立四个基本表,实例用到了学生表和院系表,其物理结构设计如表1、表2所示。
2 Select语句的分组统计
Select语句实现分组统计功能依赖于它的Group by子句,通过该子句的属性列表中的属性列为依据将相同属性值的数据聚集成组,通过聚合函数进行统计。实现该功能是应注意,在Select的选择列表中的列必须包含在聚合函数或 GROUP BY 子句中。
2.1 单属性的分组统计
分组基于一个属性的分组统计是最简单的分组统计情况,只需根据Group by之后的属性进行分组,同时相应的聚合函数给出统计结果。
例1.SELECT 院系名,COUNT(*) AS '人数'
FROM 学生,院系
WHERE 学生.院系号=院系.院系号
GROUP BY 院系名
查询结果如图1所示。
示例中根据院系名进行分组,统计出每个院系的学生数。
2.2 多属性的分组统计
Group by后的属性超过一个,分组统计根据Group by属性列表按照自右向左顺序实施分组,即首先按照最右属性分组,在同一分组内再按次右属性分组,以此类推。这种分组顺序和Order by排序顺序相反。
例2.SELECT 院系名,性别,COUNT(*) AS '人数'
FROM 学生,院系
WHERE 学生.院系号=院系.院系号
GROUP BY 院系名,性别
查询结果如图2所示。
例3.SELECT 院系名,性别,COUNT(*) AS '人数'
FROM 学生,院系
WHERE 学生.院系号=院系.院系号
GROUP BY 性別,院系名
查询结果如图3所示。
例2和例3的差异就在Group by子句中院系名和性别的顺序。例2中性别居右,首先按男、女分组,分别在“男”和“女”中再区分院系;而例3中相反的结果,先按院系分组,在同一院系中再区分“男”和“女”。
2.3 分组结果再统计
Group by子句中带有With Cube或With Rollup可以对分组结果再统计,实现分组结果分层统计的效果。
例4.SELECT 院系名,性别,COUNT(*) AS '人数'
FROM 学生,院系
WHERE 学生.院系号=院系.院系号
GROUP BY 性别,院系名
WITH CUBE
查询结果如图4所示。
例5.SELECT 院系名,性别,COUNT(*) AS '人数'
FROM 学生,院系
WHERE 学生.院系号=院系.院系号
GROUP BY 院系名,性别
WITH CUBE
查询结果如图5所示。
从例4、例5可以看到,with cube给出了按每个分组属性的层次小计和整体的总计结果,分组依然按照自右向左的原则。
例6.SELECT 院系名,性别,COUNT(*) AS '人数'
FROM 学生,院系
WHERE 学生.院系号=院系.院系号
GROUP BY 性别,院系名
WITH ROLLUP
查询结果如图6所示。
例7.SELECT 院系名,性别,COUNT(*) AS '人数'
FROM 学生,院系
WHERE 学生.院系号=院系.院系号
GROUP BY 院系名,性别
WITH ROLLUP
查询结果如图7所示。
由例6、例7可以看到,虽然使用with rollup也进行了分层统计,但分层统计结果只给出一个属性分组情况。值得注意的时,此时,分组不再是按照Group by子句中属性自右向左的方向分组,而是以相反的顺序进行分组。
3 总结
通过实例的实验分析,显示出SQL Server中Select语句功能的丰富性,仅分组统计就可以变换出多种输出形式;同时,也显示出不同实现方式的差异,提醒使用者在掌握基本原理的基础上多通过实际操作发现T-SQL语句在具体数据库管理系统中的细小差异。
【参考文献】
[1]程志云,张勇,赵艳忠等.数据库原理与SQL Server 2012应用教程[M].机械工业出版社,2018.
[2]郭翠.论SQL Server数据库中Case函数的作用[J].信息与电脑,2018.5.