[转]使用GROUP BY WITH ROLLUP改善统计性能

来源:http://blog.csdn.net/id19870510/article/details/6254358

使用 GROUP BY 的 WITH ROLLUP 字句可以检索出更多的分组聚合信息,它不仅仅能像一般的 GROUP BY 语句那样检索出各组的聚合信息,还能检索出本组类的整体聚合信息。

下面我们的例子对比了普通的 GROUP BY 操作和有 WITH ROLLUP 子句的 GROUP BY 操作的不同:

查询表的内容,是雇员的基础信息表:

 1 <a href="http://lib.csdn.net/base/mysql" class=‘replace_word‘ title="MySQL知识库" target=‘_blank‘ style=‘color:#df3434; font-weight:bold;‘>MySQL</a>> select * from employee;
 2   +------+--------+------+------+------+
 3   | id | name | dep | pos | sal |
 4   +------+--------+------+------+------+
 5   | 1 | abcd | 01 | 01 | 1000 |
 6   | 2 | eefs | 01 | 02 | 2000 |
 7   | 3 | micro | 02 | 01 | 1500 |
 8   | 4 | cathey | 02 | 02 | 3000 |
 9   | 5 | amy | 03 | 01 | 2500 |
10   | 6 | lily | 03 | 02 | 2200 |
11   | 7 | bobo | 01 | 01 | 2000 |
12   | 8 | gray | 01 | 02 | 1900 |
13   | 9 | leon | 03 | 02 | 2900 |
14   | 10 | sun | 02 | 02 | 1900 |
15   +------+--------+------+------+------+
16   10 rows in set (0.00 sec)  

普通的 GROUP BY 操作,可以按照部门和职位进行分组,计算每个部门,每个职位的工资平均值:

 1 mysql> select dep,pos,avg(sal) from employee group by dep,pos;
 2 +------+------+-----------+
 3 | dep | pos | avg(sal) |
 4 +------+------+-----------+
 5 | 01 | 01 | 1500.0000 |
 6 | 01 | 02 | 1950.0000 |
 7 | 02 | 01 | 1500.0000 |
 8 | 02 | 02 | 2450.0000 |
 9 | 03 | 01 | 2500.0000 |
10 | 03 | 02 | 2550.0000 |
11 +------+------+-----------+
12 6 rows in set (0.02 sec)

如果我们希望再显示部门的平均值和全部雇员的平均值,普通的 GROUP BY 语句是不能实现的,需要另外执行一个查询操作,或者通过程序来计算。如果使用有 WITH ROLLUP 子句的 GROUP BY 语句,则可以轻松实现这个要求:

 1 mysql> select dep,pos,avg(sal) from employee group by dep,pos with rollup;
 2 +------+------+-----------+
 3 | dep | pos | avg(sal) |
 4 +------+------+-----------+
 5 | 01 | 01 | 1500.0000 |
 6 | 01 | 02 | 1950.0000 |
 7 | 01 | NULL | 1725.0000 |
 8 | 02 | 01 | 1500.0000 |
 9 | 02 | 02 | 2450.0000 |
10 | 02 | NULL | 2133.3333 |
11 | 03 | 01 | 2500.0000 |
12 | 03 | 02 | 2550.0000 |
13 | 03 | NULL | 2533.3333 |
14 | NULL | NULL | 2090.0000 |
15 +------+------+-----------+
16 10 rows in set (0.00 sec)

需要注意的是,使用有 WITH ROLLUP 子句的 GROUP BY 语句时,不能再使用 ORDER BY 语句对结果集进行排序,如果对返回的结果顺序不满意,需要应用程序获得结果后在程序中进行排序。

时间: 2024-09-29 00:53:38

[转]使用GROUP BY WITH ROLLUP改善统计性能的相关文章

大型网站架构演进(3)使用缓存改善网站性能

原文:大型网站架构演进(3)使用缓存改善网站性能 网站的访问也是遵循二八定律:80%的业务访问集中在20%的数据上,如果我们把这20%的数据做缓存,是不是可以减轻数据库的访问压力呢?在项目开发过程中,我们通常将一些基础信息缓存起来,比如商旅系统中的国家,城市,航空公司,机场和航站楼信息. 使用缓存改善网站性能 缓存一般分为两种,本地缓存和分布式缓存,本地缓存指的是应用服务器的本机缓存,分布式缓存一般指专门的缓存服务器,比如memcached和redis.下图是使用缓存后网站的架构: 总结: 使用

