今天看了hctf的writeup,发现group by WITH ROLLUP,下面是自己的一些总结
group by WITH ROLLUP相比group 能检索更多的分组聚合信息,不仅能像group检索出各组的聚合信息,还能检索出本组类的整体聚合信息
1:下面给出group by 和 group by WITH ROLLUP的比较
- mysql> select * from employee;
- +------+--------+------+------+------+
- | id | name | dep | pos | sal |
- +------+--------+------+------+------+
- | 1 | abcd | 01 | 01 | 1000 |
- | 2 | eefs | 01 | 02 | 2000 |
- | 3 | micro | 02 | 01 | 1500 |
- | 4 | cathey | 02 | 02 | 3000 |
- | 5 | amy | 03 | 01 | 2500 |
- | 6 | lily | 03 | 02 | 2200 |
- | 7 | bobo | 01 | 01 | 2000 |
- | 8 | gray | 01 | 02 | 1900 |
- | 9 | leon | 03 | 02 | 2900 |
- | 10 | sun | 02 | 02 | 1900 |
- +------+--------+------+------+------+
- 10 rows in set (0.00 sec)
2:普通的 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 | 01 | 1500.0000 |
- | 02 | 02 | 2450.0000 |
- | 03 | 01 | 2500.0000 |
- | 03 | 02 | 2550.0000 |
- +------+------+-----------+
- 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
- mysql> select dep,pos,avg(sal) from employee group by dep,pos with rollup;
- +------+------+-----------+
- | dep | pos | avg(sal) |
- +------+------+-----------+
- | 01 | 01 | 1500.0000 |
- | 01 | 02 | 1950.0000 |
- | 01 | NULL | 1725.0000 |
- | 02 | 01 | 1500.0000 |
- | 02 | 02 | 2450.0000 |
- | 02 | NULL | 2133.3333 |
- | 03 | 01 | 2500.0000 |
- | 03 | 02 | 2550.0000 |
- | 03 | NULL | 2533.3333 |
- | NULL | NULL | 2090.0000 |
- +------+------+-----------+
- 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也是一样,同时在最后,会将全部的分组聚合。
如有错误,还请大牛指正