zoukankan      html  css  js  c++  java
  • 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也是一样,同时在最后,会将全部的分组聚合。

     如有错误,还请大牛指正

  • 相关阅读:
    6-查看centos中的用户和用户组
    23-python用BeautifulSoup用抓取a标签内所有数据
    22-python爬虫解决gbk乱码问题
    21-py3 发邮件
    20-调用百度AI的文字识别
    6-Ubuntu与Windows不能相互复制
    2018.4.18 Ubuntu 的telnet命令详解
    2018.4.17 java多线程练习二模拟开场仪式进场
    2018.4.16 Java多线程实现龟兔赛跑
    2018.4.15 Mac系统下如何使用StartUml画好需求分析的类图 (同样适用于windows)
  • 原文地址:https://www.cnblogs.com/hack0ne/p/4537319.html
Copyright © 2011-2022 走看看