mysql group by with rollup

1.普通的 GROUP BY 操作,可以按照部门和职位进行分组,计算每个部门,每个职位的工资平均值: mysql> select dep,pos,avg(sal) from employee group by dep,pos; +------+------+-----------+ | dep | pos | avg(sal) | +------+------+-----------+ | 01 | 01 | 1500.0000 | | 01 | 02 | 1950.0000 | | 02 |

SQL 中GROUP BY 、ROLLUP、CUBE 关系和区别

转自:http://www.cnblogs.com/dyufei/archive/2009/11/12/2573974.html 不言自明,看SQL就完全理解了,不需要过多解释,不错,分享之: ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集. 下面是 CUBE 和 ROLLUP 之间的具体区别: CUBE 生成的结果集显示了所选列中值的所有组合的聚合. ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合. ROLLUP 优点: (1)ROLLUP 返回单个结果集

[转] 利用表达式树构建委托改善反射性能

最近搞一个系统时由于在比较关键地方用到反射了,所以要关注了一下反射的性能问题.搜索一下,不难搜到老赵的这篇文章,下面是一些杂乱的笔记.(建议先看老赵的文章) .Net4.0反射性能改善 看老赵的文章,老赵得到的结果是这样的: 1 00:00:00.0125539 (Directly invoke) 2 00:00:04.5349626 (Reflection invoke) 3 00:00:00.0322555 (Dynamic executor) 而我把代码搞下来自己运行得到这样的结果: 1

FPGA中改善时序性能的方法

本文内容摘自<advanced FPGA design>对应中文版是 <高级FPGA设计,结构,实现,和优化>第一章中的内容 FPGA中改善时序,我相信也是大家最关心的话题之一,在这本书中列举了一些方法供给大家参考. 1,插入寄存器(Add Register Layers),在中文版中被翻译成:添加寄存器层次.即,在关键路径中插入寄存器. 这种方式会增加设计的时滞(clock latency).插入了几个寄存器,结果输出就会延长几个周期,在不违反设计规格(对clock latenc

[聊一聊系列]聊一聊前端速度统计(性能统计)那些事儿

欢迎大家收看聊一聊系列,这一套系列文章,可以帮助前端工程师们了解前端的方方面面(不仅仅是代码): https://segmentfault.com/blog/frontenddriver 上一篇文章我们讨论了,如何进行前端日志打点统计: https://segmentfault.com/a/1190000005861012 这一篇我们来看看如何进行速度统计 网站的速度影响了用户访问网站最初的体验.试想,如果一个用户,在等待了若干秒后,还是停留在白屏的状态,那么他的选择将是离开这个网站.性能统计有

js-JavaScript高级程序设计学习笔记21 改善JavaScript性能的方法

第24章 最佳实践 1.性能 1.避免全局查找 将在一个函数中会用到多次的全局对象保存在局部变量.比如多次使用document.getElement...,可以首先var doc=document,把document对象保存在本地的doc变量中. 2.避免with语句. with会创建自己的作用域,需要额外的作用域链查找 3.避免不必要的属性查找 如果需要多次用到对象属性,应该将其存储在局部变量中. 4.优化循环 减值迭代更快,优化循环体 5.展开循环 循环次数确定时,消除循环更快.Duff装置

GROUP BY...HAVING 组合方法之详解

一.GROUP BY的理解 GROUP BY是SELECT语句的从句,用来指定查询分组条件,主要用来对查询的结果进行分组,相同组合的分组条件在结果集中只显示一行记录.使用GROUP BY从句时候,通过添加聚合函数(主要有COUNT().SUM.MAX().MIN()等)可以使数据聚合. GROUP BY插叙列中使用聚合函数是针对每个分组的.例如: SELECT SUBSTR(A.HYLB_DM,1,2),COUNT(*) FROM DJ_ZT A GROUP BY SUBSTR(A.HYLB_D

[Oracle] Group By 语句的扩展 - Rollup、Cube和Grouping Sets

常常写SQL语句的人应该知道Group by语句的主要使用方法是进行分类汇总,以下是一种它最常见的使用方法(依据部门.职位分别统计业绩): SELECT a.dname,b.job,SUM(b.sal) sum_sal FROM dept a,emp b WHERE a.deptno = b.deptno GROUP BY a.dname,b.job; DNAME JOB SUM_SAL -------------- --------- ---------- SALES MANAGER 2850