GROUP BY WITH ROLLUP 的一些学习

  今天看了hctf的writeup,发现group by WITH ROLLUP,下面是自己的一些总结

  group by WITH ROLLUP相比group 能检索更多的分组聚合信息,不仅能像group检索出各组的聚合信息,还能检索出本组类的整体聚合信息

1:下面给出group by 和 group by WITH ROLLUP的比较

  1. mysql> 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)  

 2:普通的 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 多元素的知识,先是根据dep分为01,02,03 三个组,然后根据pos,将每个组有聚合,所以会有这样的结果产生,这里只做简略说明,若果不懂,访问这个链接 :http://uule.iteye.com/blog/1569262

3:group by WITH ROLLUP

  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)  

这里可能就有人会有疑问了,为什么数据比原来多了四条,理论上应该只是全部的总结,只会比group by 多一条数据才合理,查了资料才弄明白,对于聚合单数据(group by 后面的变量一个为单数据,多个则为多数据)是适合的,但是在多数据的情况下就不一样了,下面我们分析一下,首先会根据dep变量,将原始数据分为三个01,02,03三个组,从数据表上看,第5,6行是一个聚合,group by WITH ROLLUP会在每个分组后面加上本组类的信息,di7行数据就是5,6行数据聚合所执行avg(sal)所得的结果,依次类推,02,03也是一样,同时在最后,会将全部的分组聚合。

 如有错误,还请大牛指正

原文地址:https://www.cnblogs.com/hack0ne/p/4537319.html