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

     如有错误,还请大牛指正

  • 相关阅读:
    学习WWDC的好资源!
    运行 CMD 时,參数加引號常见问题
    FileChannel的深入理解
    C#单例模式的三种写法
    Linux 安装Nginx具体图解教程
    计网面试题
    VS:"64位调试操作花费的时间比预期要长"的一解决途径
    中小型WEB系统权限日志数据表设计
    CDN服务上线,DNSPOD布局云端生态圈
    怎样利用ash监控会话
  • 原文地址:https://www.cnblogs.com/hack0ne/p/4537319.html
Copyright © 2020-2023  润新知