group by 深入总结(转)
http://www.cnblogs.com/wangtao_20/archive/2011/02/23/1959792.html
一、不兼容的语法问题。
先看使用如下sql:SELECT count(*),town FROM `players` 结果会报错。从这里涉及到sql的一个原则:值的集合与一个行mysql认为是不兼容的。这里,count(*)的结果是一个值。而town列出的结果是很多行,也就是值组成的集合。所以,两者不不兼容的。
而如果加上group by,就不一样了,如下:
SELECT count(*),town FROM `players` group by sex
上面的sql,并没有报错。因为使用了group by子句后,count(*),town所显示的结果不一样了。count((*)是根据group by子句的要求进行聚合,结果是值组成的集合。右边显示对应的城市(虽然不一定正确和得出子句想要的结果,但语法上通过的)。最后,sql所表示的实际意思是:统计出每个性别所对应多少行。
二、更好地理解group by的内部机制
假如语句是 SELECT sex,name FROM `players` GROUP BY sex
结果如下:
name sex
王滔 "空值"
刘惠 女
王小明 男
假如语句是 SELECT name FROM `players` GROUP BY sex
结果如下:
name
王滔
刘惠
王小明
假如语句是 SELECT sex FROM `players` GROUP BY sex,
结果就是:
sex
"空值"
女
男
理解:group by的原理是将其指定列的值一致的行归为一组。那么,空值也归为一组。
实质上,使用了group by,上面三个sql语句原理是一样的,只是select子句告诉mysql需要的取出的列有不同
SELECT sex FROM `players` GROUP BY sex 与 SELECT sex,name FROM `players` GROUP BY sex没什么区别。
因为group by已经指定了操作方式,select需要显示行的那些列,随时指定。可以理解早就按照group by的要求将所有行就已经分组好了,之后根据需要取每行的哪一列的值了。
通俗理解group by:根据group by指定的列,列值如果相同行划分到一组中去。
一直认为,使用group by显示最后的结果应该是下面这样的:
字段值 a组
字段值 a组
字段值 b组
字段值 b组
实际情况却不是这样
先看测试的一个例子
group by指定一个字段:SELECT * FROM `fanwe_goods` GROUP BY cate_id
大致结果显示类似:
cate_id 其他字段....
40 ....
41 ....
46 ....
48 ....
说明,根据类别cate_id进行分组。结果,每个类只显示了一行数据。
group by指定多个字段:SELECT * FROM `fanwe_goods` GROUP BY cate_i,city_id
结果是将多行取出来了(整个表的所有行没有取出)。结果类似:
cate_id city_id
40 16
40 20
41 16
41 20
还有一些行和其他字段的值省略了
看cate_id和city_id的值,都有重复的值。不知道怎么计算的,取出的结果还是有意外。
结论:
1.group by 后面指定的列不止一个。当我使用如下语句时,也出现了多行的结果(将该组的所有行都列出来了):
SELECT * FROM players GROUP BY sex, town
2.假如group by 后面只指定了一列,那么即使一个组有多行值。也不会全部取出,只取出一个。这样的情况,是什么原因?
3.分组后,如果select子句想取出某个字段,那么它不可能将都属于a组的记录都取出来。只是从a组中取出一个代表性的值出来。不知道原因,大概是:已经按照group by的规则进行分组后,如果想取出所有
数据,mysql变得无所适从。group by只有在需要进行统计的的时候非常有效。
使用经验:group by常常跟聚合函数count进行使用,这样实现按照分组进行统计的效果。比如:需要统计每个地方的商品数量。那么就按照地方进行分组(同一个地方的先划到一组中),之后使用统计函数,就
是针对组的成员进行统计了。
进行分组之后的好处,是方便按组别进行统计,并不能实现像上面效果(按组别显示出所有行)。如果不是需要进行统计,使用group by,我认为就没有实际意义,因为此时取出的结果比较意外,并不是自己想
要的。也得不到如下结果:
字段值 a组
字段值 a组
字段值 b组
字段值 b组
group by 深入总结(转)的更多相关文章
- LINQ Group By操作
在上篇文章 .NET应用程序与数据库交互的若干问题 这篇文章中,讨论了一个计算热门商圈的问题,现在在这里扩展一下,假设我们需要从两张表中统计出热门商圈,这两张表内容如下: 上表是所有政区,商圈中的餐饮 ...
- Kafka消费组(consumer group)
一直以来都想写一点关于kafka consumer的东西,特别是关于新版consumer的中文资料很少.最近Kafka社区邮件组已经在讨论是否应该正式使用新版本consumer替换老版本,笔者也觉得时 ...
- LINQ to SQL语句(6)之Group By/Having
适用场景:分组数据,为我们查找数据缩小范围. 说明:分配并返回对传入参数进行分组操作后的可枚举对象.分组:延迟 1.简单形式: var q = from p in db.Products group ...
- 学习笔记 MYSQL报错注入(count()、rand()、group by)
首先看下常见的攻击载荷,如下: select count(*),(floor(rand(0)*2))x from table group by x; 然后对于攻击载荷进行解释, floor(rand( ...
- [备查]使用 SPQuery 查询 "Person or Group" 字段
原文地址:http://www.stum.de/2008/02/06/querying-the-person-or-group-field-using-spquery/ Querying the “P ...
- order by 与 group by 区别
order by 排序查询.asc升序.desc降序 示例: select * from 学生表 order by 年龄 ---查询学生表信息.按年龄的升序(默认.可缺省.从低到高)排列显示 也可以多 ...
- Group by
分组语句必须和聚合函数在一起使用, group by子句负责将数据分成逻辑组,聚合函数对每一组进行统计计算 group by 必须放到 select 语句后面,如果select语句中有where子句, ...
- Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页
GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...
- [LeetCode] Group Shifted Strings 群组偏移字符串
Given a string, we can "shift" each of its letter to its successive letter, for example: & ...
- sql 单个字段去重查询 distinc 和 group by的效率问题
sql 查询 distinc用法 distinct 和group by都需要排序,一样的结果集从执行计划的成本代价来看差距不大,但group by 还涉及到统计,所以应该需要准备工作.所以单纯从等价结 ...
随机推荐
- mysql 阿里内核人员
丁奇 http://dinglin.javaeye.com/ 鸣嵩 @曹伟-鸣嵩 (新浪微博) 彭立勋 http://www.penglixun.com/ 皓庭 http://wqtn22.iteye ...
- .NET基于Eleasticsearch搭建日志系统实战演练
一.需求背景介绍 1.1.需求描述 大家都知道C/S架构模式的客户端应用程序(比如:WinForm桌面应用.WPF.移动App应用程序.控制台应用程序.Windows服务等等)的日志记录都存储在本地客 ...
- Modbus TCP和Modbus Rtu协议的区别 转
http://blog.csdn.net/educast/article/details/9177679 Modbus rtu和Modbus tcp两个协议的本质都是MODBUS协议,都是靠MOD ...
- 利用阿里云提供的镜像快速更换本地的yum源
打开网页:http://mirrors.aliyun.com/ 从“ 文件列表 ”找到自己的系统: Mirror Last update Help CPAN 2015-07-15 15:36:50 ...
- 前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查
AngularJS中的$resource服务相比$http服务更适合与RESTful服务进行交互.本篇后端使用ASP.NET Web API, 前端使用$resource,实现增删改查. 本系列包括: ...
- 利用Ffmpeg获得flv视频缩略图和视频时间的代码
问题描述:获得flv视频的缩略图和视频时间长度 谷歌了半天发现可以使用Ffmpeg获得视频的一些信息,先介绍一下FFMEPG 这里简单说一下:FFmpeg是用于录制.转换和流化音频和视频的完整解决方案 ...
- 百度搜索推出惊雷算法严厉打击刷点击作弊行为-SEO公司分享
百度搜索推出惊雷算法严厉打击刷点击作弊行为 2017年11月20日凌晨,百度搜索引擎发布更新惊雷算法旨在打击刷点击作弊行为. 下面是惊雷算法相关新闻报道: 百度搜索将于11月底推出惊雷算法,严厉打击通 ...
- appstore防代充的一些想法
点击这里可以查看代充相关的报道, 利用苹果商店规则漏洞,出现了一个灰色地下产业链>> 用户点击选择要充值的物品时,先向后台服务器发起一个创建订单号的请求,然后再向appstore发起购买商 ...
- [转]Nginx+mysql+php-fpm负载均衡配置实例
转 : http://www.jbxue.com/article/7923.html 介绍一个nginx.mysql.php-fpm环境下配置负载均衡的例子,有需要的朋友,可以参考下. 系统环境如下: ...
- 数据库实例: STOREBOOK > 用户 > 编辑 用户: SYSMAN
ylbtech-Oracle:数据库实例: STOREBOOK > 用户 > 编辑 用户: SYSMAN 编辑 用户: SYSMAN 1. 一般信息返回顶部 1.1, 1.2, ...