SQL学习之分组数据Group by
简介:"Group By"根据字面上的意思理解,就是根据"By"后面指定的规则对数据进行分组(分组就是将一个数据集按照"By"指定的规则分成若干个子数据集),然后再对子数据集进行数据处理。
1、下面通过一个实例来了解"Group By"的作用和功能,代码如下:
select * from course
这是一个课程明细表,现在有一个报表程序,需要每个老师的编号,以及每位老师所教的课程总数,下面是解决代码:
select tno,COUNT(cname) as courses from course group by tno
这就是个人的理解,上图是通过Group By分组之后的第一组,后面的数据集合包含教师ID为t001的所有行数数据,这个数据集合我们可以使用聚集函数来获取我们想要的信息,但是无法获取其中的详细的列信息!原因我们可以通过上图的结构可以看出!
ok,通过group by 完成需求!
上面的Select指定了两个列,tno包含教师的编号,courses 为计算字段(用Count()函数建立),group by子句指示DBMS按tno排序并分组数据。这就会对每个tno而不是整个表计算courses一次(也就是说DBMS会对(按照tno排序并分组之后的单个数据子集)进行Count()运算,而不是真个数据集)。
2、下面是使用Group By子句需要知道的一些重要的规定
(1)Group By子句可以包含任意数目的列,因而可以对分组进行嵌套,进行更细致的分组。
(2)Group By子句中列出的每一列都必须是检索列(或者有效的表达式,注意不能是聚集函数)。如果在SELECT中使用了检索列(或者表达式),则在Group By子句中使用相同的表达式,不能使用别名。
(3)大多数SQL不允许Group By带有可变长度的数据类型(如文本,text类型)。
(4)除聚集计算语句外,SELECT语句中的每一列都必须在Group By中给出。
(5)如果分组列中包含具有Null值的行,则Null将作为一个分组返回,如果列中有多行Null,他们将作为一个分组返回。
(6)Group By必须出现在Where子句之后,Order By子句之前。
(7)如果在Group By子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(不能从个别的列中取回数据)。
3、Group By All+多个字段,Group By+多个字段
在SQL Server 中Group By All+多个字段和Group By+多个字段在效果是一样的,都是通过多个字段来分组!如下代码:
select * from course
这是一个课程明细表,现在有个报表程序需要展示每个老师教授的课程(相同的课程)一共教多少个班级,下面是解决代码:
select tno,cname,COUNT(cname) from course group by all tno,cname order by tno
这是个人的理解,上图是通过Group By分组之后的第一组,后面的数据集合包含(教师ID为t001并且课程名称为Oracle)的所有行数数据,这个数据集合我们可以使用聚集函数来获取我们想要的信息,但是无法获取其中的详细的列信息!原因我们可以通过上图的结构可以看出!
ok,解决需求,通过上面的结果图,我们可以看出,三个老师所教的课程基本都只教一个班,除了t003老师的sql SERVER 2005教了两个班,当然我们实际的业务中,并不会这样建表,我这边指示为了演示Group By+多个字段能完成的功能,才强行构建这个需求!
- Kafka定时清除过期数据
- 腾讯高级副总裁郭凯天:打造腾讯智库分析互联网产业前沿问题
- Google Chrome 浏览器 开发者工具 使用教程
- 反向代理(Reverse Proxy)及 IIS 7 应用请求路由模块
- 2014腾讯“大数据连接的未来”高峰论坛在京召开
- 工作流、业务流程管理和SOA
- 面向对象设计的SOLID原则
- 用psake来简化自动化脚本的构建
- TESLA V100如何让质疑GPU的流言“失声”
- Web 前端性能优化相关内容解析
- Service Broker 无法工作的问题修复
- .NET代码快速转换成powershell代码
- 网站性能评分工具Yslow 使用教程
- Temp权限引起的WCF问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springboot消息之AmqpAdmin管理组件的使用
- springtboot缓存之@CacheEvict
- vscode下搭建vue.js开发环境(基于最新的@Vue/cli 4.2.2)
- Unrecognised tag: 'snapshotPolicy'
- spinrgboot缓存之缓存抽象(缓存初步体验)
- springboot之快速构建springboot应用
- NLP简报(Issue#4)
- LaTeX常用篇(一)---公式输入
- 几个Python“小伎俩”(续)
- Transformers Assemble(PART III)
- 【python-双指针】pair with target sum
- springboot开发之配置Servlet三大组件(Servlet、Filter、Listener)
- vuejs之v-html
- linux之解决使用VMWare安装centos7后无法联网问题
- c++之引用