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+多个字段能完成的功能,才强行构建这个需求!

时间: 2024-10-11 06:46:29

SQL学习之分组数据Group by的相关文章

TERADATA SQL学习随笔<一>

最近在TERADATA环境学习SQL.在这里记录一下学习中查过的知识点,作为备案. 目录: 关于SQL学习及所用在线数据库 表联合 (join) SQL子查询 在select时创建新字段 (as, case when) 数据分组 (group by + 聚合函数count, sum, avg等) 利用over (partition by)进行数据分组并创建新字段 样本选择 1.关于SQL学习及所用在线数据库 之前有看过一些SQL学习的书.但如果从学习效率来说,跟着书学习SQL,不如直接看生产环境

SQL Server2008 程序设计 汇总 GROUP BY,WITH ROLLUP,WITH CUBE,GROUPING SETS(..)

--SQL Server2008 程序设计 汇总 GROUP BY ,WITH ROLLUP  WITH CUBE  GROUPING SET(..) /******************************************************************************** *主题:SQL Server2008 程序设计 汇总 group by ,WITH ROLLUP  WITH CUBE *说明:本文是个人学习的一些笔记和个人愚见 *      有很多

SQL 学习日志03

添加表内容: insert into table_name (字段1,字段2,...) values (值1,值2,....) 查询表内容: select * from table_name select 字段1,字段2 from table_name select top 10 * from table_name select * from table_name where 字段=值 select * from table_name where 字段<>值 select * from tab

LINQ to SQL语句(6)之Group By/Having

Group By/Having操作符 适用场景:分组数据,为我们查找数据缩小 范围. 说明:分配并返回对传入参数进行分组操作后的可枚举对象.分 组:延迟 1.简单形式: var q = from p in db.Products group p by p.CategoryID into g select g; 语句描述:使用Group By按CategoryID划分产品. 说 明:from p in db.Products 表示从表中将产品对象取出来.group p by p.CategoryI

sql学习笔记1

参考: 1.<SQL学习指南> 2.慕课网,SQL学习基础 提纲: 第二章 创建和使用数据库 2.1 创建MYSQL数据库 2.2 使用mysql命令行工具 2.3 MySQL数据类型 2.3.1 字符型数据 2.3.2 数值型数据 2.3.3 时间数据 2.4 表的创建 2.4.1 第一步:设计 2.4.2 第二步:精华 2.4.3 第三步:构建SQL方案语句 2.5 操作和修改表 2.5.1 插入数据 2.5.2 更新数据 2.5.3 删除数据 2.6 导致错误的语句 2.6.1 主键不唯

Sql学习总结(一)

—周学习总结 1.在建表是定义的数据类型和我们插入数据时数据类型不一致 2.注意join 和 left join在运用中的差别. 3.group by 原则:select 后面的所有列中,没有聚合函数的列,必须出现在group by 后面. 4.当我们在统计排名的时候,如果出现相同的排名要记得使用 with ties. 5.order by 默认升序排序,也可以用ASC标识,降序desc. 6.distinct 去重复 7.批插入 insert into table_name select  

SQL学习之HAVING过滤分组

1.SQL除了能用Group By分组数据之外,SQL还允许过滤分组,规定包括那些分组,排除那些分组.例如,你可能想要列出至少有两个订单的所有顾客.为此,必须基于完整的分组而不是个别的行进行过滤. 基于上面的例子,我们第一时间想到的是通过使用WHERE来过滤数据,拿到我们想要的结果,但是在这个列子中WHERE不能完成任务,因为WHERE过滤指定的是行,而不是分组.事实上,WHERE没有分组的概念. 因此,SQL提供了专门用来过滤分组的类似与WHERE子句的子句,HAVING子句,事实上,几乎所有

SQL学习(时间,存储过程,触发器)

SQL学习 几个操作时间的函数 1 --datapart 获取时间中的年月日时分秒等部分 2 select DATEPART(year,current_timestamp); 3 select DATEPART(DAY,current_timestamp); 4 select DATEPART(MONTH,current_timestamp); 5 6 --dateadd 在相应时间上加上年月日时分秒等 7 select CURRENT_TIMESTAMP,DATEADD(DAY,10,CURR

Oracle之PL/SQL学习笔记之触发器

Oracle之PL/SQL学习笔记之触发器 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行. 即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数.所以运行触发器就叫触发或点火(firing).ORACLE事件指的是对数据库的表进行的INSERT. UPDATE及D