group by 和聚合函数
group by 的基本用法
group by做为分组来使用,后面为条件,可以有多个条件,条件相同的为一组,配合聚合函数进行相关统计。在不同数据库中用法稍有不同,这里只测试mysql和oracle。
1.准备好一张数据表:

mysql oracle
2.首先以name为分组条件:
SELECT * FROM person
GROUP BY `name`;
在mysql中执行结果如下:

分析:
在mysql中没有强调select指定的字段必须属于group by后的条件。若符合条件的字段有多个,则只显示第一次出现的字段。比如:以name为dd分组,id为1,2,3,4,5,但只显示1.同理,age也只显示1.
然后,虽然这种查询在语法上通过了,但结果并没有什么意义,因为其他字段并非需要的准确值。这在oracle中就行不通了。
在oracle中执行结果如下:


分析:
oracle指出,select查询字段未包含在group by 的条件中。推测,首先通过select * from person可以看到oracle中id并不是升序,或者说没有默认升序。也就是查询的结果是不确定的,hash?这可能涉及到在磁盘的存储等等,这里不去深究。因此,并不能确认第一次查出来的字段的值,而且分组后不是条件的值被合并后没有意义。
结论:
group by语句中select指定的字段必须是“分组依据字段”。
因此,只能这样查询:
SELECT name FROM person
GROUP BY name;
结果一致:
。
3.以name,age为查询依据,多条件分组
SELECT name,age FROM person
GROUP BY name,age;
结果:


mysql oracle
显然,两组的查询策略是不同的。但最终结果是相同的。都是以条件组合的笛卡尔积。也就是每个条件都一一对应。
分组依据为多条件组合成一个条件,当组合条件相同时为一组。因此,dd:1和dd:2分为两组。
4.添加聚合函数
聚合函数有如下几种:
| 函数 | 作用 | 支持性 |
|---|---|---|
| sum(列名) | 求和 | |
| max(列名) | 最大值 | |
| min(列名) | 最小值 | |
| avg(列名) | 平均值 | |
| first(列名) | 第一条记录 | 仅Access支持 |
| last(列名) | 最后一条记录 | 仅Access支持 |
| count(列名) | 统计记录数 | 注意和count(*)的区别 |
首先,要明白聚合函数的用法。比如,count(列字段值),统计该字段值出现的次数:
SELECT name,COUNT(*)
from person
GROUP BY name;
结果为:
。
分析:
首先进行分组工作,group by name,这时8条数据被分成两组:dd和mm;然后count的作用就是统计每组里面的个数,分别是5和3.
更直观的例子:
SELECT * FROM person;

SELECT count(name) from person;
,count(name)为统计所有的name数量,同样的结果为count(1),count(*).
5.where 和 having
- where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。
- having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。
group by 和聚合函数的更多相关文章
- 关于GROUP BY和聚合函数
可以这样去理解group by和聚合函数 转自 http://www.cnblogs.com/wiseblog/articles/4475936.html 写在前面的话:用了好久group by,今天 ...
- 可以这样去理解group by和聚合函数
写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不过来,为什么不能够select * from Table group by id,为什么一定不能是 ...
- 可以这样去理解group by和聚合函数(转)
http://www.cnblogs.com/wuguanglei/p/4229938.html 写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不 ...
- sql 学习之 group by 及 聚合函数
1.在使用 GROUP BY 子句时,Select列表中的所有列必须是聚合列(SUM,MIN/MAX,AVG等)或是GROUP BY 子句中包括的列.同样,如果在SELECT 列表中使用聚合列,SEL ...
- mysql概要(四)order by ,limit ,group by和聚合函数的特点,子查询
1.order by 默认按升序排列(asc/desc),多字段排序 order by 字段 排序方式,字段2 排序方式,..: 在分组排序中,排序是对分组后的结果进行排序,而不是在组中进行排序. s ...
- group by 和 聚合函数
1.在oracle中 select * from Table group by id 会报错. 会报不是group by 表达式.为什么一定不能是 * ,而必须是分组的列或者某个列的聚合函数. 在my ...
- group by 和 聚合函数的使用
有这样一个表数据: 学生姓名,学生手机号,上课日期,上课科目 科目分: 语文.数学.英语.计算机 要求统计一个这样子的结果: 学生姓名,学生手机号,第一次上课日期,迄今一共上了多少节课,上的最多的科目 ...
- GROUP BY 与聚合函数 使用注意点
表的设计: 表里面的内容: 一:在不使用聚合函数的时候,group by 子句中必须包含所有的列,否则会报错,如下 select name,MON from [测试.] group by name 会 ...
- 一文让你彻底理解group by和聚合函数
知道group by是进行分组查询,但是一直觉得对其理解得不够透彻,在网上扒了一篇文章,我认为写得非常好. 为什么不能够select * from Table group by id,为什么一定不能是 ...
随机推荐
- cocos2d-x 2.2.2 android平台移植
1.完成以上工具的下载安装--cocos2d-x 2.2.2 --eclipse+adt+sdk --ndk 2.创建cocos2d-x工程 在"cocos2d-x-2.2.2\tools\ ...
- SSIS 错误
[OLE DB 源 [1]] 错误: SSIS 错误代码 DTS_E_OLEDBERROR.出现 OLE DB 错误.错误代码: 0x80040E14.已获得 OLE DB 记录.源:"Or ...
- sql语句:插入的时候判断是否有重复项
把t_table1中数据插入到t_table中,同时确保t_table中不会有重复的项 insert into t_table (column1,column2,column3) select co ...
- Knockoutjs 实践入门 (1) 属性绑定
1 是什么? 使用MVVM模式的简单,动态的Javascript UI. 2 优点 声明式绑定 UI 自动更新 依赖追踪 模板化 3 如何使用 & ...
- vs的dll引用机制
vs2012编译的时候,遇到一个问题就是项目A中运行时缺失dll的问题,项目A引用类库B,类库B引用了x,y等dll,编译A项目的时候,出现x没拷贝到bin 目录. 通过跟踪编译输出发现,x没拷贝的原 ...
- 高性能网站架构设计之缓存篇(4)- Redis 主从复制
Redis 的主从复制配置非常容易,但我们先来了解一下它的一些特性. redis 使用异步复制.从 redis 2.8 开始,slave 也会周期性的告诉 master 现在的数据量.可能只是个机制, ...
- Entity FrameWork 中使用Lambda访问数据库性能优化
在使用Entity Framework 访问数据库时,我们经常使用Lambda表达式,但是如果不小心的话,很容易就掉到坑里了.比如下面的例子:用Lambda访问MSSqlServer中的NewsInf ...
- Xamarin 跨移动端开发系列(01) -- 搭建环境、编译、调试、部署、运行
如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的利器啊!好了,废话不多说,就开始吧, ...
- 作业七:团队项目——Alpha版本冲刺阶段-10
部分代码: public void run(){ while (true){ //单击棋子第一下开始闪烁 if (chessManClick){ play[Man].setVisible(false) ...
- ASP.NET-自定义HttpModule与HttpHandler
在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NET与IIS配合工作的机制,在http请求经过一系列处理后,最后到达ASP.NET管道中,这时,就是Http Modules和Ht ...